diff --git a/backends/gstreamer/rb-player-gst.c b/backends/gstreamer/rb-player-gst.c
index 2dbf024..55a517e 100644
--- a/backends/gstreamer/rb-player-gst.c
+++ b/backends/gstreamer/rb-player-gst.c
@@ -804,8 +804,8 @@ impl_play (RBPlayer *player, RBPlayerPlayType play_type, gint64 crossfade, GErro
 			e = rb_player_gst_find_element_with_property (mp->priv->audio_sink, "volume");
 			if (e != NULL) {
 				mp->priv->volume_applied = 1;
+				gst_object_unref (e);
 			}
-			gst_object_unref (e);
 
 			if (mp->priv->volume_applied < mp->priv->volume_changed) {
 				float volume = mp->priv->cur_volume * mp->priv->replaygain_scale;
diff --git a/configure.ac b/configure.ac
index 69f7fde..b9283c9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -118,7 +118,7 @@ if test x"$with_gudev" != "xno"; then
 	  use_gudev=yes
 	  AC_SUBST(GUDEV_CFLAGS)
 	  AC_SUBST(GUDEV_LIBS)
-	  AC_DEFINE(HAVE_GUDEV, 1, [something])
+	  AC_DEFINE(HAVE_GUDEV, 1, [Use GUdev for hardware detection])
 	else
 	  use_gudev=no
 	fi
@@ -250,11 +250,6 @@ PKG_CHECK_MODULES(GSTREAMER_0_10, \
 RHYTHMBOX_CFLAGS="$RHYTHMBOX_CFLAGS $GSTREAMER_0_10_CFLAGS"
 RHYTHMBOX_LIBS="$RHYTHMBOX_LIBS $GSTREAMER_0_10_LIBS"
 
-dnl DAAP (iTunes Music Shares)
-AC_ARG_ENABLE(daap,
-	      AC_HELP_STRING([--disable-daap],
-			     [Disable Digital Audio Access Protocol (music sharing) in rhythmbox]))
-
 AC_ARG_WITH(mdns,
    AC_HELP_STRING([--with-mdns=auto|avahi],
    [Select the mDNS/DNS-SD implementation to use (default auto)]),,
@@ -327,22 +322,6 @@ if test x$enable_libnotify = xyes ; then
     AC_SUBST(NOTIFY_LIBS)
 fi
 
-dnl daap support
-if test "x$enable_daap" != "xno"; then
-	if test x"$have_mdns" = xno; then
-		if test "x$enable_daap" = "xyes"; then
-			AC_MSG_ERROR([DAAP support explicitly requested, but no mDNS implementation found.  Install Avahi])
-		fi
-		enable_daap=no
-	else
-		AC_DEFINE(WITH_DAAP_SUPPORT, 1, [Define if DAAP should be enabled])
-		enable_daap="yes"
-		AC_SUBST(MDNS_CFLAGS)
-		AC_SUBST(MDNS_LIBS)
-	fi
-fi
-AM_CONDITIONAL(USE_DAAP, test "x$enable_daap" != "xno")
-
 AC_CHECK_LIB(z, uncompress)
 
 dnl check for libgstcdda, needed to list the audio tracks
@@ -790,6 +769,31 @@ AC_ARG_VAR([MOZILLA_PLUGINDIR],[Where to install the browser plugin to])
 
 AM_CONDITIONAL([ENABLE_BROWSER_PLUGIN], test x$enable_browser_plugin = xyes)
 
+
+dnl ================================================================
+dnl Use libdmapsharing for DAAP?
+dnl ================================================================
+AC_ARG_ENABLE(daap,
+              AC_HELP_STRING([--disable-daap],
+                             [Disable DAAP support]),,
+              enable_daap=auto)
+if test "x$enable_daap" != "xno"; then
+	PKG_CHECK_MODULES(DMAPSHARING, libdmapsharing-1.9 >= 1.9.0.13,
+			  have_libdmapsharing=yes,
+			  have_libdmapsharing=no)
+	if test "x$have_libdmapsharing" = "xno" -a "x$enable_daap" = "xyes"; then
+		AC_MSG_ERROR([DAAP support explicitly requested, but libdmapsharing couldn't be found])
+	fi
+	if test x"$have_libdmapsharing" = "xyes"; then
+		AC_DEFINE(HAVE_LIBDMAPSHARING, 1, [Define if libdmapsharing support is enabled])
+	fi
+fi
+
+AM_CONDITIONAL(USE_LIBDMAPSHARING, test x"$have_libdmapsharing" = "xyes")
+
+AC_SUBST(DMAPSHARING_CFLAGS)
+AC_SUBST(DMAPSHARING_LIBS)
+
 dnl ================================================================
 dnl end-game
 dnl ================================================================
@@ -925,7 +929,7 @@ elif test x"$have_libnautilus_burn" != xno; then
 else
 	AC_MSG_NOTICE([   CD burning support disabled])
 fi
-if test x"$enable_daap" = xyes; then
+if test x"$have_libdmapsharing" = xyes; then
 	AC_MSG_NOTICE([** DAAP (music sharing) support is enabled])
 else
 	AC_MSG_NOTICE([   DAAP (music sharing) support is disabled])
diff --git a/lib/libmediaplayerid/mpid-files.c b/lib/libmediaplayerid/mpid-files.c
index 5b56ed9..a5452c1 100644
--- a/lib/libmediaplayerid/mpid-files.c
+++ b/lib/libmediaplayerid/mpid-files.c
@@ -80,7 +80,7 @@ mpid_find_and_read_device_file (MPIDDevice *device, const char *device_file)
 		char *path;
 
 		filename = g_strdup_printf ("%s.mpi", device_file);
-		path = g_build_filename (data_dirs[i], "media-player-id", filename, NULL);
+		path = g_build_filename (data_dirs[i], "media-player-info", filename, NULL);
 		g_free (filename);
 		if (g_file_test (path, G_FILE_TEST_EXISTS)) {
 			device->source = MPID_SOURCE_SYSTEM;
@@ -88,6 +88,7 @@ mpid_find_and_read_device_file (MPIDDevice *device, const char *device_file)
 			g_free (path);
 			return;
 		}
+		g_free (path);
 	}
 
 	/* device info file is missing */
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 1f599f2..7d01221 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -43,7 +43,7 @@ SUBDIRS += cd-recorder
 endif # HAVE_NAUTILUS_BURN
 endif # HAVE_LIBBRASERO_MEDIA
 
-if USE_DAAP
+if USE_LIBDMAPSHARING
 SUBDIRS += daap
 endif
 
diff --git a/plugins/artdisplay/artdisplay/CoverArtDatabase.py b/plugins/artdisplay/artdisplay/CoverArtDatabase.py
index b71676d..219fe9c 100644
--- a/plugins/artdisplay/artdisplay/CoverArtDatabase.py
+++ b/plugins/artdisplay/artdisplay/CoverArtDatabase.py
@@ -32,6 +32,8 @@ import itertools
 import gobject
 
 from PodcastCoverArtSearch import PodcastCoverArtSearch
+from DiscogsCoverArtSearch import DiscogsCoverArtSearch
+from MusicBrainzCoverArtSearch import MusicBrainzCoverArtSearch
 from EmbeddedCoverArtSearch import EmbeddedCoverArtSearch
 
 from urllib import unquote
@@ -46,7 +48,7 @@ except:
 	from LocalCoverArtSearch import LocalCoverArtSearch
 
 ART_SEARCHES_LOCAL = [LocalCoverArtSearch, EmbeddedCoverArtSearch]
-ART_SEARCHES_REMOTE = [PodcastCoverArtSearch]
+ART_SEARCHES_REMOTE = [PodcastCoverArtSearch, MusicBrainzCoverArtSearch, DiscogsCoverArtSearch]
 OLD_ART_FOLDER = '~/.gnome2/rhythmbox/covers'
 
 ART_FOLDER = os.path.join(rb.user_cache_dir(), 'covers')
diff --git a/plugins/artdisplay/artdisplay/DiscogsCoverArtSearch.py b/plugins/artdisplay/artdisplay/DiscogsCoverArtSearch.py
new file mode 100644
index 0000000..2051e09
--- /dev/null
+++ b/plugins/artdisplay/artdisplay/DiscogsCoverArtSearch.py
@@ -0,0 +1,280 @@
+# -*- Mode: python; coding: utf-8; tab-width: 8; indent-tabs-mode: t; -*-
+#
+# Copyright (C) 2009 Jonathan Matthew  <jonathan@d14n.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# The Rhythmbox authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and Rhythmbox. This permission is above and beyond the permissions granted
+# by the GPL license by which Rhythmbox is covered. If you modify this code
+# you may extend this exception to your version of the code, but you are not
+# obligated to do so. If you do not wish to do so, delete this exception
+# statement from your version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
+
+import urllib
+import xml.dom.minidom as dom
+import re
+import StringIO
+import gzip
+import time
+import httplib
+import threading
+
+import rb
+import rhythmdb
+
+from rb.stringmatch import string_match
+
+# match quality parameters
+DEFAULT_MATCH = 0.35		# used when the item doesn't have the match property
+MINIMUM_MATCH = 0.5		# ignore results below this quality
+REJECT_MATCH = 0.3		# reject results if either match strength is below this
+
+# list of format types to avoid if possible
+# these tend to have poor or non-square cover art
+BAD_FORMAT_LIST = ('Cassette', 'VHS', 'DVD', 'CDr', 'Promo', 'White Label')
+BAD_FORMAT_PENALTY = -0.05
+# slight penalty for vinyl in order to get CD cover images where possible.
+# there tends to be slightly better coverage for CDs.
+VINYL_PENALTY = -0.02
+
+# this API key belongs to jonathan@d14n.org ('qwe' on discogs)
+# and was generated specifically for this use
+API_KEY = '45be40f6dd'
+
+DISC_NUMBER_REGEXS = (
+	"\(disc *[0-9]+\)",
+	"\(cd *[0-9]+\)",
+	"\[disc *[0-9]+\]",
+	"\[cd *[0-9]+\]",
+	" - disc *[0-9]+$",
+	" - cd *[0-9]+$",
+	" disc *[0-9]+$",
+	" cd *[0-9]+$"
+)
+
+last_poke = 0
+
+class PokeThread (threading.Thread):
+	def __init__(self):
+		threading.Thread.__init__(self)
+
+	def run(self):
+		c = httplib.HTTPConnection('www.discogs.com')
+		c.connect()
+		c.request('GET', '/release/1?f=xml&api_key=' + API_KEY, headers = { 'Accept-Encoding': 'gzip' })
+		c.getresponse()
+		c.close()
+
+class DiscogsCoverArtSearch (object):
+	def __init__(self):
+		pass
+
+	def __poke(self):
+		global last_poke
+		# an oddity here is that discogs claims to require the 'accept-encoding: gzip'
+		# header in all requests, but after the first, it seems to stop checking.
+		# this works out pretty well for us, because the gvfs http backend doesn't send that
+		# header, but we can understand the responses.
+
+		# assuming it's going to forget after a while, we'll just poke it every hour or so.
+		# this probably actually depends on IP address more than anything else, but we
+		# don't really have the ability to determine when that changes.
+		if time.time() < (last_poke + 3600.0):
+			return
+
+		last_poke = time.time()
+		poker = PokeThread()
+		poker.start()
+
+	def __decompress(self, data):
+		sz = gzip.GzipFile(mode = 'r', fileobj = StringIO.StringIO(data))
+		return sz.read()
+
+	def __search_cb (self, data, (artist, album)):
+		if data is None:
+			print "search returned nothing"
+			self.callback (self, self.entry, [], *self.callback_args)
+			return
+
+		try:
+			parsed = dom.parseString(self.__decompress(data))
+		except Exception, e:
+			print "error processing response data: %s" % e
+			self.callback (self, self.entry, [], *self.callback_args)
+			return
+
+		# probably check for exact matches?
+
+		# track best combined and album matches separately
+		# (best album match works pretty well for multi-artist albums)
+		best_match = 0.0
+		best_id = None
+		best_album_id = None
+		best_album_match = 0.0
+
+		# look for releases that sort of match
+		for r in parsed.getElementsByTagName('result'):
+
+			# check it's a release
+			if r.attributes['type'].value != u'release':
+				continue
+
+			# split into artist and album, match against the search terms
+			titletag = r.getElementsByTagName('title')[0]
+			title = titletag.firstChild.data
+			(rel_artist, rel_album) = title.split(" - ", 1)
+
+			# calculate the release format penalty
+			# we rely on the format descriptor appearing somewhere in the freeform
+			# 'summary' tag.  we don't care where.
+			match_penalty = 0.0
+			summary = r.getElementsByTagName('summary')[0].firstChild.data
+			for badformat in BAD_FORMAT_LIST:
+				if summary.find(badformat) != -1:
+					match_penalty = BAD_FORMAT_PENALTY
+
+			# vinyl penalty only applies if the other one doesn't
+			if match_penalty > -0.01 and summary.find('Vinyl') != -1:
+				match_penalty = VINYL_PENALTY
+
+
+			# search result URLs include artist/title slugs, so they don't work with API requests
+			# the release ID is the last path fragment.
+			this_url = r.getElementsByTagName('uri')[0].firstChild.data
+			this_release_id = this_url.split('/')[-1]
+
+			artist_match = string_match(artist, rel_artist)
+			album_match = string_match(album, rel_album)
+			# this probably isn't a good way to combine matches
+			this_match = ((artist_match + album_match) / 2) + match_penalty
+
+			# is this the new best match?
+			if album_match < REJECT_MATCH or artist_match < REJECT_MATCH:
+				print "result \"%s\" rejected (%f, %f)" % (title, album_match, artist_match)
+			elif this_match > best_match:
+				best_id = this_release_id
+				best_match = this_match
+				print "result \"%s\" is the new best match (%f)" % (title, this_match)
+			else:
+				print "result \"%s\" discarded, %f < %f" % (title, this_match, best_match)
+
+			# is this the new best album match?
+			album_match = album_match + match_penalty
+			if album_match > best_album_match:
+				print "result \"%s\" is the new best album match (%f)" % (title, album_match)
+				best_album_match = album_match
+				best_album_id = this_release_id
+
+		# figure out if we got a result good enough to use
+		fetch_id = None
+		if best_match > MINIMUM_MATCH:
+			print "best result has match strength %f, fetching release %s" % (best_match, best_id)
+			fetch_id = best_id
+		elif best_album_match > MINIMUM_MATCH:
+			print "best album result has match strength %f, fetching release %s" % (best_album_match, best_album_id)
+			fetch_id = best_album_id
+		else:
+			print "no suitable results found"
+
+		# if we did, get the release info, which contains the image URLs
+		if fetch_id is not None:
+			xml_url = "http://www.discogs.com/release/%s?f=xml&api_key=%s" % (fetch_id, API_KEY)
+			loader = rb.Loader()
+			loader.get_url(xml_url, self.__get_release_cb)
+		else:
+			self.callback (self, self.entry, [], *self.callback_args)
+
+
+	def __get_release_cb (self, data):
+		if data is None:
+			print "release returned nothing"
+			self.callback (self, self.entry, [], *self.callback_args)
+			return
+
+		try:
+			parsed = dom.parseString(self.__decompress(data))
+		except Exception, e:
+			print "error processing response data: %s" % e
+			self.callback (self, self.entry, [], *self.callback_args)
+			return
+
+		# find image URLs.  don't think there's much point using secondary images.
+		image_urls = []
+		for tag in parsed.getElementsByTagName('image'):
+			type = tag.attributes['type'].value
+			if type != 'primary':
+				continue
+
+			url = tag.attributes['uri'].value
+			url.strip()
+			if url != "":
+				print "found image url: %s" % url
+				image_urls.append(url)
+
+		self.callback (self, self.entry, [image_urls], *self.callback_args)
+
+
+
+	def search (self, db, entry, is_playing, callback, *args):
+		self.entry = entry
+		self.callback = callback
+		self.callback_args = args
+
+		artist = db.entry_get (entry, rhythmdb.PROP_ARTIST)
+		if artist == _("Unknown"):
+			artist = ""
+
+		album = db.entry_get (entry, rhythmdb.PROP_ALBUM)
+		if album == _("Unknown"):
+			album = ""
+
+		# Remove variants of Disc/CD [1-9] from album title before search
+		orig_album = album
+		for exp in DISC_NUMBER_REGEXS:
+			p = re.compile (exp, re.IGNORECASE)
+			album = p.sub ('', album)
+
+		album.strip()
+
+		if (artist, album) == ("", ""):
+			print "can't search: no artist or album"
+			callback (self, entry, None, *args)
+			return
+
+		# trick discogs into handling requests without 'accept-encoding: gzip'
+		self.__poke()
+
+		print "searching for (%s, %s)" % (artist, album)
+		terms = artist + " " + album
+		url = "http://www.discogs.com/search?type=all&f=xml&q=%s&api_key=%s" % (urllib.quote_plus(terms), API_KEY)
+
+		loader = rb.Loader()
+		loader.get_url(url, self.__search_cb, (artist, album))
+
+
+	def search_next (self):
+		return False
+
+	def get_result_pixbuf (self, search_results):
+		return None
+
+	def get_best_match_urls (self, search_results):
+		if search_results == []:
+			return []
+		return search_results[0]
+
+
diff --git a/plugins/artdisplay/artdisplay/Makefile.am b/plugins/artdisplay/artdisplay/Makefile.am
index 58db39d..c3b3c7f 100644
--- a/plugins/artdisplay/artdisplay/Makefile.am
+++ b/plugins/artdisplay/artdisplay/Makefile.am
@@ -7,6 +7,8 @@ plugin_PYTHON = 			\
 	LocalCoverArtSearch.py		\
 	LocalCoverArtSearchGIO.py	\
 	CoverArtDatabase.py		\
+	DiscogsCoverArtSearch.py	\
+	MusicBrainzCoverArtSearch.py	\
 	__init__.py
 
 # the amazon cover art search no longer works
diff --git a/plugins/artdisplay/artdisplay/MusicBrainzCoverArtSearch.py b/plugins/artdisplay/artdisplay/MusicBrainzCoverArtSearch.py
new file mode 100644
index 0000000..4583ee0
--- /dev/null
+++ b/plugins/artdisplay/artdisplay/MusicBrainzCoverArtSearch.py
@@ -0,0 +1,106 @@
+# -*- Mode: python; coding: utf-8; tab-width: 8; indent-tabs-mode: t; -*-
+#
+# Copyright (C) 2009 Jonathan Matthew  <jonathan@d14n.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# The Rhythmbox authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and Rhythmbox. This permission is above and beyond the permissions granted
+# by the GPL license by which Rhythmbox is covered. If you modify this code
+# you may extend this exception to your version of the code, but you are not
+# obligated to do so. If you do not wish to do so, delete this exception
+# statement from your version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
+
+import urllib
+import xml.dom.minidom as dom
+
+import rb
+import rhythmdb
+
+# musicbrainz URLs
+MUSICBRAINZ_RELEASE_URL = "http://musicbrainz.org/ws/1/release/%s?type=xml"
+MUSICBRAINZ_RELEASE_PREFIX = "http://musicbrainz.org/release/"
+MUSICBRAINZ_RELEASE_SUFFIX = ".html"
+
+# Amazon URL bits
+AMAZON_IMAGE_URL = "http://images.amazon.com/images/P/%s.01.LZZZZZZZ.jpg"
+
+class MusicBrainzCoverArtSearch (object):
+
+	def __init__(self):
+		pass
+
+	def __get_release_cb (self, data):
+		if data is None:
+			print "musicbrainz release request returned nothing"
+			self.callback(self, self.entry, [], *self.callback_args)
+			return;
+
+		try:
+			parsed = dom.parseString(data)
+
+			# just look for an ASIN tag
+			asin_tags = parsed.getElementsByTagName('asin')
+			if len(asin_tags) > 0:
+				asin = asin_tags[0].firstChild.data
+
+				print "got ASIN %s" % asin
+				image_url = AMAZON_IMAGE_URL % asin
+
+				self.callback(self, self.entry, [image_url], *self.callback_args)
+			else:
+				print "no ASIN for this release"
+		except Exception, e:
+			print "exception parsing musicbrainz response: %s" % e
+			self.callback(self, self.entry, [], *self.callback_args)
+
+	def search (self, db, entry, is_playing, callback, *args):
+
+		self.callback = callback
+		self.callback_args = args
+		self.entry = entry
+
+		# if we've got an album ID, we can get the album info directly
+		album_id = db.entry_get(entry, rhythmdb.PROP_MUSICBRAINZ_ALBUMID)
+		if album_id != "":
+			# these sometimes look like full URLs, sometimes not
+			if album_id.startswith(MUSICBRAINZ_RELEASE_PREFIX):
+				album_id = album_id[len(MUSICBRAINZ_RELEASE_PREFIX):]
+
+			if album_id.endswith(MUSICBRAINZ_RELEASE_SUFFIX):
+				album_id = album_id[:-len(MUSICBRAINZ_RELEASE_SUFFIX)]
+
+			print "stripped release ID: %s" % album_id
+
+			url = MUSICBRAINZ_RELEASE_URL % (album_id)
+			loader = rb.Loader()
+			loader.get_url(url, self.__get_release_cb)
+			return
+
+		# otherwise, maybe we can search for the album..
+
+		# nothing to do
+		callback (self, entry, [], *args)
+
+	def search_next (self):
+		return False
+
+	def get_result_pixbuf (self, search_results):
+		return None
+
+	def get_best_match_urls (self, search_results):
+		return search_results
+
diff --git a/plugins/daap/Makefile.am b/plugins/daap/Makefile.am
index 90935ee..3740901 100644
--- a/plugins/daap/Makefile.am
+++ b/plugins/daap/Makefile.am
@@ -6,34 +6,29 @@ plugin_LTLIBRARIES = libdaap.la
 libdaap_la_SOURCES = \
 	rb-daap-plugin.c			\
 	rb-daap-plugin.h			\
-	rb-daap-source.c			\
-	rb-daap-source.h			\
+	rb-daap-record.c			\
+	rb-daap-record.h			\
+	rb-daap-record-factory.c		\
+	rb-daap-record-factory.h		\
 	rb-daap-sharing.c			\
 	rb-daap-sharing.h			\
-	rb-daap-share.c				\
-	rb-daap-share.h				\
-	rb-daap-structure.c			\
-	rb-daap-structure.h 			\
-	rb-daap-mdns-publisher.h		\
-	rb-daap-mdns-browser.h			\
-	rb-daap-connection.c			\
-	rb-daap-connection.h			\
-	rb-daap-hash.c				\
-	rb-daap-hash.h				\
+	rb-daap-source.c			\
+	rb-daap-source.h			\
 	rb-daap-src.c				\
 	rb-daap-src.h				\
 	rb-daap-dialog.c			\
 	rb-daap-dialog.h			\
-	rb-daap-mdns-avahi.c			\
-	rb-daap-mdns-avahi.h			\
-	rb-daap-mdns-publisher-avahi.c		\
-	rb-daap-mdns-browser-avahi.c		\
+	rb-dmap-db-adapter.c                    \
+	rb-dmap-db-adapter.h                    \
+	rb-dmap-container-db.c                  \
+	rb-dmap-container-db.h                  \
 	$(NULL)
 
 libdaap_la_LDFLAGS = $(PLUGIN_LIBTOOL_FLAGS)
 libdaap_la_LIBTOOLFLAGS = --tag=disable-static
 libdaap_la_LIBADD = 					\
 	$(top_builddir)/shell/librhythmbox-core.la	\
+	$(DMAPSHARING_LIBS)                             \
 	$(DBUS_LIBS)					\
 	$(MDNS_LIBS)
 
@@ -58,6 +53,7 @@ INCLUDES = 						\
 	-DPIXMAP_DIR=\""$(datadir)/pixmaps"\"		\
 	-DSHARE_DIR=\"$(pkgdatadir)\"                   \
 	-DDATADIR=\""$(datadir)"\"			\
+	$(DMAPSHARING_CFLAGS)				\
 	$(MDNS_CFLAGS)					\
 	$(RHYTHMBOX_CFLAGS)				\
 	$(DBUS_CFLAGS)					\
@@ -87,7 +83,7 @@ plugin_DATA = 			\
 	$(NULL)
 
 EXTRA_DIST = 			\
-	$(gtkbuilder_DATA)		\
+	$(gtkbuilder_DATA)	\
 	$(uixml_DATA)		\
 	$(plugin_in_files)	\
 	$(NULL)
diff --git a/plugins/daap/rb-daap-connection.c b/plugins/daap/rb-daap-connection.c
deleted file mode 100644
index 1237a47..0000000
--- a/plugins/daap/rb-daap-connection.c
+++ /dev/null
@@ -1,1876 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- *  Implementation of DAAP (iTunes Music Sharing) hashing, parsing, connection
- *
- *  Copyright (C) 2004-2005 Charles Schmidt <cschmidt2@emich.edu>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The Rhythmbox authors hereby grant permission for non-GPL compatible
- *  GStreamer plugins to be used and distributed together with GStreamer
- *  and Rhythmbox. This permission is above and beyond the permissions granted
- *  by the GPL license by which Rhythmbox is covered. If you modify this code
- *  you may extend this exception to your version of the code, but you are not
- *  obligated to do so. If you do not wish to do so, delete this exception
- *  statement from your version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <math.h>
-#ifdef HAVE_LIBZ
-#include <zlib.h>
-#endif
-
-#include <glib/gi18n.h>
-#include <gdk/gdk.h>
-
-#include <libsoup/soup.h>
-
-#include "rb-daap-hash.h"
-#include "rb-daap-connection.h"
-#include "rb-daap-structure.h"
-#include "rb-marshal.h"
-
-#include "rb-debug.h"
-#include "rb-util.h"
-
-#define RB_DAAP_USER_AGENT "iTunes/4.6 (Windows; N)"
-
-#define ITUNES_7_SERVER "iTunes/7"
-
-static void      rb_daap_connection_dispose      (GObject *obj);
-static void      rb_daap_connection_set_property (GObject *object,
-						  guint prop_id,
-						  const GValue *value,
-						  GParamSpec *pspec);
-static void      rb_daap_connection_get_property (GObject *object,
-						  guint prop_id,
-						  GValue *value,
-						  GParamSpec *pspec);
-
-static gboolean rb_daap_connection_do_something  (RBDAAPConnection *connection);
-static void     rb_daap_connection_state_done    (RBDAAPConnection *connection,
-						  gboolean           result);
-
-static gboolean emit_progress_idle (RBDAAPConnection *connection);
-
-G_DEFINE_TYPE (RBDAAPConnection, rb_daap_connection, G_TYPE_OBJECT)
-
-#define RB_DAAP_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RB_TYPE_DAAP_CONNECTION, RBDAAPConnectionPrivate))
-
-typedef void (* RBDAAPResponseHandler) (RBDAAPConnection *connection,
-					guint status,
-					GNode *structure);
-
-struct RBDAAPConnectionPrivate {
-	char *name;
-	gboolean password_protected;
-	char *username;
-	char *password;
-	char *host;
-	guint port;
-
-	gboolean is_connected;
-	gboolean is_connecting;
-
-	SoupSession *session;
-	SoupURI *base_uri;
-	gchar *daap_base_uri;
-
-	gdouble daap_version;
-	guint32 session_id;
-	gint revision_number;
-
-	gint request_id;
-	gint database_id;
-
-	guint reading_playlist;
-	GSList *playlists;
-	GHashTable *item_id_to_uri;
-
-	RhythmDB *db;
-	RhythmDBEntryType db_type;
-
-	RBDAAPConnectionState state;
-	RBDAAPResponseHandler response_handler;
-	gboolean use_response_handler_thread;
-	float progress;
-
-	guint emit_progress_id;
-	guint do_something_id;
-
-	gboolean result;
-	char *last_error_message;
-};
-
-enum {
-	PROP_0,
-	PROP_DB,
-	PROP_NAME,
-	PROP_ENTRY_TYPE,
-	PROP_PASSWORD_PROTECTED,
-	PROP_HOST,
-	PROP_PORT,
-};
-
-enum {
-	AUTHENTICATE,
-	CONNECTING,
-	CONNECTED,
-	DISCONNECTED,
-	OPERATION_DONE,
-	LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL] = { 0, };
-
-static void
-rb_daap_connection_finalize (GObject *object)
-{
-	RBDAAPConnection *connection;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (RB_IS_DAAP_CONNECTION (object));
-
-	connection = RB_DAAP_CONNECTION (object);
-
-	g_return_if_fail (connection->priv != NULL);
-
-	rb_debug ("Finalize");
-
-	G_OBJECT_CLASS (rb_daap_connection_parent_class)->finalize (object);
-}
-
-static void
-rb_daap_connection_class_init (RBDAAPConnectionClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-	object_class->finalize	   = rb_daap_connection_finalize;
-	object_class->dispose       = rb_daap_connection_dispose;
-	object_class->set_property = rb_daap_connection_set_property;
-	object_class->get_property = rb_daap_connection_get_property;
-
-	g_type_class_add_private (klass, sizeof (RBDAAPConnectionPrivate));
-
-	g_object_class_install_property (object_class,
-					 PROP_DB,
-					 g_param_spec_object ("db",
-							      "RhythmDB",
-							      "RhythmDB object",
-							      RHYTHMDB_TYPE,
-							      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-	g_object_class_install_property (object_class,
-					 PROP_ENTRY_TYPE,
-					 g_param_spec_boxed ("entry-type",
-							     "entry type",
-							     "RhythmDBEntryType",
-							     RHYTHMDB_TYPE_ENTRY_TYPE,
-							     G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-
-	g_object_class_install_property (object_class,
-					 PROP_PASSWORD_PROTECTED,
-					 g_param_spec_boolean ("password-protected",
-							       "password protected",
-							       "connection is password protected",
-							       FALSE,
-							       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-	g_object_class_install_property (object_class,
-					 PROP_NAME,
-					 g_param_spec_string ("name",
-						 	      "connection name",
-							      "connection name",
-							      NULL,
-							       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-	g_object_class_install_property (object_class,
-					 PROP_HOST,
-					 g_param_spec_string ("host",
-						 	      "host",
-							      "host",
-							      NULL,
-							       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-	g_object_class_install_property (object_class,
-					 PROP_PORT,
-					 g_param_spec_uint ("port",
-							    "port",
-							    "port",
-							    0, G_MAXINT, 0,
-							    G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-
-	signals [AUTHENTICATE] = g_signal_new ("authenticate",
-					       G_TYPE_FROM_CLASS (object_class),
-					       G_SIGNAL_RUN_LAST,
-					       G_STRUCT_OFFSET (RBDAAPConnectionClass, authenticate),
-					       NULL,
-					       NULL,
-					       rb_marshal_STRING__STRING,
-					       G_TYPE_STRING,
-					       1, G_TYPE_STRING);
-	signals [CONNECTING] = g_signal_new ("connecting",
-					     G_TYPE_FROM_CLASS (object_class),
-					     G_SIGNAL_RUN_LAST,
-					     G_STRUCT_OFFSET (RBDAAPConnectionClass, connecting),
-					     NULL,
-					     NULL,
-					     rb_marshal_VOID__ULONG_FLOAT,
-					     G_TYPE_NONE,
-					     2, G_TYPE_ULONG, G_TYPE_FLOAT);
-	signals [CONNECTED] = g_signal_new ("connected",
-					    G_TYPE_FROM_CLASS (object_class),
-					    G_SIGNAL_RUN_LAST,
-					    G_STRUCT_OFFSET (RBDAAPConnectionClass, connected),
-					    NULL,
-					    NULL,
-					    g_cclosure_marshal_VOID__VOID,
-					       G_TYPE_NONE,
-					    0);
-	signals [DISCONNECTED] = g_signal_new ("disconnected",
-					       G_TYPE_FROM_CLASS (object_class),
-					       G_SIGNAL_RUN_LAST,
-					       G_STRUCT_OFFSET (RBDAAPConnectionClass, disconnected),
-					       NULL,
-					       NULL,
-					       g_cclosure_marshal_VOID__VOID,
-					       G_TYPE_NONE,
-					       0);
-	signals [OPERATION_DONE] = g_signal_new ("operation-done",
-						 G_TYPE_FROM_CLASS (object_class),
-						 G_SIGNAL_RUN_FIRST,
-						 G_STRUCT_OFFSET (RBDAAPConnectionClass, operation_done),
-						 NULL,
-						 NULL,
-						 g_cclosure_marshal_VOID__VOID,
-						 G_TYPE_NONE,
-						 0);
-}
-
-static void
-rb_daap_connection_init (RBDAAPConnection *connection)
-{
-	connection->priv = RB_DAAP_CONNECTION_GET_PRIVATE (connection);
-
-	connection->priv->username = g_strdup_printf ("Rhythmbox_%s", VERSION);
-	connection->priv->db_type = RHYTHMDB_ENTRY_TYPE_INVALID;
-}
-
-static char *
-connection_get_password (RBDAAPConnection *connection)
-{
-	char *password = NULL;;
-
-	GDK_THREADS_ENTER ();
-	g_signal_emit (connection,
-		       signals [AUTHENTICATE],
-		       0,
-		       connection->priv->name,
-		       &password);
-	GDK_THREADS_LEAVE ();
-
-	return password;
-}
-
-static void
-connection_connected (RBDAAPConnection *connection)
-{
-	rb_debug ("Emitting connected");
-
-	connection->priv->is_connected = TRUE;
-
-	GDK_THREADS_ENTER ();
-	g_signal_emit (connection,
-		       signals [CONNECTED],
-		       0);
-	GDK_THREADS_LEAVE ();
-}
-
-static void
-connection_disconnected (RBDAAPConnection *connection)
-{
-	rb_debug ("Emitting disconnected");
-
-	connection->priv->is_connected = FALSE;
-
-	GDK_THREADS_ENTER ();
-	g_signal_emit (connection,
-		       signals [DISCONNECTED],
-		       0);
-	GDK_THREADS_LEAVE ();
-}
-
-static void
-connection_operation_done (RBDAAPConnection *connection)
-{
-	rb_debug ("Emitting operation done");
-
-	GDK_THREADS_ENTER ();
-	g_signal_emit (connection,
-		       signals [OPERATION_DONE],
-		       0);
-	GDK_THREADS_LEAVE ();
-}
-
-static SoupMessage *
-build_message (RBDAAPConnection *connection,
-	       const char       *path,
-	       gboolean          need_hash,
-	       gdouble           version,
-	       gint              req_id,
-	       gboolean          send_close)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	SoupMessage *message = NULL;
-	SoupURI *uri = NULL;
-
-	uri = soup_uri_new_with_base (priv->base_uri, path);
-	if (uri == NULL) {
-		return NULL;
-	}
-
-	message = soup_message_new_from_uri (SOUP_METHOD_GET, uri);
-
-	soup_message_headers_append (message->request_headers, "Client-DAAP-Version", 		"3.0");
-	soup_message_headers_append (message->request_headers, "Accept-Language", 		"en-us, en;q=5.0");
-#ifdef HAVE_LIBZ
-	soup_message_headers_append (message->request_headers, "Accept-Encoding",		"gzip");
-#endif
-	soup_message_headers_append (message->request_headers, "Client-DAAP-Access-Index", 	"2");
-
-	if (priv->password_protected) {
-		char *h;
-		char *user_pass;
-		char *token;
-
-		user_pass = g_strdup_printf ("%s:%s", priv->username, priv->password);
-		token = g_base64_encode ((guchar *)user_pass, strlen (user_pass));
-		h = g_strdup_printf ("Basic %s", token);
-
-		g_free (token);
-		g_free (user_pass);
-
-		soup_message_headers_append (message->request_headers, "Authorization", h);
-		g_free (h);
-	}
-
-	if (need_hash) {
-		gchar hash[33] = {0};
-		gchar *no_daap_path = (gchar *)path;
-
-		if (g_ascii_strncasecmp (path, "daap://", 7) == 0) {
-			no_daap_path = strstr (path, "/data");
-		}
-
-		rb_daap_hash_generate ((short)floor (version), (const guchar*)no_daap_path, 2, (guchar*)hash, req_id);
-
-		soup_message_headers_append (message->request_headers, "Client-DAAP-Validation", hash);
-	}
-	if (send_close) {
-		soup_message_headers_append (message->request_headers, "Connection", "close");
-	}
-
-	soup_uri_free (uri);
-
-	return message;
-}
-
-#ifdef HAVE_LIBZ
-static void
-*g_zalloc_wrapper (voidpf opaque, uInt items, uInt size)
-{
-	if ((items != 0) && (size >= G_MAXUINT/items)) {
-		return Z_NULL;
-	}
-	if ((size != 0) && (items >= G_MAXUINT/size)) {
-		return Z_NULL;
-	}
-	return g_malloc0 (items * size);
-}
-
-static void
-g_zfree_wrapper (voidpf opaque, voidpf address)
-{
-	g_free (address);
-}
-#endif
-
-static void
-connection_set_error_message (RBDAAPConnection *connection,
-			      const char       *message)
-{
-	/* FIXME: obtain a lock */
-	g_free (connection->priv->last_error_message);
-	if (message != NULL) {
-		connection->priv->last_error_message = g_strdup (message);
-	} else {
-		connection->priv->last_error_message = NULL;
-	}
-}
-
-typedef struct {
-	SoupMessage *message;
-	int status;
-	RBDAAPConnection *connection;
-} DAAPResponseData;
-
-static void
-actual_http_response_handler (DAAPResponseData *data)
-{
-	RBDAAPConnectionPrivate *priv;
-	GNode *structure;
-	char *new_response = NULL;
-	const char *response;
-	const char *encoding_header;
-	char *message_path;
-	int response_length;
-	gboolean compatible_server = TRUE;
-
-	priv = data->connection->priv;
-	structure = NULL;
-	encoding_header = NULL;
-	response = data->message->response_body->data;
-	response_length = data->message->response_body->length;
-
-	message_path = soup_uri_to_string (soup_message_get_uri (data->message), FALSE);
-
-	rb_debug ("Received response from %s: %d, %s\n",
-		  message_path,
-		  data->message->status_code,
-		  data->message->reason_phrase);
-
-	if (data->message->response_headers) {
-		const char *server;
-
-		encoding_header = soup_message_headers_get (data->message->response_headers, "Content-Encoding");
-
-		server = soup_message_headers_get (data->message->response_headers, "DAAP-Server");
-		if (server != NULL && strstr (server, ITUNES_7_SERVER) != NULL) {
-			rb_debug ("giving up.  we can't talk to %s", server);
-			compatible_server = FALSE;
-		}
-	}
-
-	if (SOUP_STATUS_IS_SUCCESSFUL (data->status) && encoding_header && strcmp (encoding_header, "gzip") == 0) {
-#ifdef HAVE_LIBZ
-		z_stream stream;
-		unsigned int factor = 4;
-		unsigned int unc_size = response_length * factor;
-
-		stream.next_in = (unsigned char *)response;
-		stream.avail_in = response_length;
-		stream.total_in = 0;
-
-		new_response = g_malloc (unc_size + 1);
-		stream.next_out = (unsigned char *)new_response;
-		stream.avail_out = unc_size;
-		stream.total_out = 0;
-		stream.zalloc = g_zalloc_wrapper;
-		stream.zfree = g_zfree_wrapper;
-		stream.opaque = NULL;
-
-		rb_profile_start ("decompressing DAAP response");
-
-		if (inflateInit2 (&stream, 32 /* auto-detect */ + 15 /* max */ ) != Z_OK) {
-			inflateEnd (&stream);
-			g_free (new_response);
-			rb_debug ("Unable to decompress response from %s",
-				  message_path);
-			data->status = SOUP_STATUS_MALFORMED;
-			rb_profile_end ("decompressing DAAP response (failed)");
-		} else {
-			do {
-				int z_res;
-
-				rb_profile_start ("attempting inflate");
-				z_res = inflate (&stream, Z_FINISH);
-				if (z_res == Z_STREAM_END) {
-					rb_profile_end ("attempting inflate (done)");
-					break;
-				}
-				if ((z_res != Z_OK && z_res != Z_BUF_ERROR) || stream.avail_out != 0 || unc_size > 40*1000*1000) {
-					inflateEnd (&stream);
-					g_free (new_response);
-					new_response = NULL;
-					rb_profile_end ("attempting inflate (error)");
-					break;
-				}
-
-				factor *= 4;
-				unc_size = (response_length * factor);
-				/* unc_size can't grow bigger than 40MB, so
-				 * unc_size can't overflow, and this realloc
-				 * call is safe
-				 */
-				new_response = g_realloc (new_response, unc_size + 1);
-				stream.next_out = (unsigned char *)(new_response + stream.total_out);
-				stream.avail_out = unc_size - stream.total_out;
-				rb_profile_end ("attempting inflate (incomplete)");
-			} while (1);
-		}
-		rb_profile_end ("decompressing DAAP response (successful)");
-
-		if (new_response) {
-			response = new_response;
-			response_length = stream.total_out;
-		}
-#else
-		rb_debug ("Received compressed response from %s but can't handle it",
-			  message_path);
-		data->status = SOUP_STATUS_MALFORMED;
-#endif
-	}
-
-	if (compatible_server == FALSE) {
-		/* leaving structure == NULL here causes the connection process
-		 * to fail at the first step.
-		 */
-		connection_set_error_message (data->connection,
-					      _("Rhythmbox is not able to connect to iTunes 7 shares"));
-	} else if (SOUP_STATUS_IS_SUCCESSFUL (data->status)) {
-		RBDAAPItem *item;
-
-		if (!rb_is_main_thread ()) {
-			priv->progress = -1.0f;
-			if (priv->emit_progress_id != 0) {
-				g_source_remove (priv->emit_progress_id);
-			}
-			priv->emit_progress_id = g_idle_add ((GSourceFunc) emit_progress_idle, data->connection);
-		}
-		rb_profile_start ("parsing DAAP response");
-		structure = rb_daap_structure_parse (response, response_length);
-		if (structure == NULL) {
-			rb_debug ("No daap structure returned from %s",
-				  message_path);
-
-			data->status = SOUP_STATUS_MALFORMED;
-			rb_profile_end ("parsing DAAP response (failed)");
-		} else {
-			int dmap_status = 0;
-			item = rb_daap_structure_find_item (structure, RB_DAAP_CC_MSTT);
-			if (item)
-				dmap_status = g_value_get_int (&(item->content));
-
-			if (dmap_status != 200) {
-				rb_debug ("Error, dmap.status is not 200 in response from %s",
-					  message_path);
-
-				data->status = SOUP_STATUS_MALFORMED;
-			}
-			rb_profile_end ("parsing DAAP response (successful)");
-		}
-		if (! rb_is_main_thread ()) {
-			priv->progress = 1.0f;
-			if (priv->emit_progress_id != 0) {
-				g_source_remove (priv->emit_progress_id);
-			}
-			priv->emit_progress_id = g_idle_add ((GSourceFunc) emit_progress_idle, data->connection);
-		}
-	} else {
-		rb_debug ("Error getting %s: %d, %s\n",
-			  message_path,
-			  data->message->status_code,
-			  data->message->reason_phrase);
-		connection_set_error_message (data->connection, data->message->reason_phrase);
-	}
-
-	if (priv->response_handler) {
-		RBDAAPResponseHandler h = priv->response_handler;
-		priv->response_handler = NULL;
-		(*h) (data->connection, data->status, structure);
-	}
-
-	if (structure) {
-		rb_daap_structure_destroy (structure);
-	}
-
-	g_free (new_response);
-	g_free (message_path);
-	g_object_unref (G_OBJECT (data->connection));
-	g_object_unref (G_OBJECT (data->message));
-	g_free (data);
-}
-
-static void
-http_response_handler (SoupSession      *session,
-		       SoupMessage      *message,
-		       RBDAAPConnection *connection)
-{
-	DAAPResponseData *data;
-	int response_length;
-
-	if (message->status_code == SOUP_STATUS_CANCELLED) {
-		rb_debug ("Message cancelled");
-		return;
-	}
-
-	data = g_new0 (DAAPResponseData, 1);
-	data->status = message->status_code;
-	response_length = message->response_body->length;
-
-	g_object_ref (G_OBJECT (connection));
-	data->connection = connection;
-
-	g_object_ref (G_OBJECT (message));
-	data->message = message;
-
-	if (response_length >= G_MAXUINT/4 - 1) {
-		/* If response_length is too big,
-		 * the g_malloc (unc_size + 1) below would overflow
-		 */
-		data->status = SOUP_STATUS_MALFORMED;
-	}
-
-	/* to avoid blocking the UI, handle big responses in a separate thread */
-	if (SOUP_STATUS_IS_SUCCESSFUL (data->status) && connection->priv->use_response_handler_thread) {
-		GError *error = NULL;
-		rb_debug ("creating thread to handle daap response");
-		g_thread_create ((GThreadFunc) actual_http_response_handler,
-				 data,
-				 FALSE,
-				 &error);
-		if (error) {
-			g_warning ("fuck");
-		}
-	} else {
-		actual_http_response_handler (data);
-	}
-}
-
-static gboolean
-http_get (RBDAAPConnection     *connection,
-	  const char           *path,
-	  gboolean              need_hash,
-	  gdouble               version,
-	  gint                  req_id,
-	  gboolean              send_close,
-	  RBDAAPResponseHandler handler,
-	  gboolean              use_thread)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	SoupMessage *message;
-
-	message = build_message (connection, path, need_hash, version, req_id, send_close);
-	if (message == NULL) {
-		rb_debug ("Error building message for http://%s:%d/%s",
-			  priv->base_uri->host,
-			  priv->base_uri->port,
-			  path);
-		return FALSE;
-	}
-
-	priv->use_response_handler_thread = use_thread;
-	priv->response_handler = handler;
-	soup_session_queue_message (priv->session, message,
-				    (SoupSessionCallback) http_response_handler,
-				    connection);
-	rb_debug ("Queued message for http://%s:%d/%s",
-		  priv->base_uri->host,
-		  priv->base_uri->port,
-		  path);
-	return TRUE;
-}
-
-static void
-entry_set_string_prop (RhythmDB        *db,
-		       RhythmDBEntry   *entry,
-		       RhythmDBPropType propid,
-		       const char      *str)
-{
-	GValue value = {0,};
-	const gchar *tmp;
-
-	if (str == NULL || *str == '\0' || !g_utf8_validate (str, -1, NULL)) {
-		tmp = _("Unknown");
-	} else {
-		tmp = str;
-	}
-
-	g_value_init (&value, G_TYPE_STRING);
-	g_value_set_string (&value, tmp);
-	rhythmdb_entry_set (RHYTHMDB (db), entry, propid, &value);
-	g_value_unset (&value);
-}
-
-static gboolean
-emit_progress_idle (RBDAAPConnection *connection)
-{
-	rb_debug ("Emitting progress");
-
-	GDK_THREADS_ENTER ();
-	g_signal_emit (G_OBJECT (connection), signals[CONNECTING], 0,
-		       connection->priv->state,
-		       connection->priv->progress);
-	connection->priv->emit_progress_id = 0;
-	GDK_THREADS_LEAVE ();
-	return FALSE;
-}
-
-static void
-handle_server_info (RBDAAPConnection *connection,
-		    guint             status,
-		    GNode            *structure)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	RBDAAPItem *item = NULL;
-
-	if (!SOUP_STATUS_IS_SUCCESSFUL (status) || structure == NULL) {
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	/* get the daap version number */
-	item = rb_daap_structure_find_item (structure, RB_DAAP_CC_APRO);
-	if (item == NULL) {
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	priv->daap_version = g_value_get_double (&(item->content));
-	rb_daap_connection_state_done (connection, TRUE);
-}
-
-static void
-handle_login (RBDAAPConnection *connection,
-	      guint             status,
-	      GNode            *structure)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	RBDAAPItem *item = NULL;
-
-	if (status == SOUP_STATUS_UNAUTHORIZED || status == SOUP_STATUS_FORBIDDEN) {
-		rb_debug ("Incorrect password");
-		priv->state = DAAP_GET_PASSWORD;
-		if (priv->do_something_id != 0) {
-			g_source_remove (priv->do_something_id);
-		}
-		priv->do_something_id = g_idle_add ((GSourceFunc) rb_daap_connection_do_something, connection);
-		return;
-	}
-
-	if (structure == NULL || SOUP_STATUS_IS_SUCCESSFUL (status) == FALSE) {
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	item = rb_daap_structure_find_item (structure, RB_DAAP_CC_MLID);
-	if (item == NULL) {
-		rb_debug ("Could not find daap.sessionid item in /login");
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	priv->session_id = (guint32) g_value_get_int (&(item->content));
-
-	connection_connected (connection);
-
-	rb_daap_connection_state_done (connection, TRUE);
-}
-
-static void
-handle_update (RBDAAPConnection *connection,
-	       guint             status,
-	       GNode            *structure)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	RBDAAPItem *item;
-
-	if (structure == NULL || SOUP_STATUS_IS_SUCCESSFUL (status) == FALSE) {
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	/* get a revision number */
-	item = rb_daap_structure_find_item (structure, RB_DAAP_CC_MUSR);
-	if (item == NULL) {
-		rb_debug ("Could not find daap.serverrevision item in /update");
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	priv->revision_number = g_value_get_int (&(item->content));
-	rb_daap_connection_state_done (connection, TRUE);
-}
-
-static void
-handle_database_info (RBDAAPConnection *connection,
-		      guint             status,
-		      GNode            *structure)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	RBDAAPItem *item = NULL;
-	GNode *listing_node;
-	gint n_databases = 0;
-
-	/* get a list of databases, there should be only 1 */
-
-	if (structure == NULL || SOUP_STATUS_IS_SUCCESSFUL (status) == FALSE) {
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	item = rb_daap_structure_find_item (structure, RB_DAAP_CC_MRCO);
-	if (item == NULL) {
-		rb_debug ("Could not find dmap.returnedcount item in /databases");
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	n_databases = g_value_get_int (&(item->content));
-	if (n_databases != 1) {
-		rb_debug ("Host seems to have more than 1 database, how strange\n");
-	}
-
-	listing_node = rb_daap_structure_find_node (structure, RB_DAAP_CC_MLCL);
-	if (listing_node == NULL) {
-		rb_debug ("Could not find dmap.listing item in /databases");
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	item = rb_daap_structure_find_item (listing_node->children, RB_DAAP_CC_MIID);
-	if (item == NULL) {
-		rb_debug ("Could not find dmap.itemid item in /databases");
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	priv->database_id = g_value_get_int (&(item->content));
-	rb_daap_connection_state_done (connection, TRUE);
-}
-
-static void
-handle_song_listing (RBDAAPConnection *connection,
-		     guint             status,
-		     GNode            *structure)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	RBDAAPItem *item = NULL;
-	GNode *listing_node;
-	gint returned_count;
-	gint i;
-	GNode *n;
-	gint specified_total_count;
-	gboolean update_type;
-	gint commit_batch;
-
-	/* get the songs */
-
-	if (structure == NULL || SOUP_STATUS_IS_SUCCESSFUL (status) == FALSE) {
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	item = rb_daap_structure_find_item (structure, RB_DAAP_CC_MRCO);
-	if (item == NULL) {
-		rb_debug ("Could not find dmap.returnedcount item in /databases/%d/items",
-			  priv->database_id);
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-	returned_count = g_value_get_int (&(item->content));
-	if (returned_count > 20) {
-		commit_batch = returned_count / 20;
-	} else {
-		commit_batch = 1;
-	}
-
-	item = rb_daap_structure_find_item (structure, RB_DAAP_CC_MTCO);
-	if (item == NULL) {
-		rb_debug ("Could not find dmap.specifiedtotalcount item in /databases/%d/items",
-			  priv->database_id);
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-	specified_total_count = g_value_get_int (&(item->content));
-
-	item = rb_daap_structure_find_item (structure, RB_DAAP_CC_MUTY);
-	if (item == NULL) {
-		rb_debug ("Could not find dmap.updatetype item in /databases/%d/items",
-			  priv->database_id);
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-	update_type = g_value_get_char (&(item->content));
-
-	listing_node = rb_daap_structure_find_node (structure, RB_DAAP_CC_MLCL);
-	if (listing_node == NULL) {
-		rb_debug ("Could not find dmap.listing item in /databases/%d/items",
-			  priv->database_id);
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	priv->item_id_to_uri = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)rb_refstring_unref);
-
-	rb_profile_start ("handling song listing");
-	priv->progress = 0.0f;
-	if (priv->emit_progress_id != 0) {
-		g_source_remove (priv->emit_progress_id);
-	}
-	connection->priv->emit_progress_id = g_idle_add ((GSourceFunc) emit_progress_idle, connection);
-
-	for (i = 0, n = listing_node->children; n; i++, n = n->next) {
-		GNode *n2;
-		RhythmDBEntry *entry = NULL;
-		GValue value = {0,};
-		gchar *uri = NULL;
-		gint item_id = 0;
-		const gchar *title = NULL;
-		const gchar *album = NULL;
-		const gchar *artist = NULL;
-		const gchar *format = NULL;
-		const gchar *genre = NULL;
-		const gchar *streamURI = NULL;
-		gint length = 0;
-		gint track_number = 0;
-		gint disc_number = 0;
-		gint year = 0;
-		gint size = 0;
-		gint bitrate = 0;
-
-		for (n2 = n->children; n2; n2 = n2->next) {
-			RBDAAPItem *meta_item;
-
-			meta_item = n2->data;
-
-			switch (meta_item->content_code) {
-				case RB_DAAP_CC_MIID:
-					item_id = g_value_get_int (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_MINM:
-					title = g_value_get_string (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_ASAL:
-					album = g_value_get_string (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_ASAR:
-					artist = g_value_get_string (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_ASFM:
-					format = g_value_get_string (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_ASGN:
-					genre = g_value_get_string (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_ASTM:
-					length = g_value_get_int (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_ASTN:
-					track_number = g_value_get_int (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_ASDN:
-					disc_number = g_value_get_int (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_ASYR:
-					year = g_value_get_int (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_ASSZ:
-					size = g_value_get_int (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_ASBR:
-					bitrate = g_value_get_int (&(meta_item->content));
-					break;
-				case RB_DAAP_CC_ASUL:
-					streamURI = g_value_get_string (&(meta_item->content));
-					break;
-				default:
-					break;
-			}
-		}
-
-		/*if (connection->daap_version == 3.0) {*/
-			uri = g_strdup_printf ("%s/databases/%d/items/%d.%s?session-id=%u",
-					       priv->daap_base_uri,
-					       priv->database_id,
-					       item_id, format,
-					       priv->session_id);
-		/*} else {*/
-		/* uri should be
-		 * "/databases/%d/items/%d.%s?session-id=%u&revision-id=%d";
-		 * but its not going to work cause the other parts of the code
-		 * depend on the uri to have the ip address so that the
-		 * RBDAAPSource can be found to ++request_id
-		 * maybe just /dont/ support older itunes.  doesn't seem
-		 * unreasonable to me, honestly
-		 */
-		/*}*/
-		entry = rhythmdb_entry_new (priv->db, priv->db_type, uri);
-		if (entry == NULL) {
-			rb_debug ("cannot create entry for daap track %s", uri);
-			continue;
-		}
-		g_hash_table_insert (priv->item_id_to_uri, GINT_TO_POINTER (item_id), rb_refstring_new (uri));
-		g_free (uri);
-
-		/* year */
-		if (year != 0) {
-			GDate *date;
-			gulong julian;
-
-			/* create dummy date with given year */
-			date = g_date_new_dmy (1, G_DATE_JANUARY, year);
-			julian = g_date_get_julian (date);
-			g_date_free (date);
-
-			g_value_init (&value, G_TYPE_ULONG);
-			g_value_set_ulong (&value,julian);
-			rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_DATE, &value);
-			g_value_unset (&value);
-		}
-
-		/* track number */
-		g_value_init (&value, G_TYPE_ULONG);
-		g_value_set_ulong (&value,(gulong)track_number);
-		rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_TRACK_NUMBER, &value);
-		g_value_unset (&value);
-
-		/* disc number */
-		g_value_init (&value, G_TYPE_ULONG);
-		g_value_set_ulong (&value,(gulong)disc_number);
-		rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_DISC_NUMBER, &value);
-		g_value_unset (&value);
-
-		/* bitrate */
-		g_value_init (&value, G_TYPE_ULONG);
-		g_value_set_ulong (&value,(gulong)bitrate);
-		rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_BITRATE, &value);
-		g_value_unset (&value);
-
-		/* length */
-		g_value_init (&value, G_TYPE_ULONG);
-		g_value_set_ulong (&value,(gulong)length / 1000);
-		rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_DURATION, &value);
-		g_value_unset (&value);
-
-		/* file size */
-		g_value_init (&value, G_TYPE_UINT64);
-		g_value_set_uint64(&value,(gint64)size);
-		rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_FILE_SIZE, &value);
-		g_value_unset (&value);
-
-		/* title */
-		entry_set_string_prop (priv->db, entry, RHYTHMDB_PROP_TITLE, title);
-
-		/* album */
-		entry_set_string_prop (priv->db, entry, RHYTHMDB_PROP_ALBUM, album);
-
-		/* artist */
-		entry_set_string_prop (priv->db, entry, RHYTHMDB_PROP_ARTIST, artist);
-
-		/* genre */
-		entry_set_string_prop (priv->db, entry, RHYTHMDB_PROP_GENRE, genre);
-
-		/* stream URI property is stored as a mountpoint for get_playback_uri */
-		if (streamURI && *streamURI != '\0') {
-			entry_set_string_prop (priv->db, entry, RHYTHMDB_PROP_MOUNTPOINT, streamURI);
-		}
-
-		if (i % commit_batch == 0) {
-			connection->priv->progress = ((float)i / (float)returned_count);
-			if (priv->emit_progress_id != 0) {
-				g_source_remove (connection->priv->emit_progress_id);
-			}
-			connection->priv->emit_progress_id = g_idle_add ((GSourceFunc) emit_progress_idle, connection);
-			rhythmdb_commit (priv->db);
-		}
-	}
-	rhythmdb_commit (priv->db);
-	rb_profile_end ("handling song listing");
-
-	rb_daap_connection_state_done (connection, TRUE);
-}
-
-static int
-compare_playlists_by_name(gconstpointer a, gconstpointer b)
-{
-	const RBDAAPPlaylist *playlist1 = a;
-	const RBDAAPPlaylist *playlist2 = b;
-
-	return strcmp(playlist1->name, playlist2->name);
-}
-
-/* FIXME
- * what we really should do is only get a list of playlists and their ids
- * then when they are clicked on ('activate'd) by the user, get a list of
- * the files that are actually in them.  This will speed up initial daap
- * connection times and reduce memory consumption.
- */
-
-static void
-handle_playlists (RBDAAPConnection *connection,
-		  guint             status,
-		  GNode            *structure)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	GNode *listing_node;
-	gint i;
-	GNode *n;
-
-	if (structure == NULL || SOUP_STATUS_IS_SUCCESSFUL (status) == FALSE) {
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	listing_node = rb_daap_structure_find_node (structure, RB_DAAP_CC_MLCL);
-	if (listing_node == NULL) {
-		rb_debug ("Could not find dmap.listing item in /databases/%d/containers",
-			  priv->database_id);
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	for (i = 0, n = listing_node->children; n; n = n->next, i++) {
-		RBDAAPItem *item;
-		gint id;
-		gchar *name;
-		RBDAAPPlaylist *playlist;
-
-		item = rb_daap_structure_find_item (n, RB_DAAP_CC_ABPL);
-		if (item != NULL) {
-			continue;
-		}
-
-		item = rb_daap_structure_find_item (n, RB_DAAP_CC_MIID);
-		if (item == NULL) {
-			rb_debug ("Could not find dmap.itemid item in /databases/%d/containers",
-				  priv->database_id);
-			continue;
-		}
-		id = g_value_get_int (&(item->content));
-
-		item = rb_daap_structure_find_item (n, RB_DAAP_CC_MINM);
-		if (item == NULL) {
-			rb_debug ("Could not find dmap.itemname item in /databases/%d/containers",
-				  priv->database_id);
-			continue;
-		}
-		name = g_value_dup_string (&(item->content));
-
-		playlist = g_new0 (RBDAAPPlaylist, 1);
-		playlist->id = id;
-		playlist->name = name;
-		rb_debug ("Got playlist %p: name %s, id %d", playlist, playlist->name, playlist->id);
-
-		priv->playlists = g_slist_prepend (priv->playlists, playlist);
-	}
-
-	/* Sort the playlists into lexical order. Established DAAP clients already
-	 * do this leading to an absence of sorting functionality in DAAP servers. */
-	priv->playlists = g_slist_sort (priv->playlists, compare_playlists_by_name);
-
-	rb_daap_connection_state_done (connection, TRUE);
-}
-
-static void
-handle_playlist_entries (RBDAAPConnection *connection,
-			 guint             status,
-			 GNode            *structure)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	RBDAAPPlaylist *playlist;
-	GNode *listing_node;
-	GNode *node;
-	gint i;
-	GList *playlist_uris = NULL;
-
-	if (structure == NULL || SOUP_STATUS_IS_SUCCESSFUL (status) == FALSE) {
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	playlist = (RBDAAPPlaylist *)g_slist_nth_data (priv->playlists, priv->reading_playlist);
-	g_assert (playlist);
-
-	listing_node = rb_daap_structure_find_node (structure, RB_DAAP_CC_MLCL);
-	if (listing_node == NULL) {
-		rb_debug ("Could not find dmap.listing item in /databases/%d/containers/%d/items",
-			  priv->database_id, playlist->id);
-		rb_daap_connection_state_done (connection, FALSE);
-		return;
-	}
-
-	rb_profile_start ("handling playlist entries");
-	for (i = 0, node = listing_node->children; node; node = node->next, i++) {
-		RBRefString *item_uri;
-		gint playlist_item_id;
-		RBDAAPItem *item;
-
-		item = rb_daap_structure_find_item (node, RB_DAAP_CC_MIID);
-		if (item == NULL) {
-			rb_debug ("Could not find dmap.itemid item in /databases/%d/containers/%d/items",
-				  priv->database_id, playlist->id);
-			continue;
-		}
-		playlist_item_id = g_value_get_int (&(item->content));
-
-		item_uri = g_hash_table_lookup (priv->item_id_to_uri, GINT_TO_POINTER (playlist_item_id));
-		if (item_uri == NULL) {
-			rb_debug ("Entry %d in playlist %s doesn't exist in the database\n",
-				  playlist_item_id, playlist->name);
-			continue;
-		}
-
-		playlist_uris = g_list_prepend (playlist_uris, rb_refstring_ref (item_uri));
-	}
-	rb_profile_end ("handling playlist entries");
-
-	playlist->uris = g_list_reverse (playlist_uris);
-	rb_daap_connection_state_done (connection, TRUE);
-}
-
-static void
-handle_logout (RBDAAPConnection *connection,
-	       guint             status,
-	       GNode            *structure)
-{
-	connection_disconnected (connection);
-
-	/* is there any point handling errors here? */
-	rb_daap_connection_state_done (connection, TRUE);
-}
-
-RBDAAPConnection *
-rb_daap_connection_new (const char       *name,
-			const char       *host,
-			int               port,
-			gboolean          password_protected,
-			RhythmDB         *db,
-			RhythmDBEntryType type)
-{
-	return g_object_new (RB_TYPE_DAAP_CONNECTION,
-			     "name", name,
-			     "entry-type", type,
-			     "password-protected", password_protected,
-			     "db", db,
-			     "host", host,
-			     "port", port,
-			     NULL);
-}
-
-gboolean
-rb_daap_connection_is_connected (RBDAAPConnection *connection)
-{
-	g_return_val_if_fail (RB_IS_DAAP_CONNECTION (connection), FALSE);
-
-	return connection->priv->is_connected;
-}
-
-typedef struct {
-	RBDAAPConnection        *connection;
-	RBDAAPConnectionCallback callback;
-	gpointer                 data;
-	GDestroyNotify           destroy;
-} ConnectionResponseData;
-
-static void
-connection_response_data_free (gpointer data)
-{
-	ConnectionResponseData *rdata = data;
-
-	g_object_unref (rdata->connection);
-	g_free (rdata);
-}
-
-static void
-connected_cb (RBDAAPConnection       *connection,
-	      ConnectionResponseData *rdata)
-{
-	gboolean result;
-
-	rb_debug ("Connected callback");
-
-	connection->priv->is_connecting = FALSE;
-
-	g_signal_handlers_disconnect_by_func (connection,
-					      G_CALLBACK (connected_cb),
-					      rdata);
-
-	/* if connected then we succeeded */
-	result = rb_daap_connection_is_connected (connection);
-
-	if (rdata->callback) {
-		rdata->callback (rdata->connection,
-				 result,
-				 rdata->connection->priv->last_error_message,
-				 rdata->data);
-	}
-
-	if (rdata->destroy) {
-		rdata->destroy (rdata);
-	}
-}
-
-void
-rb_daap_connection_connect (RBDAAPConnection        *connection,
-			    RBDAAPConnectionCallback callback,
-			    gpointer                 user_data)
-{
-	ConnectionResponseData *rdata;
-
-	g_return_if_fail (RB_IS_DAAP_CONNECTION (connection));
-	g_return_if_fail (connection->priv->state == DAAP_GET_INFO);
-
-	rb_debug ("Creating new DAAP connection to %s:%d", connection->priv->host, connection->priv->port);
-
-	connection->priv->session = soup_session_async_new ();
-
-	connection->priv->base_uri = soup_uri_new (NULL);
-	soup_uri_set_scheme (connection->priv->base_uri, SOUP_URI_SCHEME_HTTP);
-	soup_uri_set_host (connection->priv->base_uri, connection->priv->host);
-	soup_uri_set_port (connection->priv->base_uri, connection->priv->port);
-
-	if (connection->priv->base_uri == NULL) {
-		rb_debug ("Error parsing http://%s:%d", connection->priv->host, connection->priv->port);
-		/* FIXME: do callback */
-		return;
-	}
-
-	connection->priv->daap_base_uri = g_strdup_printf ("daap://%s:%d", connection->priv->host, connection->priv->port);
-
-	rdata = g_new (ConnectionResponseData, 1);
-	rdata->connection = g_object_ref (connection);
-	rdata->callback = callback;
-	rdata->data = user_data;
-	rdata->destroy = connection_response_data_free;
-	g_signal_connect (connection, "operation-done", G_CALLBACK (connected_cb), rdata);
-
-	if (connection->priv->do_something_id != 0) {
-		g_source_remove (connection->priv->do_something_id);
-	}
-
-	connection->priv->is_connecting = TRUE;
-	connection->priv->do_something_id = g_idle_add ((GSourceFunc) rb_daap_connection_do_something, connection);
-}
-
-static void
-disconnected_cb (RBDAAPConnection       *connection,
-		 ConnectionResponseData *rdata)
-{
-	gboolean result;
-
-	rb_debug ("Disconnected callback");
-
-	g_signal_handlers_disconnect_by_func (connection,
-					      G_CALLBACK (disconnected_cb),
-					      rdata);
-
-	/* if not connected then we succeeded */
-	result = ! rb_daap_connection_is_connected (connection);
-
-	if (rdata->callback) {
-		rdata->callback (rdata->connection,
-				 result,
-				 rdata->connection->priv->last_error_message,
-				 rdata->data);
-	}
-
-	if (rdata->destroy) {
-		rdata->destroy (rdata);
-	}
-}
-
-static void
-rb_daap_connection_finish (RBDAAPConnection *connection)
-{
-	g_return_if_fail (RB_IS_DAAP_CONNECTION (connection));
-
-	rb_debug ("DAAP finish");
-	connection->priv->state = DAAP_DONE;
-	connection->priv->progress = 1.0f;
-
-	connection_operation_done (connection);
-}
-
-void
-rb_daap_connection_disconnect (RBDAAPConnection        *connection,
-			       RBDAAPConnectionCallback callback,
-			       gpointer                 user_data)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	ConnectionResponseData  *rdata;
-
-	g_return_if_fail (RB_IS_DAAP_CONNECTION (connection));
-
-	rb_debug ("Disconnecting");
-
-	if (connection->priv->is_connecting) {
-		/* this is a special case where the async connection
-		   hasn't returned yet so we need to force the connection
-		   to finish */
-		priv->state = DAAP_DONE;
-		GDK_THREADS_LEAVE ();
-		rb_daap_connection_finish (connection);
-		GDK_THREADS_ENTER ();
-	}
-
-	rdata = g_new (ConnectionResponseData, 1);
-	rdata->connection = g_object_ref (connection);
-	rdata->callback = callback;
-	rdata->data = user_data;
-	rdata->destroy = connection_response_data_free;
-
-	g_signal_connect (connection, "operation-done", G_CALLBACK (disconnected_cb), rdata);
-
-	if (priv->do_something_id != 0) {
-		g_source_remove (priv->do_something_id);
-	}
-
-	if (! connection->priv->is_connected) {
-		priv->state = DAAP_DONE;
-		GDK_THREADS_LEAVE ();
-		rb_daap_connection_finish (connection);
-		GDK_THREADS_ENTER ();
-	} else {
-		priv->state = DAAP_LOGOUT;
-
-		priv->do_something_id = g_idle_add ((GSourceFunc) rb_daap_connection_do_something, connection);
-	}
-}
-
-static void
-rb_daap_connection_state_done (RBDAAPConnection *connection,
-			       gboolean          result)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-
-	rb_debug ("Transitioning to next state from %d", priv->state);
-
-	if (result == FALSE) {
-		priv->state = DAAP_DONE;
-		priv->result = FALSE;
-	} else {
-		switch (priv->state) {
-		case DAAP_GET_PLAYLISTS:
-			if (priv->playlists == NULL)
-				priv->state = DAAP_DONE;
-			else
-				priv->state = DAAP_GET_PLAYLIST_ENTRIES;
-			break;
-		case DAAP_GET_PLAYLIST_ENTRIES:
-			/* keep reading playlists until we've got them all */
-			if (++priv->reading_playlist >= g_slist_length (priv->playlists))
-				priv->state = DAAP_DONE;
-			break;
-
-		case DAAP_LOGOUT:
-			priv->state = DAAP_DONE;
-			break;
-
-		case DAAP_DONE:
-			/* uhh.. */
-			rb_debug ("This should never happen.");
-			break;
-
-		default:
-			/* in most states, we just move on to the next */
-			if (priv->state > DAAP_DONE) {
-				rb_debug ("This should REALLY never happen.");
-				return;
-			}
-			priv->state++;
-			break;
-		}
-
-		priv->progress = 1.0f;
-		if (connection->priv->emit_progress_id != 0) {
-			g_source_remove (connection->priv->emit_progress_id);
-		}
-		connection->priv->emit_progress_id = g_idle_add ((GSourceFunc) emit_progress_idle, connection);
-	}
-
-	if (priv->do_something_id != 0) {
-		g_source_remove (priv->do_something_id);
-	}
-	priv->do_something_id = g_idle_add ((GSourceFunc) rb_daap_connection_do_something, connection);
-}
-
-static gboolean
-rb_daap_connection_do_something (RBDAAPConnection *connection)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	char *path;
-
-	rb_debug ("Doing something for state: %d", priv->state);
-
-	priv->do_something_id = 0;
-
-	switch (priv->state) {
-	case DAAP_GET_INFO:
-		rb_debug ("Getting DAAP server info");
-		if (! http_get (connection, "/server-info", FALSE, 0.0, 0, FALSE,
-				(RBDAAPResponseHandler) handle_server_info, FALSE)) {
-			rb_debug ("Could not get DAAP connection info");
-			rb_daap_connection_state_done (connection, FALSE);
-		}
-		break;
-
-	case DAAP_GET_PASSWORD:
-		if (priv->password_protected) {
-			/* FIXME this bit is still synchronous */
-			rb_debug ("Need a password for %s", priv->name);
-			g_free (priv->password);
-			priv->password = connection_get_password (connection);
-
-			if (priv->password == NULL || priv->password[0] == '\0') {
-				rb_debug ("Password entry cancelled");
-				priv->result = FALSE;
-				priv->state = DAAP_DONE;
-				rb_daap_connection_do_something (connection);
-				return FALSE;
-			}
-
-			/* If the share went away while we were asking for the password,
-			 * don't bother trying to log in.
-			 */
-			if (priv->state != DAAP_GET_PASSWORD) {
-				return FALSE;
-			}
-		}
-
-		/* otherwise, fall through */
-		priv->state = DAAP_LOGIN;
-
-	case DAAP_LOGIN:
-		rb_debug ("Logging into DAAP server");
-		if (! http_get (connection, "/login", FALSE, 0.0, 0, FALSE,
-			       (RBDAAPResponseHandler) handle_login, FALSE)) {
-			rb_debug ("Could not login to DAAP server");
-			/* FIXME: set state back to GET_PASSWORD to try again */
-			rb_daap_connection_state_done (connection, FALSE);
-		}
-
-		break;
-
-	case DAAP_GET_REVISION_NUMBER:
-		rb_debug ("Getting DAAP server database revision number");
-		path = g_strdup_printf ("/update?session-id=%u&revision-number=1", priv->session_id);
-		if (! http_get (connection, path, TRUE, priv->daap_version, 0, FALSE,
-			       (RBDAAPResponseHandler) handle_update, FALSE)) {
-			rb_debug ("Could not get server database revision number");
-			rb_daap_connection_state_done (connection, FALSE);
-		}
-		g_free (path);
-		break;
-
-	case DAAP_GET_DB_INFO:
-		rb_debug ("Getting DAAP database info");
-		path = g_strdup_printf ("/databases?session-id=%u&revision-number=%d",
-					priv->session_id, priv->revision_number);
-		if (! http_get (connection, path, TRUE, priv->daap_version, 0, FALSE,
-			       (RBDAAPResponseHandler) handle_database_info, FALSE)) {
-			rb_debug ("Could not get DAAP database info");
-			rb_daap_connection_state_done (connection, FALSE);
-		}
-		g_free (path);
-		break;
-
-	case DAAP_GET_SONGS:
-		rb_debug ("Getting DAAP song listing");
-		path = g_strdup_printf ("/databases/%i/items?session-id=%u&revision-number=%i"
-				        "&meta=dmap.itemid,dmap.itemname,daap.songalbum,"
-					"daap.songartist,daap.daap.songgenre,daap.songsize,"
-					"daap.songtime,daap.songtrackcount,daap.songtracknumber,"
-					"daap.songyear,daap.songformat,daap.songgenre,"
-					"daap.songbitrate,daap.songdiscnumber,daap.songdataurl",
-					priv->database_id,
-					priv->session_id,
-					priv->revision_number);
-		if (! http_get (connection, path, TRUE, priv->daap_version, 0, FALSE,
-			       (RBDAAPResponseHandler) handle_song_listing, TRUE)) {
-			rb_debug ("Could not get DAAP song listing");
-			rb_daap_connection_state_done (connection, FALSE);
-		}
-		g_free (path);
-		break;
-
-	case DAAP_GET_PLAYLISTS:
-		rb_debug ("Getting DAAP playlists");
-		path = g_strdup_printf ("/databases/%d/containers?session-id=%u&revision-number=%d",
-					priv->database_id,
-					priv->session_id,
-					priv->revision_number);
-		if (! http_get (connection, path, TRUE, priv->daap_version, 0, FALSE,
-			       (RBDAAPResponseHandler) handle_playlists, TRUE)) {
-			rb_debug ("Could not get DAAP playlists");
-			rb_daap_connection_state_done (connection, FALSE);
-		}
-		g_free (path);
-		break;
-
-	case DAAP_GET_PLAYLIST_ENTRIES:
-		{
-			RBDAAPPlaylist *playlist =
-				(RBDAAPPlaylist *) g_slist_nth_data (priv->playlists,
-								     priv->reading_playlist);
-			g_assert (playlist);
-			rb_debug ("Reading DAAP playlist %d entries", priv->reading_playlist);
-			path = g_strdup_printf ("/databases/%d/containers/%d/items?session-id=%u&revision-number=%d&meta=dmap.itemid",
-						priv->database_id,
-						playlist->id,
-						priv->session_id, priv->revision_number);
-			if (! http_get (connection, path, TRUE, priv->daap_version, 0, FALSE,
-				       (RBDAAPResponseHandler) handle_playlist_entries, TRUE)) {
-				rb_debug ("Could not get entries for DAAP playlist %d",
-					  priv->reading_playlist);
-				rb_daap_connection_state_done (connection, FALSE);
-			}
-			g_free (path);
-		}
-		break;
-
-	case DAAP_LOGOUT:
-		rb_debug ("Logging out of DAAP server");
-		path = g_strdup_printf ("/logout?session-id=%u", priv->session_id);
-		if (! http_get (connection, path, TRUE, priv->daap_version, 0, FALSE,
-			       (RBDAAPResponseHandler) handle_logout, FALSE)) {
-			rb_debug ("Could not log out of DAAP server");
-			rb_daap_connection_state_done (connection, FALSE);
-		}
-
-		g_free (path);
-		break;
-
-	case DAAP_DONE:
-		rb_debug ("DAAP done");
-
-		rb_daap_connection_finish (connection);
-
-		break;
-	}
-
-	return FALSE;
-}
-
-char *
-rb_daap_connection_get_headers (RBDAAPConnection *connection,
-				const gchar *uri,
-				gint64 bytes)
-{
-	RBDAAPConnectionPrivate *priv = connection->priv;
-	GString *headers;
-	char hash[33] = {0};
-	char *norb_daap_uri = (char *)uri;
-	char *s;
-
-	priv->request_id++;
-
-	if (g_ascii_strncasecmp (uri, "daap://", 7) == 0) {
-		norb_daap_uri = strstr (uri, "/data");
-	}
-
-	rb_daap_hash_generate ((short)floorf (priv->daap_version),
-			       (const guchar*)norb_daap_uri, 2,
-			       (guchar*)hash,
-			       priv->request_id);
-
-	headers = g_string_new ("Accept: */*\r\n"
-				"Cache-Control: no-cache\r\n"
-				"User-Agent: " RB_DAAP_USER_AGENT "\r\n"
-				"Accept-Language: en-us, en;q=5.0\r\n"
-				"Client-DAAP-Access-Index: 2\r\n"
-				"Client-DAAP-Version: 3.0\r\n");
-	g_string_append_printf (headers,
-				"Client-DAAP-Validation: %s\r\n"
-				"Client-DAAP-Request-ID: %d\r\n"
-				"Connection: close\r\n",
-				hash, priv->request_id);
-
-	if (priv->password_protected) {
-		char *user_pass;
-		char *token;
-
-		user_pass = g_strdup_printf ("%s:%s", priv->username, priv->password);
-		token = g_base64_encode ((guchar *)user_pass, strlen (user_pass));
-		g_string_append_printf (headers, "Authentication: Basic %s\r\n", token);
-		g_free (token);
-		g_free (user_pass);
-	}
-
-	if (bytes != 0) {
-		g_string_append_printf (headers,"Range: bytes=%"G_GINT64_FORMAT"-\r\n", bytes);
-	}
-
-	s = headers->str;
-	g_string_free (headers, FALSE);
-
-	return s;
-}
-
-GSList *
-rb_daap_connection_get_playlists (RBDAAPConnection *connection)
-{
-	return connection->priv->playlists;
-}
-
-static void
-rb_daap_connection_dispose (GObject *object)
-{
-	RBDAAPConnectionPrivate *priv = RB_DAAP_CONNECTION (object)->priv;
-	GSList *l;
-
-	rb_debug ("DAAP connection dispose");
-
-	if (priv->emit_progress_id != 0) {
-		g_source_remove (priv->emit_progress_id);
-		priv->emit_progress_id = 0;
-	}
-
-	if (priv->do_something_id != 0) {
-		g_source_remove (priv->do_something_id);
-		priv->do_something_id = 0;
-	}
-
-	if (priv->name) {
-		g_free (priv->name);
-		priv->name = NULL;
-	}
-
-	if (priv->username) {
-		g_free (priv->username);
-		priv->username = NULL;
-	}
-
-	if (priv->password) {
-		g_free (priv->password);
-		priv->password = NULL;
-	}
-
-	if (priv->host) {
-		g_free (priv->host);
-		priv->host = NULL;
-	}
-
-	if (priv->playlists) {
-		for (l = priv->playlists; l; l = l->next) {
-			RBDAAPPlaylist *playlist = l->data;
-
-			g_list_foreach (playlist->uris, (GFunc)rb_refstring_unref, NULL);
-			g_list_free (playlist->uris);
-			g_free (playlist->name);
-			g_free (playlist);
-			l->data = NULL;
-		}
-		g_slist_free (priv->playlists);
-		priv->playlists = NULL;
-	}
-
-	if (priv->item_id_to_uri) {
-		g_hash_table_destroy (priv->item_id_to_uri);
-		priv->item_id_to_uri = NULL;
-	}
-
-	if (priv->session) {
-		rb_debug ("Aborting all pending requests");
-		soup_session_abort (priv->session);
-		g_object_unref (G_OBJECT (priv->session));
-		priv->session = NULL;
-	}
-
-	if (priv->base_uri) {
-		soup_uri_free (priv->base_uri);
-		priv->base_uri = NULL;
-	}
-
-	if (priv->daap_base_uri) {
-		g_free (priv->daap_base_uri);
-		priv->daap_base_uri = NULL;
-	}
-
-	if (priv->db) {
-		g_object_unref (G_OBJECT (priv->db));
-		priv->db = NULL;
-	}
-
-	if (priv->last_error_message != NULL) {
-		g_free (priv->last_error_message);
-		priv->last_error_message = NULL;
-	}
-
-	G_OBJECT_CLASS (rb_daap_connection_parent_class)->dispose (object);
-}
-
-static void
-rb_daap_connection_set_property (GObject *object,
-				 guint prop_id,
-				 const GValue *value,
-				 GParamSpec *pspec)
-{
-	RBDAAPConnectionPrivate *priv = RB_DAAP_CONNECTION (object)->priv;
-
-	switch (prop_id) {
-	case PROP_NAME:
-		g_free (priv->name);
-		priv->name = g_value_dup_string (value);
-		break;
-	case PROP_DB:
-		if (priv->db != NULL) {
-			g_object_unref (priv->db);
-		}
-		priv->db = RHYTHMDB (g_value_dup_object (value));
-		break;
-	case PROP_PASSWORD_PROTECTED:
-		priv->password_protected = g_value_get_boolean (value);
-		break;
-	case PROP_ENTRY_TYPE:
-		priv->db_type = g_value_get_boxed (value);
-		break;
-	case PROP_HOST:
-		g_free (priv->host);
-		priv->host = g_value_dup_string (value);
-		break;
-	case PROP_PORT:
-		priv->port = g_value_get_uint (value);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-rb_daap_connection_get_property (GObject *object,
-				 guint prop_id,
-				 GValue *value,
-				 GParamSpec *pspec)
-{
-	RBDAAPConnectionPrivate *priv = RB_DAAP_CONNECTION (object)->priv;
-
-	switch (prop_id) {
-	case PROP_DB:
-		g_value_set_object (value, priv->db);
-		break;
-	case PROP_NAME:
-		g_value_set_string (value, priv->name);
-		break;
-	case PROP_ENTRY_TYPE:
-		g_value_set_boxed (value, priv->db_type);
-		break;
-	case PROP_PASSWORD_PROTECTED:
-		g_value_set_boolean (value, priv->password_protected);
-		break;
-	case PROP_HOST:
-		g_value_set_string (value, priv->host);
-		break;
-	case PROP_PORT:
-		g_value_set_uint (value, priv->port);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
diff --git a/plugins/daap/rb-daap-connection.h b/plugins/daap/rb-daap-connection.h
deleted file mode 100644
index 11235ca..0000000
--- a/plugins/daap/rb-daap-connection.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- *  Header for DAAP (iTunes Music Sharing) hashing, connection
- *
- *  Copyright (C) 2004-2005 Charles Schmidt <cschmidt2@emich.edu>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The Rhythmbox authors hereby grant permission for non-GPL compatible
- *  GStreamer plugins to be used and distributed together with GStreamer
- *  and Rhythmbox. This permission is above and beyond the permissions granted
- *  by the GPL license by which Rhythmbox is covered. If you modify this code
- *  you may extend this exception to your version of the code, but you are not
- *  obligated to do so. If you do not wish to do so, delete this exception
- *  statement from your version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#ifndef __RB_DAAP_CONNECTION_H
-#define __RB_DAAP_CONNECTION_H
-
-#include <glib.h>
-#include <glib-object.h>
-#include "rhythmdb.h"
-
-G_BEGIN_DECLS
-
-typedef struct {
-	char  *name;
-	int    id;
-	GList *uris;
-} RBDAAPPlaylist;
-
-#define RB_TYPE_DAAP_CONNECTION		(rb_daap_connection_get_type ())
-#define RB_DAAP_CONNECTION(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), RB_TYPE_DAAP_CONNECTION, RBDAAPConnection))
-#define RB_DAAP_CONNECTION_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), RB_TYPE_DAAP_CONNECTION, RBDAAPConnectionClass))
-#define RB_IS_DAAP_CONNECTION(o)	(G_TYPE_CHECK_INSTANCE_TYPE ((o), RB_TYPE_DAAP_CONNECTION))
-#define RB_IS_DAAP_CONNECTION_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), RB_TYPE_DAAP_CONNECTION))
-#define RB_DAAP_CONNECTION_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), RB_TYPE_DAAP_CONNECTION, RBDAAPConnectionClass))
-
-typedef struct RBDAAPConnectionPrivate RBDAAPConnectionPrivate;
-
-typedef enum {
-	DAAP_GET_INFO = 0,
-	DAAP_GET_PASSWORD,
-	DAAP_LOGIN,
-	DAAP_GET_REVISION_NUMBER,
-	DAAP_GET_DB_INFO,
-	DAAP_GET_SONGS,
-	DAAP_GET_PLAYLISTS,
-	DAAP_GET_PLAYLIST_ENTRIES,
-	DAAP_LOGOUT,
-	DAAP_DONE
-} RBDAAPConnectionState;
-
-typedef struct {
-	GObject parent;
-	RBDAAPConnectionPrivate *priv;
-} RBDAAPConnection;
-
-typedef struct {
-	GObjectClass parent;
-
-	void   (* connected)      (RBDAAPConnection     *connection);
-	void   (* disconnected)   (RBDAAPConnection     *connection);
-
-	char * (* authenticate)   (RBDAAPConnection     *connection,
-				   const char           *name);
-	void   (* connecting)     (RBDAAPConnection     *connection,
-				   RBDAAPConnectionState state,
-				   float		 progress);
-
-	void   (* operation_done) (RBDAAPConnection     *connection);
-
-} RBDAAPConnectionClass;
-
-/* hmm, maybe should give more error information? */
-typedef gboolean (* RBDAAPConnectionCallback)  (RBDAAPConnection *connection,
-						gboolean          result,
-						const char       *reason,
-						gpointer          user_data);
-
-GType              rb_daap_connection_get_type        (void);
-
-RBDAAPConnection * rb_daap_connection_new             (const char              *name,
-						       const char              *host,
-						       int                      port,
-						       gboolean                 password_protected,
-						       RhythmDB                *db,
-						       RhythmDBEntryType        type);
-
-gboolean           rb_daap_connection_is_connected    (RBDAAPConnection        *connection);
-void               rb_daap_connection_connect         (RBDAAPConnection        *connection,
-						       RBDAAPConnectionCallback callback,
-						       gpointer                 user_data);
-void               rb_daap_connection_disconnect      (RBDAAPConnection        *connection,
-						       RBDAAPConnectionCallback callback,
-						       gpointer                 user_data);
-
-char *             rb_daap_connection_get_headers     (RBDAAPConnection         *connection,
-						       const char               *uri,
-						       gint64                    bytes);
-
-GSList *           rb_daap_connection_get_playlists   (RBDAAPConnection         *connection);
-
-G_END_DECLS
-
-#endif /* __RB_DAAP_CONNECTION_H */
diff --git a/plugins/daap/rb-daap-hash.c b/plugins/daap/rb-daap-hash.c
deleted file mode 100644
index d0a9a39..0000000
--- a/plugins/daap/rb-daap-hash.c
+++ /dev/null
@@ -1,518 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- *  Implementation of DAAP (iTunes Music Sharing) hashing, parsing, connection
- *
- *  Copyright (C) 2004,2005 Charles Schmidt <cschmidt2@emich.edu>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The Rhythmbox authors hereby grant permission for non-GPL compatible
- *  GStreamer plugins to be used and distributed together with GStreamer
- *  and Rhythmbox. This permission is above and beyond the permissions granted
- *  by the GPL license by which Rhythmbox is covered. If you modify this code
- *  you may extend this exception to your version of the code, but you are not
- *  obligated to do so. If you do not wish to do so, delete this exception
- *  statement from your version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <math.h>
-#ifdef HAVE_LIBZ
-#include <zlib.h>
-#endif
-
-#include <glib.h>
-
-#include "rb-daap-hash.h"
-
-/* hashing - based on/copied from libopendaap
- * Copyright (c) 2004 David Hammerton
- */
-
-typedef struct {
-    guint32 buf[4];
-    guint32 bits[2];
-    unsigned char in[64];
-    int version;
-} MD5_CTX;
-
-/*
-* This code implements the MD5 message-digest algorithm.
-* The algorithm is due to Ron Rivest.  This code was
-* written by Colin Plumb in 1993, no copyright is claimed.
-* This code is in the public domain; do with it what you wish.
-*
-* Equivalent code is available from RSA Data Security, Inc.
-* This code has been tested against that, and is equivalent,
-* except that you don't need to include two pages of legalese
-* with every copy.
-*
-* To compute the message digest of a chunk of bytes, declare an MD5Context
-* structure, pass it to OpenDaap_MD5Init, call OpenDaap_MD5Update as needed
-* on buffers full of bytes, and then call OpenDaap_MD5Final, which will fill
-* a supplied 16-byte array with the digest.
-*/
-static void
-MD5Transform (guint32 buf[4],
-	      guint32 const in[16],
-	      gint version);
-/* for some reason we still have to reverse bytes on bigendian machines
- * I don't really know why... but otherwise it fails..
- * Any MD5 gurus out there know why???
- */
-#if 0 //ndef WORDS_BIGENDIAN /* was: HIGHFIRST */
-#define byteReverse(buf, len)     /* Nothing */
-#else
-static void
-byteReverse (unsigned char *buf,
-	     unsigned longs);
-
-#ifndef ASM_MD5
-/*
-* Note: this code is harmless on little-endian machines.
-*/
-static void
-byteReverse (unsigned char *buf,
-	     unsigned longs)
-{
-     guint32 t;
-     do {
-          t = (guint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
-               ((unsigned) buf[1] << 8 | buf[0]);
-          *(guint32 *) buf = t;
-          buf += 4;
-     } while (--longs);
-}
-#endif /* ! ASM_MD5 */
-#endif /* #if 0 */
-
-static void
-OpenDaap_MD5Init (MD5_CTX *ctx,
-		  gint version)
-{
-    memset (ctx, 0, sizeof (MD5_CTX));
-    ctx->buf[0] = 0x67452301;
-    ctx->buf[1] = 0xefcdab89;
-    ctx->buf[2] = 0x98badcfe;
-    ctx->buf[3] = 0x10325476;
-
-    ctx->bits[0] = 0;
-    ctx->bits[1] = 0;
-
-    ctx->version = version;
-}
-
-static void
-OpenDaap_MD5Update (MD5_CTX *ctx,
-		    unsigned char const *buf,
-		    unsigned int len)
-{
-    guint32 t;
-
-    /* Update bitcount */
-
-    t = ctx->bits[0];
-    if ((ctx->bits[0] = t + ((guint32) len << 3)) < t)
-        ctx->bits[1]++;          /* Carry from low to high */
-    ctx->bits[1] += len >> 29;
-
-    t = (t >> 3) & 0x3f;     /* Bytes already in shsInfo->data */
-
-    /* Handle any leading odd-sized chunks */
-
-    if (t) {
-        unsigned char *p = (unsigned char *) ctx->in + t;
-
-        t = 64 - t;
-        if (len < t) {
-            memcpy (p, buf, len);
-            return;
-        }
-        memcpy (p, buf, t);
-        byteReverse (ctx->in, 16);
-        MD5Transform (ctx->buf, (guint32 *) ctx->in, ctx->version);
-        buf += t;
-        len -= t;
-    }
-    /* Process data in 64-byte chunks */
-
-    while (len >= 64) {
-        memcpy (ctx->in, buf, 64);
-        byteReverse (ctx->in, 16);
-        MD5Transform (ctx->buf, (guint32 *) ctx->in, ctx->version);
-        buf += 64;
-        len -= 64;
-    }
-
-    /* Handle any remaining bytes of data. */
-
-    memcpy (ctx->in, buf, len);
-
-}
-
-static void
-OpenDaap_MD5Final (MD5_CTX *ctx,
-		   unsigned char digest[16])
-{
-    unsigned count;
-    unsigned char *p;
-
-    /* Compute number of bytes mod 64 */
-    count = (ctx->bits[0] >> 3) & 0x3F;
-
-    /* Set the first char of padding to 0x80.  This is safe since there is
-    always at least one byte free */
-    p = ctx->in + count;
-    *p++ = 0x80;
-
-    /* Bytes of padding needed to make 64 bytes */
-    count = 64 - 1 - count;
-
-    /* Pad out to 56 mod 64 */
-    if (count < 8) {
-        /* Two lots of padding:  Pad the first block to 64 bytes */
-        memset (p, 0, count);
-        byteReverse (ctx->in, 16);
-        MD5Transform (ctx->buf, (guint32 *) ctx->in, ctx->version);
-
-        /* Now fill the next block with 56 bytes */
-        memset (ctx->in, 0, 56);
-    } else {
-        /* Pad block to 56 bytes */
-        memset (p, 0, count - 8);
-    }
-    byteReverse (ctx->in, 14);
-
-    /* Append length in bits and transform */
-    ((guint32 *) ctx->in)[14] = ctx->bits[0];
-    ((guint32 *) ctx->in)[15] = ctx->bits[1];
-
-    MD5Transform (ctx->buf, (guint32 *) ctx->in, ctx->version);
-    byteReverse ((unsigned char *) ctx->buf, 4);
-    memcpy (digest, ctx->buf, 16);
-    memset (ctx, 0, sizeof(ctx));     /* In case it's sensitive */
-
-    return;
-}
-
-#ifndef ASM_MD5
-
-/* The four core functions - F1 is optimized somewhat */
-
-/* #define F1(x, y, z) (x & y | ~x & z) */
-#define F1(x, y, z) (z ^ (x & (y ^ z)))
-#define F2(x, y, z) F1(z, x, y)
-#define F3(x, y, z) (x ^ y ^ z)
-#define F4(x, y, z) (y ^ (x | ~z))
-
-/* This is the central step in the MD5 algorithm. */
-#define MD5STEP(f, w, x, y, z, data, s) \
-( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
-
-/*
-* The core of the MD5 algorithm, this alters an existing MD5 hash to reflect
-* the addition of 16 longwords of new data.  OpenDaap_MD5Update blocks the
-* data and converts bytes into longwords for this routine.
-*/
-static void
-MD5Transform (guint32 buf[4],
-	      guint32 const in[16],
-	      gint version)
-{
-    guint32 a, b, c, d;
-
-    a = buf[0];
-    b = buf[1];
-    c = buf[2];
-    d = buf[3];
-
-    MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
-    MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
-    MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
-    MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
-    MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
-    MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
-    MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
-    MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
-    MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
-    MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
-    MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
-    MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
-    MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
-    MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
-    MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
-    MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
-
-    MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
-    MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
-    MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
-    MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
-    MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
-    MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
-    MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
-    MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
-    MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
-    MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
-    MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
-
-    if (version == 1)
-    {
-        MD5STEP(F2, b, c, d, a, in[8] + 0x445a14ed, 20);
-    }
-    else
-    {
-        MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
-    }
-    MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
-    MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
-    MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
-    MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
-
-    MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
-    MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
-    MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
-    MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
-    MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
-    MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
-    MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
-    MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
-    MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
-    MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
-    MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
-    MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
-    MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
-    MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
-    MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
-    MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
-
-    MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
-    MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
-    MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
-    MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
-    MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
-    MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
-    MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
-    MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
-    MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
-    MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
-    MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
-    MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
-    MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
-    MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
-    MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
-    MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
-
-    buf[0] += a;
-    buf[1] += b;
-    buf[2] += c;
-    buf[3] += d;
-}
-
-#endif
-
-static int staticHashDone = 0;
-static unsigned char staticHash_42[256*65] = {0};
-static unsigned char staticHash_45[256*65] = {0};
-
-static const char hexchars[] = "0123456789ABCDEF";
-static char ac[] = "Dpqzsjhiu!3114!Bqqmf!Dpnqvufs-!Jod/"; /* +1 */
-static gboolean ac_unfudged = FALSE;
-
-static void
-DigestToString (const unsigned char *digest,
-		char *string)
-{
-    int i;
-    for (i = 0; i < 16; i++)
-    {
-        unsigned char tmp = digest[i];
-        string[i*2+1] = hexchars[tmp & 0x0f];
-        string[i*2] = hexchars[(tmp >> 4) & 0x0f];
-    }
-}
-
-static void
-GenerateStatic_42 ()
-{
-    MD5_CTX ctx;
-    unsigned char *p = staticHash_42;
-    int i;
-    unsigned char buf[16];
-
-    for (i = 0; i < 256; i++)
-    {
-        OpenDaap_MD5Init (&ctx, 0);
-
-#define MD5_STRUPDATE(str) OpenDaap_MD5Update(&ctx, (unsigned char const *)str, strlen(str))
-
-        if ((i & 0x80) != 0)
-            MD5_STRUPDATE("Accept-Language");
-        else
-            MD5_STRUPDATE("user-agent");
-
-        if ((i & 0x40) != 0)
-            MD5_STRUPDATE("max-age");
-        else
-            MD5_STRUPDATE("Authorization");
-
-        if ((i & 0x20) != 0)
-            MD5_STRUPDATE("Client-DAAP-Version");
-        else
-            MD5_STRUPDATE("Accept-Encoding");
-
-        if ((i & 0x10) != 0)
-            MD5_STRUPDATE("daap.protocolversion");
-        else
-            MD5_STRUPDATE("daap.songartist");
-
-        if ((i & 0x08) != 0)
-            MD5_STRUPDATE("daap.songcomposer");
-        else
-            MD5_STRUPDATE("daap.songdatemodified");
-
-        if ((i & 0x04) != 0)
-            MD5_STRUPDATE("daap.songdiscnumber");
-        else
-            MD5_STRUPDATE("daap.songdisabled");
-
-        if ((i & 0x02) != 0)
-            MD5_STRUPDATE("playlist-item-spec");
-        else
-            MD5_STRUPDATE("revision-number");
-
-        if ((i & 0x01) != 0)
-            MD5_STRUPDATE("session-id");
-        else
-            MD5_STRUPDATE("content-codes");
-#undef MD5_STRUPDATE
-
-        OpenDaap_MD5Final (&ctx, buf);
-        DigestToString (buf, (char *)p);
-        p += 65;
-    }
-}
-
-static void GenerateStatic_45()
-{
-    MD5_CTX ctx;
-    unsigned char *p = staticHash_45;
-    int i;
-    unsigned char buf[16];
-
-    for (i = 0; i < 256; i++)
-    {
-        OpenDaap_MD5Init (&ctx, 1);
-
-#define MD5_STRUPDATE(str) OpenDaap_MD5Update(&ctx, (unsigned char const *)str, strlen(str))
-
-        if ((i & 0x40) != 0)
-            MD5_STRUPDATE("eqwsdxcqwesdc");
-        else
-            MD5_STRUPDATE("op[;lm,piojkmn");
-
-        if ((i & 0x20) != 0)
-            MD5_STRUPDATE("876trfvb 34rtgbvc");
-        else
-            MD5_STRUPDATE("=-0ol.,m3ewrdfv");
-
-        if ((i & 0x10) != 0)
-            MD5_STRUPDATE("87654323e4rgbv ");
-        else
-            MD5_STRUPDATE("1535753690868867974342659792");
-
-        if ((i & 0x08) != 0)
-            MD5_STRUPDATE("Song Name");
-        else
-            MD5_STRUPDATE("DAAP-CLIENT-ID:");
-
-        if ((i & 0x04) != 0)
-            MD5_STRUPDATE("111222333444555");
-        else
-            MD5_STRUPDATE("4089961010");
-
-        if ((i & 0x02) != 0)
-            MD5_STRUPDATE("playlist-item-spec");
-        else
-            MD5_STRUPDATE("revision-number");
-
-        if ((i & 0x01) != 0)
-            MD5_STRUPDATE("session-id");
-        else
-            MD5_STRUPDATE("content-codes");
-
-        if ((i & 0x80) != 0)
-            MD5_STRUPDATE("IUYHGFDCXWEDFGHN");
-        else
-            MD5_STRUPDATE("iuytgfdxwerfghjm");
-
-#undef MD5_STRUPDATE
-
-        OpenDaap_MD5Final (&ctx, buf);
-        DigestToString (buf, (char *)p);
-        p += 65;
-    }
-}
-
-void
-rb_daap_hash_generate (short         version_major,
-		       const guchar *url,
-		       guchar        hash_select,
-		       guchar       *out,
-		       gint          request_id)
-{
-    unsigned char buf[16];
-    MD5_CTX ctx;
-    int i;
-
-    unsigned char *hashTable = (version_major == 3) ?
-                      staticHash_45 : staticHash_42;
-
-    if (!staticHashDone)
-    {
-        GenerateStatic_42 ();
-        GenerateStatic_45 ();
-        staticHashDone = 1;
-    }
-
-    OpenDaap_MD5Init (&ctx, (version_major == 3) ? 1 : 0);
-
-    OpenDaap_MD5Update (&ctx, url, strlen ((const gchar*)url));
-    if (ac_unfudged == FALSE) {
-	    for (i = 0; i < strlen (ac); i++) {
-		ac[i] = ac[i]-1;
-	    }
-    	    ac_unfudged = TRUE;
-    }
-    OpenDaap_MD5Update (&ctx, (const guchar*)ac, strlen (ac));
-
-    OpenDaap_MD5Update (&ctx, &hashTable[hash_select * 65], 32);
-
-    if (request_id && version_major == 3)
-    {
-        char scribble[20];
-        sprintf (scribble, "%u", request_id);
-        OpenDaap_MD5Update (&ctx, (const guchar*)scribble, strlen (scribble));
-    }
-
-    OpenDaap_MD5Final (&ctx, buf);
-    DigestToString (buf, (char *)out);
-
-    return;
-}
diff --git a/plugins/daap/rb-daap-hash.h b/plugins/daap/rb-daap-hash.h
deleted file mode 100644
index e6c25ad..0000000
--- a/plugins/daap/rb-daap-hash.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- *  Header for DAAP (iTunes Music Sharing) hashing, connection
- *
- *  Copyright (C) 2004-2005 Charles Schmidt <cschmidt2@emich.edu>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The Rhythmbox authors hereby grant permission for non-GPL compatible
- *  GStreamer plugins to be used and distributed together with GStreamer
- *  and Rhythmbox. This permission is above and beyond the permissions granted
- *  by the GPL license by which Rhythmbox is covered. If you modify this code
- *  you may extend this exception to your version of the code, but you are not
- *  obligated to do so. If you do not wish to do so, delete this exception
- *  statement from your version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#ifndef __RB_DAAP_HASH_H
-#define __RB_DAAP_HASH_H
-
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-void rb_daap_hash_generate (short         version_major,
-			    const guchar *url,
-			    guchar        hash_select,
-			    guchar       *out,
-			    gint          request_id);
-
-G_END_DECLS
-
-#endif /* __RB_DAAP_HASH_H */
diff --git a/plugins/daap/rb-daap-mdns-avahi.c b/plugins/daap/rb-daap-mdns-avahi.c
deleted file mode 100644
index 5b3e35e..0000000
--- a/plugins/daap/rb-daap-mdns-avahi.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- *  Copyright (C) 2006 William Jon McCann <mccann@jhu.edu>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * The Rhythmbox authors hereby grant permission for non-GPL compatible
- * GStreamer plugins to be used and distributed together with GStreamer
- * and Rhythmbox. This permission is above and beyond the permissions granted
- * by the GPL license by which Rhythmbox is covered. If you modify this code
- * you may extend this exception to your version of the code, but you are not
- * obligated to do so. If you do not wish to do so, delete this exception
- * statement from your version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#include "config.h"
-
-#include <glib.h>
-#include <avahi-glib/glib-malloc.h>
-#include <avahi-glib/glib-watch.h>
-#include <avahi-common/error.h>
-
-#include "rb-daap-mdns-avahi.h"
-
-static AvahiClient *client = NULL;
-static AvahiEntryGroup *entry_group = NULL;
-static gsize client_init = 0;
-
-static void
-client_cb (AvahiClient         *client,
-	   AvahiClientState     state,
-	   gpointer             data)
-{
-	/* FIXME
-	 * check to make sure we're in the _RUNNING state before we publish
-	 * check for COLLISION state and remove published information
-	 */
-
-	/* Called whenever the client or server state changes */
-
-	switch (state) {
-	case AVAHI_CLIENT_S_RUNNING:
-		/* The server has startup successfully and registered its host
-		 * name on the network, so it's time to create our services
-		 */
-
-		break;
-
-	case AVAHI_CLIENT_S_COLLISION:
-
-		 /* Let's drop our registered services. When the server is back
-		  * in AVAHI_SERVER_RUNNING state we will register them
-		  * again with the new host name.
-		  */
-		 if (entry_group) {
-			 avahi_entry_group_reset (entry_group);
-		 }
-		 break;
-
-	case AVAHI_CLIENT_FAILURE:
-		 g_warning ("Client failure: %s\n", avahi_strerror (avahi_client_errno (client)));
-		 break;
-
-	case AVAHI_CLIENT_CONNECTING:
-	case AVAHI_CLIENT_S_REGISTERING:
-	default:
-		break;
-	}
-}
-
-AvahiClient *
-rb_daap_mdns_avahi_get_client (void)
-{
-	if (g_once_init_enter (&client_init)) {
-		AvahiClientFlags flags = 0;
-		AvahiGLibPoll *apoll;
-		int error = 0;
-
-		avahi_set_allocator (avahi_glib_allocator ());
-
-		apoll = avahi_glib_poll_new (NULL, G_PRIORITY_DEFAULT);
-		if (apoll == NULL) {
-			g_warning ("Unable to create AvahiGlibPoll object for mDNS");
-		}
-
-		client = avahi_client_new (avahi_glib_poll_get (apoll),
-					   flags,
-					   (AvahiClientCallback) client_cb,
-					   NULL,
-					   &error);
-		if (error != 0) {
-			g_warning ("Unable to initialize mDNS: %s", avahi_strerror (error));
-		}
-
-		g_once_init_leave (&client_init, 1);
-	}
-
-	return client;
-}
-
-void
-rb_daap_mdns_avahi_set_entry_group (AvahiEntryGroup *eg)
-{
-	if (eg != NULL) {
-		g_assert (entry_group == NULL);
-		g_assert (avahi_entry_group_get_client (eg) == client);
-	}
-	entry_group = eg;
-}
diff --git a/plugins/daap/rb-daap-mdns-avahi.h b/plugins/daap/rb-daap-mdns-avahi.h
deleted file mode 100644
index 7e0e9a5..0000000
--- a/plugins/daap/rb-daap-mdns-avahi.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- *  Copyright (C) 2008 Jonathan Matthew  <jonathan@d14n.org>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The Rhythmbox authors hereby grant permission for non-GPL compatible
- *  GStreamer plugins to be used and distributed together with GStreamer
- *  and Rhythmbox. This permission is above and beyond the permissions granted
- *  by the GPL license by which Rhythmbox is covered. If you modify this code
- *  you may extend this exception to your version of the code, but you are not
- *  obligated to do so. If you do not wish to do so, delete this exception
- *  statement from your version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#ifndef __RB_DAAP_MDNS_AVAHI_H
-#define __RB_DAAP_MDNS_AVAHI_H
-
-#include <avahi-client/client.h>
-#include <avahi-client/publish.h>
-
-AvahiClient *	rb_daap_mdns_avahi_get_client (void);
-
-void		rb_daap_mdns_avahi_set_entry_group (AvahiEntryGroup *group);
-
-#endif
-
diff --git a/plugins/daap/rb-daap-mdns-browser-avahi.c b/plugins/daap/rb-daap-mdns-browser-avahi.c
deleted file mode 100644
index ce57628..0000000
--- a/plugins/daap/rb-daap-mdns-browser-avahi.c
+++ /dev/null
@@ -1,405 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- *  Copyright (C) 2005 Charles Schmidt <cschmidt2@emich.edu>
- *  Copyright (C) 2006 William Jon McCann <mccann@jhu.edu>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * The Rhythmbox authors hereby grant permission for non-GPL compatible
- * GStreamer plugins to be used and distributed together with GStreamer
- * and Rhythmbox. This permission is above and beyond the permissions granted
- * by the GPL license by which Rhythmbox is covered. If you modify this code
- * you may extend this exception to your version of the code, but you are not
- * obligated to do so. If you do not wish to do so, delete this exception
- * statement from your version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <glib-object.h>
-
-#include <avahi-client/lookup.h>
-#include <avahi-client/publish.h>
-#include <avahi-client/client.h>
-#include <avahi-common/error.h>
-#include <avahi-glib/glib-malloc.h>
-#include <avahi-glib/glib-watch.h>
-
-#include "rb-daap-mdns-avahi.h"
-#include "rb-daap-mdns-browser.h"
-#include "rb-marshal.h"
-#include "rb-debug.h"
-
-static void	rb_daap_mdns_browser_class_init (RBDaapMdnsBrowserClass *klass);
-static void	rb_daap_mdns_browser_init	(RBDaapMdnsBrowser	*browser);
-static void	rb_daap_mdns_browser_finalize   (GObject	        *object);
-
-#define RB_DAAP_MDNS_BROWSER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RB_TYPE_DAAP_MDNS_BROWSER, RBDaapMdnsBrowserPrivate))
-
-struct RBDaapMdnsBrowserPrivate
-{
-	AvahiClient         *client;
-	AvahiServiceBrowser *service_browser;
-
-	GSList              *resolvers;
-};
-
-enum {
-	SERVICE_ADDED,
-	SERVICE_REMOVED,
-	LAST_SIGNAL
-};
-
-enum {
-	PROP_0
-};
-
-static GObjectClass *parent_class = NULL;
-static guint	     signals [LAST_SIGNAL] = { 0, };
-
-G_DEFINE_TYPE (RBDaapMdnsBrowser, rb_daap_mdns_browser, G_TYPE_OBJECT)
-
-static gpointer browser_object = NULL;
-
-GQuark
-rb_daap_mdns_browser_error_quark (void)
-{
-	static GQuark quark = 0;
-	if (!quark)
-		quark = g_quark_from_static_string ("rb_daap_mdns_browser_error");
-
-	return quark;
-}
-
-static void
-resolve_cb (AvahiServiceResolver  *service_resolver,
-	    AvahiIfIndex           interface,
-	    AvahiProtocol          protocol,
-	    AvahiResolverEvent     event,
-	    const char            *service_name,
-	    const char            *type,
-	    const char            *domain,
-	    const char            *host_name,
-	    const AvahiAddress    *address,
-	    uint16_t               port,
-	    AvahiStringList       *text,
-	    AvahiLookupResultFlags flags,
-	    RBDaapMdnsBrowser     *browser)
-{
-	if (event == AVAHI_RESOLVER_FOUND) {
-		char    *name = NULL;
-		char     host [AVAHI_ADDRESS_STR_MAX];
-		gboolean pp = FALSE;
-
-		if (text) {
-			AvahiStringList *l;
-
-			for (l = text; l != NULL; l = l->next) {
-				size_t size;
-				char  *key;
-				char  *value;
-				int    ret;
-
-				ret = avahi_string_list_get_pair (l, &key, &value, &size);
-				if (ret != 0 || key == NULL) {
-					continue;
-				}
-
-				if (strcmp (key, "Password") == 0) {
-					if (size >= 4 && strncmp (value, "true", 4) == 0) {
-						pp = TRUE;
-					}
-				} else if (strcmp (key, "Machine Name") == 0) {
-					name = g_strdup (value);
-				}
-
-				g_free (key);
-				g_free (value);
-			}
-		}
-
-		if (name == NULL) {
-			name = g_strdup (service_name);
-		}
-
-		avahi_address_snprint (host, AVAHI_ADDRESS_STR_MAX, address);
-
-		g_signal_emit (browser,
-			       signals [SERVICE_ADDED],
-			       0,
-			       service_name,
-			       name,
-			       host,
-			       port,
-			       pp);
-
-		g_free (name);
-	}
-
-	browser->priv->resolvers = g_slist_remove (browser->priv->resolvers, service_resolver);
-	avahi_service_resolver_free (service_resolver);
-}
-
-static gboolean
-rb_daap_mdns_browser_resolve (RBDaapMdnsBrowser *browser,
-			      const char        *name)
-{
-	AvahiServiceResolver *service_resolver;
-
-	service_resolver = avahi_service_resolver_new (browser->priv->client,
-						       AVAHI_IF_UNSPEC,
-						       AVAHI_PROTO_INET,
-						       name,
-						       "_daap._tcp",
-						       NULL,
-						       AVAHI_PROTO_UNSPEC,
-						       0,
-						       (AvahiServiceResolverCallback)resolve_cb,
-						       browser);
-	if (service_resolver == NULL) {
-		rb_debug ("Error starting mDNS resolving using AvahiServiceResolver");
-		return FALSE;
-	}
-
-	browser->priv->resolvers = g_slist_prepend (browser->priv->resolvers, service_resolver);
-
-	return TRUE;
-}
-
-static void
-browser_add_service (RBDaapMdnsBrowser *browser,
-		     const char        *service_name)
-{
-	rb_daap_mdns_browser_resolve (browser, service_name);
-}
-
-static void
-browser_remove_service (RBDaapMdnsBrowser *browser,
-			const char        *service_name)
-{
-	g_signal_emit (browser, signals [SERVICE_REMOVED], 0, service_name);
-}
-
-static void
-browse_cb (AvahiServiceBrowser   *service_browser,
-	   AvahiIfIndex           interface,
-	   AvahiProtocol          protocol,
-	   AvahiBrowserEvent      event,
-	   const char            *name,
-	   const char            *type,
-	   const char            *domain,
-	   AvahiLookupResultFlags flags,
-	   RBDaapMdnsBrowser     *browser)
-{
-	gboolean local;
-
-	local = ((flags & AVAHI_LOOKUP_RESULT_OUR_OWN) != 0);
-	if (local) {
-		rb_debug ("Ignoring local service %s", name);
-		return;
-	}
-
-	if (event == AVAHI_BROWSER_NEW) {
-		browser_add_service (browser, name);
-	} else if (event == AVAHI_BROWSER_REMOVE) {
-		browser_remove_service (browser, name);
-	}
-}
-
-gboolean
-rb_daap_mdns_browser_start (RBDaapMdnsBrowser *browser,
-			    GError           **error)
-{
-	if (browser->priv->client == NULL) {
-		g_set_error (error,
-			     RB_DAAP_MDNS_BROWSER_ERROR,
-			     RB_DAAP_MDNS_BROWSER_ERROR_NOT_RUNNING,
-			     "%s",
-			     _("mDNS service is not running"));
-		return FALSE;
-	}
-	if (browser->priv->service_browser != NULL) {
-		g_set_error (error,
-			     RB_DAAP_MDNS_BROWSER_ERROR,
-			     RB_DAAP_MDNS_BROWSER_ERROR_FAILED,
-			     "%s",
-			     _("Browser already active"));
-		return FALSE;
-	}
-
-	browser->priv->service_browser = avahi_service_browser_new (browser->priv->client,
-								    AVAHI_IF_UNSPEC,
-								    AVAHI_PROTO_UNSPEC,
-								    "_daap._tcp",
-								    NULL,
-								    0,
-								    (AvahiServiceBrowserCallback)browse_cb,
-								    browser);
-	if (browser->priv->service_browser == NULL) {
-		rb_debug ("Error starting mDNS discovery using AvahiServiceBrowser");
-		g_set_error (error,
-			     RB_DAAP_MDNS_BROWSER_ERROR,
-			     RB_DAAP_MDNS_BROWSER_ERROR_FAILED,
-			     "%s",
-			     _("Unable to activate browser"));
-
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-gboolean
-rb_daap_mdns_browser_stop (RBDaapMdnsBrowser *browser,
-			   GError           **error)
-{
-	if (browser->priv->client == NULL) {
-		g_set_error (error,
-			     RB_DAAP_MDNS_BROWSER_ERROR,
-			     RB_DAAP_MDNS_BROWSER_ERROR_NOT_RUNNING,
-			     "%s",
-			     _("mDNS service is not running"));
-		return FALSE;
-	}
-	if (browser->priv->service_browser == NULL) {
-		g_set_error (error,
-			     RB_DAAP_MDNS_BROWSER_ERROR,
-			     RB_DAAP_MDNS_BROWSER_ERROR_FAILED,
-			     "%s",
-			     _("Browser is not active"));
-		return FALSE;
-
-	}
-	avahi_service_browser_free (browser->priv->service_browser);
-	browser->priv->service_browser = NULL;
-
-	return TRUE;
-}
-
-static void
-rb_daap_mdns_browser_set_property (GObject      *object,
-				   guint	 prop_id,
-				   const GValue *value,
-				   GParamSpec   *pspec)
-{
-	switch (prop_id) {
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-rb_daap_mdns_browser_get_property (GObject	 *object,
-				   guint	  prop_id,
-				   GValue	 *value,
-				   GParamSpec	 *pspec)
-{
-	switch (prop_id) {
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-rb_daap_mdns_browser_class_init (RBDaapMdnsBrowserClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-	parent_class = g_type_class_peek_parent (klass);
-
-	object_class->finalize	   = rb_daap_mdns_browser_finalize;
-	object_class->get_property = rb_daap_mdns_browser_get_property;
-	object_class->set_property = rb_daap_mdns_browser_set_property;
-
-	signals [SERVICE_ADDED] =
-		g_signal_new ("service-added",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (RBDaapMdnsBrowserClass, service_added),
-			      NULL,
-			      NULL,
-			      rb_marshal_VOID__STRING_STRING_STRING_UINT_BOOLEAN,
-			      G_TYPE_NONE,
-			      5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_BOOLEAN);
-	signals [SERVICE_REMOVED] =
-		g_signal_new ("service-removed",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (RBDaapMdnsBrowserClass, service_removed),
-			      NULL,
-			      NULL,
-			      g_cclosure_marshal_VOID__STRING,
-			      G_TYPE_NONE,
-			      1, G_TYPE_STRING);
-
-	g_type_class_add_private (klass, sizeof (RBDaapMdnsBrowserPrivate));
-}
-
-static void
-rb_daap_mdns_browser_init (RBDaapMdnsBrowser *browser)
-{
-	browser->priv = RB_DAAP_MDNS_BROWSER_GET_PRIVATE (browser);
-
-	browser->priv->client = rb_daap_mdns_avahi_get_client ();
-}
-
-static void
-rb_daap_mdns_browser_finalize (GObject *object)
-{
-	RBDaapMdnsBrowser *browser;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (RB_IS_DAAP_MDNS_BROWSER (object));
-
-	browser = RB_DAAP_MDNS_BROWSER (object);
-
-	g_return_if_fail (browser->priv != NULL);
-
-	if (browser->priv->resolvers) {
-		g_slist_foreach (browser->priv->resolvers,
-				 (GFunc)avahi_service_resolver_free,
-				 NULL);
-		g_slist_free (browser->priv->resolvers);
-	}
-
-	if (browser->priv->service_browser) {
-		avahi_service_browser_free (browser->priv->service_browser);
-	}
-
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-RBDaapMdnsBrowser *
-rb_daap_mdns_browser_new (void)
-{
-	if (browser_object) {
-		g_object_ref (browser_object);
-	} else {
-		browser_object = g_object_new (RB_TYPE_DAAP_MDNS_BROWSER, NULL);
-		g_object_add_weak_pointer (browser_object,
-					   (gpointer *) &browser_object);
-	}
-
-	return RB_DAAP_MDNS_BROWSER (browser_object);
-}
diff --git a/plugins/daap/rb-daap-mdns-browser.h b/plugins/daap/rb-daap-mdns-browser.h
deleted file mode 100644
index 2962997..0000000
--- a/plugins/daap/rb-daap-mdns-browser.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- *  Header for abstraction of Multicast DNS for DAAP sharing
- *
- *  Copyright (C) 2005 Charles Schmidt <cschmidt2@emich.edu>
- *  Copyright (C) 2006 William Jon McCann <mccann@jhu.edu>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The Rhythmbox authors hereby grant permission for non-GPL compatible
- *  GStreamer plugins to be used and distributed together with GStreamer
- *  and Rhythmbox. This permission is above and beyond the permissions granted
- *  by the GPL license by which Rhythmbox is covered. If you modify this code
- *  you may extend this exception to your version of the code, but you are not
- *  obligated to do so. If you do not wish to do so, delete this exception
- *  statement from your version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#ifndef __RB_DAAP_MDNS_BROWSER_H
-#define __RB_DAAP_MDNS_BROWSER_H
-
-#include <glib.h>
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define RB_TYPE_DAAP_MDNS_BROWSER         (rb_daap_mdns_browser_get_type ())
-#define RB_DAAP_MDNS_BROWSER(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), RB_TYPE_DAAP_MDNS_BROWSER, RBDaapMdnsBrowser))
-#define RB_DAAP_MDNS_BROWSER_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), RB_TYPE_DAAP_MDNS_BROWSER, RBDaapMdnsBrowserClass))
-#define RB_IS_DAAP_MDNS_BROWSER(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), RB_TYPE_DAAP_MDNS_BROWSER))
-#define RB_IS_DAAP_MDNS_BROWSER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), RB_TYPE_DAAP_MDNS_BROWSER))
-#define RB_DAAP_MDNS_BROWSER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), RB_TYPE_DAAP_MDNS_BROWSER, RBDaapMdnsBrowserClass))
-
-typedef struct RBDaapMdnsBrowserPrivate RBDaapMdnsBrowserPrivate;
-
-typedef struct
-{
-	GObject object;
-
-	RBDaapMdnsBrowserPrivate *priv;
-} RBDaapMdnsBrowser;
-
-typedef struct
-{
-	GObjectClass parent_class;
-
-	void (* service_added)    (RBDaapMdnsBrowser *browser,
-				   const char        *service_name,
-				   const char        *name,
-				   const char        *host,
-				   guint              port,
-				   gboolean           password_protected);
-	void (* service_removed ) (RBDaapMdnsBrowser *browser,
-				   const char        *service_name);
-
-} RBDaapMdnsBrowserClass;
-
-typedef enum
-{
-	RB_DAAP_MDNS_BROWSER_ERROR_NOT_RUNNING,
-	RB_DAAP_MDNS_BROWSER_ERROR_FAILED,
-} RBDaapMdnsBrowserError;
-
-#define RB_DAAP_MDNS_BROWSER_ERROR rb_daap_mdns_browser_error_quark ()
-
-GQuark             rb_daap_mdns_browser_error_quark (void);
-
-GType              rb_daap_mdns_browser_get_type    (void);
-
-RBDaapMdnsBrowser *rb_daap_mdns_browser_new         (void);
-gboolean           rb_daap_mdns_browser_start       (RBDaapMdnsBrowser *browser,
-						     GError           **error);
-gboolean           rb_daap_mdns_browser_stop        (RBDaapMdnsBrowser *browser,
-						     GError           **error);
-
-G_END_DECLS
-
-#endif /* __RB_DAAP_MDNS_BROWSER_H */
diff --git a/plugins/daap/rb-daap-mdns-publisher-avahi.c b/plugins/daap/rb-daap-mdns-publisher-avahi.c
deleted file mode 100644
index ee4765a..0000000
--- a/plugins/daap/rb-daap-mdns-publisher-avahi.c
+++ /dev/null
@@ -1,423 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- *  Copyright (C) 2005 Charles Schmidt <cschmidt2@emich.edu>
- *  Copyright (C) 2006 William Jon McCann <mccann@jhu.edu>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * The Rhythmbox authors hereby grant permission for non-GPL compatible
- * GStreamer plugins to be used and distributed together with GStreamer
- * and Rhythmbox. This permission is above and beyond the permissions granted
- * by the GPL license by which Rhythmbox is covered. If you modify this code
- * you may extend this exception to your version of the code, but you are not
- * obligated to do so. If you do not wish to do so, delete this exception
- * statement from your version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <glib-object.h>
-
-#include <avahi-client/lookup.h>
-#include <avahi-client/publish.h>
-#include <avahi-client/client.h>
-#include <avahi-common/error.h>
-#include <avahi-glib/glib-malloc.h>
-#include <avahi-glib/glib-watch.h>
-
-#include "rb-daap-mdns-avahi.h"
-#include "rb-daap-mdns-publisher.h"
-#include "rb-debug.h"
-
-static void	rb_daap_mdns_publisher_class_init (RBDaapMdnsPublisherClass *klass);
-static void	rb_daap_mdns_publisher_init	  (RBDaapMdnsPublisher	    *publisher);
-static void	rb_daap_mdns_publisher_finalize   (GObject	            *object);
-
-#define RB_DAAP_MDNS_PUBLISHER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RB_TYPE_DAAP_MDNS_PUBLISHER, RBDaapMdnsPublisherPrivate))
-
-struct RBDaapMdnsPublisherPrivate
-{
-	AvahiClient     *client;
-	AvahiEntryGroup *entry_group;
-
-	char            *name;
-	guint            port;
-	gboolean         password_required;
-};
-
-enum {
-	PUBLISHED,
-	NAME_COLLISION,
-	LAST_SIGNAL
-};
-
-enum {
-	PROP_0
-};
-
-static guint	     signals [LAST_SIGNAL] = { 0, };
-
-G_DEFINE_TYPE (RBDaapMdnsPublisher, rb_daap_mdns_publisher, G_TYPE_OBJECT)
-
-static gpointer publisher_object = NULL;
-
-GQuark
-rb_daap_mdns_publisher_error_quark (void)
-{
-	static GQuark quark = 0;
-	if (!quark)
-		quark = g_quark_from_static_string ("rb_daap_mdns_publisher_error");
-
-	return quark;
-}
-
-static void
-entry_group_cb (AvahiEntryGroup     *group,
-		AvahiEntryGroupState state,
-		RBDaapMdnsPublisher *publisher)
-{
-	if (state == AVAHI_ENTRY_GROUP_ESTABLISHED) {
-
-		g_signal_emit (publisher, signals [PUBLISHED], 0, publisher->priv->name);
-
-	} else if (state == AVAHI_ENTRY_GROUP_COLLISION) {
-		g_warning ("MDNS name collision");
-
-		g_signal_emit (publisher, signals [NAME_COLLISION], 0, publisher->priv->name);
-	}
-}
-
-static gboolean
-create_service (RBDaapMdnsPublisher *publisher,
-		GError             **error)
-{
-	int         ret;
-	const char *txt_record;
-
-	if (publisher->priv->entry_group == NULL) {
-		publisher->priv->entry_group = avahi_entry_group_new (publisher->priv->client,
-								      (AvahiEntryGroupCallback)entry_group_cb,
-								      publisher);
-		rb_daap_mdns_avahi_set_entry_group (publisher->priv->entry_group);
-	} else {
-		avahi_entry_group_reset (publisher->priv->entry_group);
-	}
-
-	if (publisher->priv->entry_group == NULL) {
-		rb_debug ("Could not create AvahiEntryGroup for publishing");
-		g_set_error (error,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR_FAILED,
-			     "%s",
-			     _("Could not create AvahiEntryGroup for publishing"));
-		return FALSE;
-	}
-
-#if 0
-	g_message ("Service name:%s port:%u password:%d",
-		   publisher->priv->name,
-		   publisher->priv->port,
-		   publisher->priv->password_required);
-#endif
-
-	if (publisher->priv->password_required) {
-		txt_record = "Password=true";
-	} else {
-		txt_record = "Password=false";
-	}
-
-	ret = avahi_entry_group_add_service (publisher->priv->entry_group,
-					     AVAHI_IF_UNSPEC,
-					     AVAHI_PROTO_UNSPEC,
-					     0,
-					     publisher->priv->name,
-					     "_daap._tcp",
-					     NULL,
-					     NULL,
-					     publisher->priv->port,
-					     txt_record,
-					     NULL);
-
-	if (ret < 0) {
-		g_set_error (error,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR_FAILED,
-			     "%s: %s",
-			     _("Could not add service"),
-			     avahi_strerror (ret));
-		return FALSE;
-	}
-
-	ret = avahi_entry_group_commit (publisher->priv->entry_group);
-
-	if (ret < 0) {
-		g_set_error (error,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR_FAILED,
-			     "%s: %s",
-			     _("Could not commit service"),
-			     avahi_strerror (ret));
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-static gboolean
-refresh_service (RBDaapMdnsPublisher *publisher,
-		 GError             **error)
-{
-	return create_service (publisher, error);
-}
-
-static gboolean
-publisher_set_name_internal (RBDaapMdnsPublisher *publisher,
-			     const char          *name,
-			     GError             **error)
-{
-	g_free (publisher->priv->name);
-	publisher->priv->name = g_strdup (name);
-
-	return TRUE;
-}
-
-gboolean
-rb_daap_mdns_publisher_set_name (RBDaapMdnsPublisher *publisher,
-				 const char          *name,
-				 GError             **error)
-{
-        g_return_val_if_fail (publisher != NULL, FALSE);
-
-	publisher_set_name_internal (publisher, name, error);
-
-	if (publisher->priv->entry_group) {
-		refresh_service (publisher, error);
-	}
-
-	return TRUE;
-}
-
-static gboolean
-publisher_set_port_internal (RBDaapMdnsPublisher *publisher,
-			     guint                port,
-			     GError             **error)
-{
-	publisher->priv->port = port;
-
-	return TRUE;
-}
-
-gboolean
-rb_daap_mdns_publisher_set_port (RBDaapMdnsPublisher *publisher,
-				 guint                port,
-				 GError             **error)
-{
-        g_return_val_if_fail (publisher != NULL, FALSE);
-
-	publisher_set_port_internal (publisher, port, error);
-
-	if (publisher->priv->entry_group) {
-		refresh_service (publisher, error);
-	}
-
-	return TRUE;
-}
-
-static gboolean
-publisher_set_password_required_internal (RBDaapMdnsPublisher *publisher,
-					  gboolean             required,
-					  GError             **error)
-{
-	publisher->priv->password_required = required;
-	return TRUE;
-}
-
-gboolean
-rb_daap_mdns_publisher_set_password_required (RBDaapMdnsPublisher *publisher,
-					      gboolean             required,
-					      GError             **error)
-{
-        g_return_val_if_fail (publisher != NULL, FALSE);
-
-	publisher_set_password_required_internal (publisher, required, error);
-
-	if (publisher->priv->entry_group) {
-		refresh_service (publisher, error);
-	}
-
-	return TRUE;
-}
-
-gboolean
-rb_daap_mdns_publisher_publish (RBDaapMdnsPublisher *publisher,
-				const char          *name,
-				guint                port,
-				gboolean             password_required,
-				GError             **error)
-{
-	if (publisher->priv->client == NULL) {
-                g_set_error (error,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR_NOT_RUNNING,
-                             "%s",
-                             _("The avahi mDNS service is not running"));
-		return FALSE;
-	}
-
-	publisher_set_name_internal (publisher, name, NULL);
-	publisher_set_port_internal (publisher, port, NULL);
-	publisher_set_password_required_internal (publisher, password_required, NULL);
-
-	return create_service (publisher, error);
-}
-
-gboolean
-rb_daap_mdns_publisher_withdraw (RBDaapMdnsPublisher *publisher,
-				 GError             **error)
-{
-	if (publisher->priv->client == NULL) {
-                g_set_error (error,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR_NOT_RUNNING,
-                             "%s",
-                             _("The avahi mDNS service is not running"));
-		return FALSE;
-	}
-
-	if (publisher->priv->entry_group == NULL) {
-                g_set_error (error,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR,
-			     RB_DAAP_MDNS_PUBLISHER_ERROR_FAILED,
-                             "%s",
-                             _("The mDNS service is not published"));
-		return FALSE;
-	}
-
-	avahi_entry_group_reset (publisher->priv->entry_group);
-	avahi_entry_group_free (publisher->priv->entry_group);
-	publisher->priv->entry_group = NULL;
-	rb_daap_mdns_avahi_set_entry_group (NULL);
-
-	return TRUE;
-}
-
-static void
-rb_daap_mdns_publisher_set_property (GObject	  *object,
-				     guint	   prop_id,
-				     const GValue *value,
-				     GParamSpec	  *pspec)
-{
-	switch (prop_id) {
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-rb_daap_mdns_publisher_get_property (GObject	 *object,
-				     guint	  prop_id,
-				     GValue	 *value,
-				     GParamSpec	 *pspec)
-{
-	switch (prop_id) {
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-rb_daap_mdns_publisher_class_init (RBDaapMdnsPublisherClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-	object_class->finalize	   = rb_daap_mdns_publisher_finalize;
-	object_class->get_property = rb_daap_mdns_publisher_get_property;
-	object_class->set_property = rb_daap_mdns_publisher_set_property;
-
-	signals [PUBLISHED] =
-		g_signal_new ("published",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (RBDaapMdnsPublisherClass, published),
-			      NULL,
-			      NULL,
-			      g_cclosure_marshal_VOID__STRING,
-			      G_TYPE_NONE,
-			      1, G_TYPE_STRING);
-	signals [NAME_COLLISION] =
-		g_signal_new ("name-collision",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (RBDaapMdnsPublisherClass, name_collision),
-			      NULL,
-			      NULL,
-			      g_cclosure_marshal_VOID__STRING,
-			      G_TYPE_NONE,
-			      1, G_TYPE_STRING);
-
-	g_type_class_add_private (klass, sizeof (RBDaapMdnsPublisherPrivate));
-}
-
-static void
-rb_daap_mdns_publisher_init (RBDaapMdnsPublisher *publisher)
-{
-	publisher->priv = RB_DAAP_MDNS_PUBLISHER_GET_PRIVATE (publisher);
-
-	publisher->priv->client = rb_daap_mdns_avahi_get_client ();
-}
-
-static void
-rb_daap_mdns_publisher_finalize (GObject *object)
-{
-	RBDaapMdnsPublisher *publisher;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (RB_IS_DAAP_MDNS_PUBLISHER (object));
-
-	publisher = RB_DAAP_MDNS_PUBLISHER (object);
-
-	g_return_if_fail (publisher->priv != NULL);
-
-	if (publisher->priv->entry_group) {
-		avahi_entry_group_free (publisher->priv->entry_group);
-		rb_daap_mdns_avahi_set_entry_group (NULL);
-	}
-
-	g_free (publisher->priv->name);
-
-	G_OBJECT_CLASS (rb_daap_mdns_publisher_parent_class)->finalize (object);
-}
-
-RBDaapMdnsPublisher *
-rb_daap_mdns_publisher_new (void)
-{
-	if (publisher_object) {
-		g_object_ref (publisher_object);
-	} else {
-		publisher_object = g_object_new (RB_TYPE_DAAP_MDNS_PUBLISHER, NULL);
-		g_object_add_weak_pointer (publisher_object,
-					   (gpointer *) &publisher_object);
-	}
-
-	return RB_DAAP_MDNS_PUBLISHER (publisher_object);
-}
diff --git a/plugins/daap/rb-daap-mdns-publisher.h b/plugins/daap/rb-daap-mdns-publisher.h
deleted file mode 100644
index b429432..0000000
--- a/plugins/daap/rb-daap-mdns-publisher.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- *  Header for abstraction of Multicast DNS for DAAP sharing
- *
- *  Copyright (C) 2005 Charles Schmidt <cschmidt2@emich.edu>
- *  Copyright (C) 2006 William Jon McCann <mccann@jhu.edu>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The Rhythmbox authors hereby grant permission for non-GPL compatible
- *  GStreamer plugins to be used and distributed together with GStreamer
- *  and Rhythmbox. This permission is above and beyond the permissions granted
- *  by the GPL license by which Rhythmbox is covered. If you modify this code
- *  you may extend this exception to your version of the code, but you are not
- *  obligated to do so. If you do not wish to do so, delete this exception
- *  statement from your version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#ifndef __RB_DAAP_MDNS_PUBLISHER_H
-#define __RB_DAAP_MDNS_PUBLISHER_H
-
-#include <glib.h>
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define RB_TYPE_DAAP_MDNS_PUBLISHER         (rb_daap_mdns_publisher_get_type ())
-#define RB_DAAP_MDNS_PUBLISHER(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), RB_TYPE_DAAP_MDNS_PUBLISHER, RBDaapMdnsPublisher))
-#define RB_DAAP_MDNS_PUBLISHER_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), RB_TYPE_DAAP_MDNS_PUBLISHER, RBDaapMdnsPublisherClass))
-#define RB_IS_DAAP_MDNS_PUBLISHER(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), RB_TYPE_DAAP_MDNS_PUBLISHER))
-#define RB_IS_DAAP_MDNS_PUBLISHER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), RB_TYPE_DAAP_MDNS_PUBLISHER))
-#define RB_DAAP_MDNS_PUBLISHER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), RB_TYPE_DAAP_MDNS_PUBLISHER, RBDaapMdnsPublisherClass))
-
-typedef struct RBDaapMdnsPublisherPrivate RBDaapMdnsPublisherPrivate;
-
-typedef struct
-{
-	GObject object;
-
-	RBDaapMdnsPublisherPrivate *priv;
-} RBDaapMdnsPublisher;
-
-typedef struct
-{
-	GObjectClass parent_class;
-
-	void (* published)         (RBDaapMdnsPublisher *publisher,
-				    const char          *name);
-	void (* name_collision)    (RBDaapMdnsPublisher *publisher,
-				    const char          *name);
-} RBDaapMdnsPublisherClass;
-
-typedef enum
-{
-	RB_DAAP_MDNS_PUBLISHER_ERROR_NOT_RUNNING,
-	RB_DAAP_MDNS_PUBLISHER_ERROR_FAILED,
-} RBDaapMdnsPublisherError;
-
-#define RB_DAAP_MDNS_PUBLISHER_ERROR rb_daap_mdns_publisher_error_quark ()
-
-GQuark      rb_daap_mdns_publisher_error_quark                     (void);
-
-GType       rb_daap_mdns_publisher_get_type                        (void);
-
-RBDaapMdnsPublisher *rb_daap_mdns_publisher_new                    (void);
-gboolean             rb_daap_mdns_publisher_publish                (RBDaapMdnsPublisher *publisher,
-								    const char          *name,
-								    guint                port,
-								    gboolean             password_required,
-								    GError             **error);
-gboolean             rb_daap_mdns_publisher_set_name               (RBDaapMdnsPublisher *publisher,
-								    const char          *name,
-								    GError             **error);
-gboolean             rb_daap_mdns_publisher_set_port               (RBDaapMdnsPublisher *publisher,
-								    guint                port,
-								    GError             **error);
-gboolean             rb_daap_mdns_publisher_set_password_required  (RBDaapMdnsPublisher *publisher,
-								    gboolean             required,
-								    GError             **error);
-gboolean             rb_daap_mdns_publisher_withdraw               (RBDaapMdnsPublisher *publisher,
-								    GError             **error);
-
-G_END_DECLS
-
-#endif /* __RB_DAAP_MDNS_PUBLISHER_H */
diff --git a/plugins/daap/rb-daap-plugin.c b/plugins/daap/rb-daap-plugin.c
index 52edc7c..2a458eb 100644
--- a/plugins/daap/rb-daap-plugin.c
+++ b/plugins/daap/rb-daap-plugin.c
@@ -53,7 +53,7 @@
 #include "rb-daap-src.h"
 #include "rb-uri-dialog.h"
 
-#include "rb-daap-mdns-browser.h"
+#include <libdmapsharing/dmap.h>
 
 /* preferences */
 #define CONF_DAAP_PREFIX  	CONF_PREFIX "/plugins/daap"
@@ -74,7 +74,7 @@ struct RBDaapPluginPrivate
 	GtkActionGroup *daap_action_group;
 	guint daap_ui_merge_id;
 
-	RBDaapMdnsBrowser *mdns_browser;
+	DMAPMdnsBrowser *mdns_browser;
 
 	GHashTable *source_lookup;
 
@@ -450,33 +450,33 @@ find_source_by_service_name (RBDaapPlugin *plugin,
 }
 
 static void
-mdns_service_added (RBDaapMdnsBrowser *browser,
-		    const char        *service_name,
-		    const char        *name,
-		    const char        *host,
-		    guint              port,
-		    gboolean           password_protected,
-		    RBDaapPlugin      *plugin)
+mdns_service_added (DMAPMdnsBrowser *browser,
+		    DMAPMdnsBrowserService *service,
+		    RBDaapPlugin	*plugin)
 {
 	RBSource *source;
 
 	rb_debug ("New service: %s name=%s host=%s port=%u password=%d",
-		   service_name, name, host, port, password_protected);
+		   service->service_name,
+		   service->name,
+		   service->host,
+		   service->port,
+		   service->password_protected);
 
 	GDK_THREADS_ENTER ();
 
-	source = find_source_by_service_name (plugin, service_name);
+	source = find_source_by_service_name (plugin, service->service_name);
 
 	if (source == NULL) {
-		source = rb_daap_source_new (plugin->priv->shell, RB_PLUGIN (plugin), service_name, name, host, port, password_protected);
-		g_hash_table_insert (plugin->priv->source_lookup, g_strdup (service_name), source);
+		source = rb_daap_source_new (plugin->priv->shell, RB_PLUGIN (plugin), service->service_name, service->name, service->host, service->port, service->password_protected);
+		g_hash_table_insert (plugin->priv->source_lookup, g_strdup (service->service_name), source);
 		rb_shell_append_source (plugin->priv->shell, source, NULL);
 	} else {
 		g_object_set (G_OBJECT (source),
-			      "name", name,
-			      "host", host,
-			      "port", port,
-			      "password-protected", password_protected,
+			      "name", service->name,
+			      "host", service->host,
+			      "port", service->port,
+			      "password-protected", service->password_protected,
 			      NULL);
 	}
 
@@ -484,7 +484,7 @@ mdns_service_added (RBDaapMdnsBrowser *browser,
 }
 
 static void
-mdns_service_removed (RBDaapMdnsBrowser *browser,
+mdns_service_removed (DMAPMdnsBrowser *browser,
 		      const char        *service_name,
 		      RBDaapPlugin	*plugin)
 {
@@ -525,7 +525,7 @@ start_browsing (RBDaapPlugin *plugin)
 		return;
 	}
 
-	plugin->priv->mdns_browser = rb_daap_mdns_browser_new ();
+	plugin->priv->mdns_browser = dmap_mdns_browser_new (DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP);
 	if (plugin->priv->mdns_browser == NULL) {
 		g_warning ("Unable to start mDNS browsing");
 		return;
@@ -543,7 +543,7 @@ start_browsing (RBDaapPlugin *plugin)
 				 0);
 
 	error = NULL;
-	rb_daap_mdns_browser_start (plugin->priv->mdns_browser, &error);
+	dmap_mdns_browser_start (plugin->priv->mdns_browser, &error);
 	if (error != NULL) {
 		g_warning ("Unable to start mDNS browsing: %s", error->message);
 		g_error_free (error);
@@ -573,7 +573,7 @@ stop_browsing (RBDaapPlugin *plugin)
 	g_signal_handlers_disconnect_by_func (plugin->priv->mdns_browser, mdns_service_removed, plugin);
 
 	error = NULL;
-	rb_daap_mdns_browser_stop (plugin->priv->mdns_browser, &error);
+	dmap_mdns_browser_stop (plugin->priv->mdns_browser, &error);
 	if (error != NULL) {
 		g_warning ("Unable to stop mDNS browsing: %s", error->message);
 		g_error_free (error);
@@ -630,6 +630,7 @@ new_daap_share_location_added_cb (RBURIDialog *dialog,
 	char *host;
 	char *p;
 	int port = 3689;
+	DMAPMdnsBrowserService service;
 
 	host = g_strdup (location);
 	p = strrchr (host, ':');
@@ -639,12 +640,12 @@ new_daap_share_location_added_cb (RBURIDialog *dialog,
 	}
 
 	rb_debug ("adding manually specified DAAP share at %s", location);
+	service.name = (char *) location;
+	service.host = (char *) location;
+	service.port = port;
+	service.password_protected = FALSE;
 	mdns_service_added (NULL,
-			    g_strdup (location),
-			    g_strdup (location),
-			    g_strdup (host),
-			    port,
-			    FALSE,
+			    &service,
 			    plugin);
 
 	g_free (host);
@@ -902,6 +903,7 @@ impl_create_configure_dialog (RBPlugin *bplugin)
 gboolean
 rb_daap_add_source (RBDaapPlugin *plugin, gchar *service_name, gchar *host, unsigned int port, GError **error)
 {
+	DMAPMdnsBrowserService service;
 
 	if (plugin->priv->shutdown)
 		return FALSE;
@@ -909,12 +911,12 @@ rb_daap_add_source (RBDaapPlugin *plugin, gchar *service_name, gchar *host, unsi
 	rb_debug ("Add DAAP source %s (%s:%d)", service_name, host, port);
 
 	rb_debug ("adding manually specified DAAP share at %s", service_name);
+	service.name = service_name;
+	service.host = host;
+	service.port = port;
+	service.password_protected = FALSE;
 	mdns_service_added (NULL,
-			    g_strdup (service_name),
-			    g_strdup (service_name),
-			    g_strdup (host),
-			    port,
-			    FALSE,
+			    &service,
 			    plugin);
 
 	return TRUE;
diff --git a/plugins/daap/rb-daap-record-factory.c b/plugins/daap/rb-daap-record-factory.c
new file mode 100644
index 0000000..22dfa6b
--- /dev/null
+++ b/plugins/daap/rb-daap-record-factory.c
@@ -0,0 +1,68 @@
+/*
+ * DAAPRecord factory class
+ *
+ * Copyright (C) 2008 W. Michael Petullo <mike@flyn.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "rhythmdb.h"
+#include "rb-daap-record-factory.h"
+#include "rb-daap-record.h"
+
+DMAPRecord *
+rb_daap_record_factory_create  (DMAPRecordFactory *factory,
+				gpointer user_data)
+{
+	DAAPRecord *record;
+
+	record = DAAP_RECORD (rb_daap_record_new ((RhythmDBEntry *) user_data));
+
+	return (DMAP_RECORD (record));
+}
+
+static void
+rb_daap_record_factory_init (RBDAAPRecordFactory *factory)
+{
+}
+
+static void
+rb_daap_record_factory_class_init (RBDAAPRecordFactoryClass *klass)
+{
+}
+
+static void
+rb_daap_record_factory_interface_init (gpointer iface, gpointer data)
+{
+	DMAPRecordFactoryInterface *factory = iface;
+
+	g_assert (G_TYPE_FROM_INTERFACE (factory) == TYPE_DMAP_RECORD_FACTORY);
+
+	factory->create = rb_daap_record_factory_create;
+}
+
+G_DEFINE_TYPE_WITH_CODE (RBDAAPRecordFactory, rb_daap_record_factory, G_TYPE_OBJECT, 
+			 G_IMPLEMENT_INTERFACE (TYPE_DMAP_RECORD_FACTORY,
+					        rb_daap_record_factory_interface_init))
+
+RBDAAPRecordFactory *
+rb_daap_record_factory_new (void)
+{
+	RBDAAPRecordFactory *factory;
+
+	factory = RB_DAAP_RECORD_FACTORY (g_object_new (TYPE_RB_DAAP_RECORD_FACTORY, NULL));
+
+	return factory;
+}
diff --git a/plugins/daap/rb-daap-record-factory.h b/plugins/daap/rb-daap-record-factory.h
new file mode 100644
index 0000000..7806884
--- /dev/null
+++ b/plugins/daap/rb-daap-record-factory.h
@@ -0,0 +1,58 @@
+/*
+ * RBDAAPRecord factory class
+ *
+ * Copyright (C) 2008 W. Michael Petullo <mike@flyn.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RB_DAAP_RECORD_FACTORY
+#define __RB_DAAP_RECORD_FACTORY
+
+#include <libdmapsharing/dmap.h>
+
+G_BEGIN_DECLS
+
+#define TYPE_RB_DAAP_RECORD_FACTORY         (rb_daap_record_factory_get_type ())
+#define RB_DAAP_RECORD_FACTORY(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), \
+				               TYPE_RB_DAAP_RECORD_FACTORY, RBDAAPRecordFactory))
+#define RB_DAAP_RECORD_FACTORY_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), \
+				               TYPE_RB_DAAP_RECORD_FACTORY, RBDAAPRecordFactoryClass))
+#define IS_RB_DAAP_RECORD_FACTORY(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
+				               TYPE_RB_DAAP_RECORD_FACTORY))
+#define IS_RB_DAAP_RECORD_FACTORY_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), \
+				               TYPE_RB_DAAP_RECORD_FACTORY_CLASS))
+#define RB_DAAP_RECORD_FACTORY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), \
+				               TYPE_RB_DAAP_RECORD_FACTORY, RBDAAPRecordFactoryClass))
+
+typedef struct RBDAAPRecordFactoryPrivate RBDAAPRecordFactoryPrivate;
+
+typedef struct {
+	GObject parent;
+} RBDAAPRecordFactory;
+
+typedef struct {
+	GObjectClass parent;
+} RBDAAPRecordFactoryClass;
+
+GType                  rb_daap_record_factory_get_type (void);
+
+RBDAAPRecordFactory *rb_daap_record_factory_new      (void);
+
+DMAPRecord            *rb_daap_record_factory_create   (DMAPRecordFactory *factory, gpointer user_data);
+
+#endif /* __RB_DAAP_RECORD_FACTORY */
+
+G_END_DECLS
diff --git a/plugins/daap/rb-daap-record.c b/plugins/daap/rb-daap-record.c
new file mode 100644
index 0000000..42add74
--- /dev/null
+++ b/plugins/daap/rb-daap-record.c
@@ -0,0 +1,377 @@
+/*
+ *  Database record class for DAAP sharing
+ *
+ *  Copyright (C) 2008 W. Michael Petullo <mike@flyn.org>
+ *
+ * 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "rhythmdb.h"
+#include "rb-daap-record.h"
+
+struct RBDAAPRecordPrivate {
+	guint64 filesize;
+	char *location;
+	char *format;	 /* Format, possibly after transcoding. */
+	char *real_format;
+	char *title;
+	char *album;
+	char *artist;
+	char *genre;
+	gboolean has_video;
+	gint rating;
+	gint32 duration;
+	gint32 track;
+	gint32 year;
+	gint32 firstseen;
+	gint32 mtime;
+	gint32 disc;
+	gint32 bitrate;
+};
+
+enum {
+	PROP_0,
+	PROP_LOCATION,
+	PROP_TITLE,
+	PROP_RATING,
+	PROP_FILESIZE,
+	PROP_ALBUM,
+	PROP_ARTIST,
+	PROP_GENRE,
+	PROP_FORMAT,
+	PROP_DURATION,
+	PROP_TRACK,
+	PROP_YEAR,
+	PROP_FIRSTSEEN,
+	PROP_MTIME,
+	PROP_DISC,
+	PROP_BITRATE,
+	PROP_HAS_VIDEO,
+	PROP_REAL_FORMAT
+};
+
+static void
+rb_daap_record_set_property (GObject *object,
+				guint prop_id,
+				const GValue *value,
+				GParamSpec *pspec)
+{
+	RBDAAPRecord *record = RB_DAAP_RECORD (object);
+
+	switch (prop_id) {
+		case PROP_LOCATION:
+			g_free (record->priv->location);
+			record->priv->location = g_value_dup_string (value);
+			break;
+		case PROP_TITLE:
+			g_free (record->priv->title);
+			record->priv->title = g_value_dup_string (value);
+			break;
+		case PROP_ALBUM:
+			g_free (record->priv->album);
+			record->priv->album = g_value_dup_string (value);
+			break;
+		case PROP_ARTIST:
+			g_free (record->priv->artist);
+			record->priv->artist = g_value_dup_string (value);
+			break;
+		case PROP_GENRE:
+			g_free (record->priv->genre);
+			record->priv->genre = g_value_dup_string (value);
+			break;
+		case PROP_FORMAT:
+			g_free (record->priv->format);
+			record->priv->format = g_value_dup_string (value);
+			break;
+		case PROP_RATING:
+			record->priv->rating = g_value_get_int (value);
+			break;
+		case PROP_FILESIZE:
+			record->priv->filesize = g_value_get_uint64 (value);
+			break;
+		case PROP_DURATION:
+			record->priv->duration = g_value_get_int (value);
+			break;
+		case PROP_TRACK:
+			record->priv->track = g_value_get_int (value);
+			break;
+		case PROP_YEAR:
+			record->priv->year = g_value_get_int (value);
+			break;
+		case PROP_FIRSTSEEN:
+			record->priv->firstseen = g_value_get_int (value);
+			break;
+		case PROP_MTIME:
+			record->priv->mtime = g_value_get_int (value);
+			break;
+		case PROP_DISC:
+			record->priv->disc = g_value_get_int (value);
+			break;
+		case PROP_BITRATE:
+			record->priv->bitrate = g_value_get_long (value);
+			break;
+		case PROP_HAS_VIDEO:
+			record->priv->has_video = g_value_get_boolean (value);
+			break;
+		case PROP_REAL_FORMAT:
+			g_free (record->priv->real_format);
+			record->priv->real_format = g_value_dup_string (value);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+			break;
+	}
+}
+
+static void
+rb_daap_record_get_property (GObject *object,
+				guint prop_id,
+				GValue *value,
+				GParamSpec *pspec)
+{
+	RBDAAPRecord *record = RB_DAAP_RECORD (object);
+
+	switch (prop_id) {
+		case PROP_LOCATION:
+			g_value_set_string (value, record->priv->location);
+			break;
+		case PROP_TITLE:
+			g_value_set_string (value, record->priv->title);
+			break;
+		case PROP_ALBUM:
+			g_value_set_string (value, record->priv->album);
+			break;
+		case PROP_ARTIST:
+			g_value_set_string (value, record->priv->artist);
+			break;
+		case PROP_GENRE:
+			g_value_set_string (value, record->priv->genre);
+			break;
+		case PROP_FORMAT:
+			g_value_set_string (value, record->priv->format);
+			break;
+		case PROP_RATING:
+			g_value_set_int (value, record->priv->rating);
+			break;
+		case PROP_FILESIZE:
+			g_value_set_uint64 (value, record->priv->filesize);
+			break;
+		case PROP_DURATION:
+			g_value_set_int (value, record->priv->duration);
+			break;
+		case PROP_TRACK:
+			g_value_set_int (value, record->priv->track);
+			break;
+		case PROP_YEAR:
+			g_value_set_int (value, record->priv->year);
+			break;
+		case PROP_FIRSTSEEN:
+			g_value_set_int (value, record->priv->firstseen);
+			break;
+		case PROP_MTIME:
+			g_value_set_int (value, record->priv->mtime);
+			break;
+		case PROP_DISC:
+			g_value_set_int (value, record->priv->disc);
+			break;
+		case PROP_BITRATE:
+			g_value_set_long (value, record->priv->bitrate);
+			break;
+		case PROP_HAS_VIDEO:
+			g_value_set_boolean (value, record->priv->has_video);
+			break;
+		case PROP_REAL_FORMAT:
+			g_value_set_string (value, record->priv->real_format);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+			break;
+	}
+}
+
+gboolean rb_daap_record_itunes_compat (DAAPRecord *record)
+{
+	const gchar *format = RB_DAAP_RECORD (record)->priv->real_format;
+
+	if (! strcmp (format, "mp3"))
+		return TRUE;
+	else
+		return FALSE;
+}
+
+GInputStream *rb_daap_record_read (DAAPRecord *record, GError **error)
+{
+	GFile *file;
+	GInputStream *fnval = NULL;
+
+	file = g_file_new_for_uri (RB_DAAP_RECORD (record)->priv->location);
+	fnval = G_INPUT_STREAM (g_file_read (file, NULL, error));
+
+	return fnval;
+}
+
+static void rb_daap_record_init (RBDAAPRecord *record)
+{
+	record->priv = RB_DAAP_RECORD_GET_PRIVATE (record);
+}
+
+static void rb_daap_record_finalize (GObject *object);
+
+static void rb_daap_record_class_init (RBDAAPRecordClass *klass)
+{
+	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+	g_type_class_add_private (klass, sizeof (RBDAAPRecordPrivate));
+
+	gobject_class->set_property = rb_daap_record_set_property;	
+	gobject_class->get_property = rb_daap_record_get_property;	
+	gobject_class->finalize     = rb_daap_record_finalize;	
+
+	g_object_class_override_property (gobject_class, PROP_LOCATION, "location");
+	g_object_class_override_property (gobject_class, PROP_TITLE, "title");
+	g_object_class_override_property (gobject_class, PROP_ALBUM, "album");
+	g_object_class_override_property (gobject_class, PROP_ARTIST, "artist");
+	g_object_class_override_property (gobject_class, PROP_GENRE, "genre");
+	g_object_class_override_property (gobject_class, PROP_FORMAT, "format");
+	g_object_class_override_property (gobject_class, PROP_RATING, "rating");
+	g_object_class_override_property (gobject_class, PROP_FILESIZE, "filesize");
+	g_object_class_override_property (gobject_class, PROP_DURATION, "duration");
+	g_object_class_override_property (gobject_class, PROP_TRACK, "track");
+	g_object_class_override_property (gobject_class, PROP_YEAR, "year");
+	g_object_class_override_property (gobject_class, PROP_FIRSTSEEN, "firstseen");
+	g_object_class_override_property (gobject_class, PROP_MTIME, "mtime");
+	g_object_class_override_property (gobject_class, PROP_DISC, "disc");
+	g_object_class_override_property (gobject_class, PROP_BITRATE, "bitrate");
+	g_object_class_override_property (gobject_class, PROP_HAS_VIDEO, "has-video");
+
+	g_object_class_install_property (gobject_class, PROP_REAL_FORMAT,
+	                        g_param_spec_string ("real-format",
+			     "Real format of song data",
+			     "Real format of song data",
+			       NULL,
+			    G_PARAM_READWRITE));
+}
+
+static void rb_daap_record_daap_iface_init (gpointer iface, gpointer data)
+{
+	DAAPRecordInterface *daap_record = iface;
+
+	g_assert (G_TYPE_FROM_INTERFACE (daap_record) == TYPE_DAAP_RECORD);
+
+	daap_record->itunes_compat = rb_daap_record_itunes_compat;
+	daap_record->read = rb_daap_record_read;
+}
+
+static void rb_daap_record_dmap_iface_init (gpointer iface, gpointer data)
+{
+	DMAPRecordInterface *dmap_record = iface;
+
+	g_assert (G_TYPE_FROM_INTERFACE (dmap_record) == TYPE_DMAP_RECORD);
+}
+
+G_DEFINE_TYPE_WITH_CODE (RBDAAPRecord, rb_daap_record, G_TYPE_OBJECT, 
+			 G_IMPLEMENT_INTERFACE (TYPE_DAAP_RECORD, rb_daap_record_daap_iface_init)
+			 G_IMPLEMENT_INTERFACE (TYPE_DMAP_RECORD, rb_daap_record_dmap_iface_init))
+
+static void rb_daap_record_finalize (GObject *object)
+{
+	RBDAAPRecord *record = RB_DAAP_RECORD (object);
+
+        g_free (record->priv->location);
+	g_free (record->priv->title);
+	g_free (record->priv->format);
+	g_free (record->priv->album);
+	g_free (record->priv->artist);
+	g_free (record->priv->genre);
+	g_free (record->priv->real_format);
+
+	G_OBJECT_CLASS (rb_daap_record_parent_class)->finalize (object);
+}
+
+
+RBDAAPRecord *rb_daap_record_new (RhythmDBEntry *entry)
+{
+	RBDAAPRecord *record = NULL;
+	record = RB_DAAP_RECORD (g_object_new (TYPE_RB_DAAP_RECORD, NULL));
+
+	/* FIXME: when browsing, entry will be NULL because we will pull
+	 * the metadata from the DAAP query. When sharing entry will point
+	 * to an existing entry from the Rhythmbox DB. Where should this
+	 * differentiation be handled?
+	 */
+	if (entry) {
+		gchar *ext;
+
+		record->priv->filesize = rhythmdb_entry_get_uint64 
+						(entry, RHYTHMDB_PROP_FILE_SIZE);
+
+		record->priv->location = g_strdup (rhythmdb_entry_get_string
+						(entry, RHYTHMDB_PROP_LOCATION));
+
+		record->priv->title    = g_strdup (rhythmdb_entry_get_string
+						(entry, RHYTHMDB_PROP_TITLE));
+
+		record->priv->artist   = g_strdup (rhythmdb_entry_get_string
+						(entry, RHYTHMDB_PROP_ARTIST));
+
+		record->priv->album    = g_strdup (rhythmdb_entry_get_string
+						(entry, RHYTHMDB_PROP_ALBUM));
+
+		record->priv->genre    = g_strdup (rhythmdb_entry_get_string
+						(entry, RHYTHMDB_PROP_GENRE));
+
+		/* FIXME: Support transcoding: */
+		/* FIXME: we should use RHYTHMDB_PROP_MIMETYPE instead */
+		ext = strrchr (record->priv->location, '.');
+		if (ext == NULL) {
+			ext = "mp3";
+		} else {
+			ext++;
+		}
+		record->priv->real_format = g_strdup (ext);
+		record->priv->format = g_strdup (record->priv->real_format);
+
+		record->priv->track    = rhythmdb_entry_get_ulong
+						(entry, RHYTHMDB_PROP_TRACK_NUMBER);
+
+		record->priv->duration = rhythmdb_entry_get_ulong
+						(entry, RHYTHMDB_PROP_DURATION);
+
+		record->priv->rating   = (gint) rhythmdb_entry_get_double
+						(entry, RHYTHMDB_PROP_RATING);
+
+		record->priv->year     = rhythmdb_entry_get_ulong
+						(entry, RHYTHMDB_PROP_YEAR);
+
+		record->priv->firstseen = rhythmdb_entry_get_ulong
+						(entry, RHYTHMDB_PROP_FIRST_SEEN);
+
+		record->priv->mtime     = rhythmdb_entry_get_ulong
+						(entry, RHYTHMDB_PROP_MTIME);
+
+		record->priv->disc      = rhythmdb_entry_get_ulong
+						(entry, RHYTHMDB_PROP_DISC_NUMBER);
+
+		record->priv->bitrate   = rhythmdb_entry_get_ulong
+						(entry, RHYTHMDB_PROP_BITRATE);
+	}
+
+	return record;
+}
diff --git a/plugins/daap/rb-daap-record.h b/plugins/daap/rb-daap-record.h
new file mode 100644
index 0000000..e193d00
--- /dev/null
+++ b/plugins/daap/rb-daap-record.h
@@ -0,0 +1,63 @@
+/*
+ *  Database record class for DAAP sharing
+ *
+ *  Copyright (C) 2008 W. Michael Petullo <mike@flyn.org>
+ *
+ * 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef __RB_DAAP_RECORD
+#define __RB_DAAP_RECORD
+
+#include <libdmapsharing/dmap.h>
+
+G_BEGIN_DECLS
+
+#define TYPE_RB_DAAP_RECORD         (rb_daap_record_get_type ())
+#define RB_DAAP_RECORD(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_RB_DAAP_RECORD, RBDAAPRecord))
+#define RB_DAAP_RECORD_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), TYPE_RB_DAAP_RECORD, RBDAAPRecordClass))
+#define IS_RB_DAAP_RECORD(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_RB_DAAP_RECORD))
+#define IS_RB_DAAP_RECORD_CLASS (k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_RB_DAAP_RECORD_CLASS))
+#define RB_DAAP_RECORD_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_RB_DAAP_RECORD, RBDAAPRecordClass))
+#define RB_DAAP_RECORD_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_RB_DAAP_RECORD, RBDAAPRecordPrivate))
+
+typedef struct RBDAAPRecordPrivate RBDAAPRecordPrivate;
+
+typedef struct {
+	GObject parent;
+	RBDAAPRecordPrivate *priv;
+} RBDAAPRecord;
+
+typedef struct {
+	GObjectClass parent;
+} RBDAAPRecordClass;
+
+GType rb_daap_record_get_type (void);
+
+RBDAAPRecord *rb_daap_record_new (RhythmDBEntry *entry);
+
+gint          rb_daap_record_get_id          (DAAPRecord *record);
+
+gboolean      rb_daap_record_itunes_compat   (DAAPRecord *record);
+
+void          rb_daap_record_set_transcode_format (DAAPRecord *record,
+						      const gint format);
+
+GInputStream *rb_daap_record_read            (DAAPRecord *record,
+						 GError **err);
+
+#endif /* __RB_DAAP_RECORD */
+
+G_END_DECLS
diff --git a/plugins/daap/rb-daap-share.c b/plugins/daap/rb-daap-share.c
deleted file mode 100644
index 608b4e5..0000000
--- a/plugins/daap/rb-daap-share.c
+++ /dev/null
@@ -1,1773 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- *  Implmentation of DAAP (iTunes Music Sharing) sharing
- *
- *  Copyright (C) 2005 Charles Schmidt <cschmidt2@emich.edu>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The Rhythmbox authors hereby grant permission for non-GPL compatible
- *  GStreamer plugins to be used and distributed together with GStreamer
- *  and Rhythmbox. This permission is above and beyond the permissions granted
- *  by the GPL license by which Rhythmbox is covered. If you modify this code
- *  you may extend this exception to your version of the code, but you are not
- *  obligated to do so. If you do not wish to do so, delete this exception
- *  statement from your version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#include "config.h"
-
-#include <time.h>
-#include <string.h>
-
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-
-#include <libsoup/soup.h>
-#include <libsoup/soup-address.h>
-#include <libsoup/soup-message.h>
-#include <libsoup/soup-uri.h>
-#include <libsoup/soup-server.h>
-
-#include "rb-daap-share.h"
-#include "rb-daap-structure.h"
-#include "rb-daap-mdns-publisher.h"
-#include "rb-daap-dialog.h"
-
-#include "rb-playlist-source.h"
-#include "rb-debug.h"
-#include "eel-gconf-extensions.h"
-#include "rb-file-helpers.h"
-
-static void rb_daap_share_set_property  (GObject *object,
-					 guint prop_id,
-					 const GValue *value,
-					 GParamSpec *pspec);
-static void rb_daap_share_get_property  (GObject *object,
-					 guint prop_id,
-					 GValue *value,
-				 	 GParamSpec *pspec);
-static void rb_daap_share_dispose	(GObject *object);
-static void rb_daap_share_maybe_restart (RBDAAPShare *share);
-static gboolean rb_daap_share_publish_start (RBDAAPShare *share);
-static gboolean rb_daap_share_publish_stop  (RBDAAPShare *share);
-static gboolean rb_daap_share_server_start  (RBDAAPShare *share);
-static gboolean rb_daap_share_server_stop   (RBDAAPShare *share);
-static void rb_daap_share_playlist_created (RBPlaylistManager *mgr,
-					    RBSource *playlist,
-					    RBDAAPShare *share);
-static void rb_daap_share_process_playlist (RBSource *playlist,
-					    RBDAAPShare *share);
-static void rb_daap_share_playlist_destroyed (RBDAAPShare *share,
-					      RBSource *source);
-static void rb_daap_share_forget_playlist (gpointer data,
-					   RBDAAPShare *share);
-
-#define STANDARD_DAAP_PORT 3689
-
-/* HTTP chunk size used to send files to clients */
-#define DAAP_SHARE_CHUNK_SIZE	16384
-
-typedef enum {
-	RB_DAAP_SHARE_AUTH_METHOD_NONE              = 0,
-	RB_DAAP_SHARE_AUTH_METHOD_NAME_AND_PASSWORD = 1,
-	RB_DAAP_SHARE_AUTH_METHOD_PASSWORD          = 2
-} RBDAAPShareAuthMethod;
-
-struct RBDAAPSharePrivate {
-	gchar *name;
-	guint port;
-	char *password;
-	RBDAAPShareAuthMethod auth_method;
-
-	/* mdns/dns-sd publishing things */
-	gboolean server_active;
-	gboolean published;
-	RBDaapMdnsPublisher *publisher;
-
-	/* http server things */
-	SoupServer *server;
-	guint revision_number;
-
-	GHashTable *session_ids;
-
-	/* db things */
-	RhythmDB *db;
-	RhythmDBEntryType entry_type;
-	gulong entry_added_id;
-	gulong entry_deleted_id;
-	gulong entry_changed_id;
-
-	/* playlist things */
-	RBPlaylistManager *playlist_manager;
-	guint next_playlist_id;
-	GList *playlist_ids;	/* contains RBPlaylistIDs */
-};
-
-#define RB_DAAP_SHARE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RB_TYPE_DAAP_SHARE, RBDAAPSharePrivate))
-
-typedef struct {
-	RBSource *source;
-	gint32 id;
-} RBPlaylistID;
-
-enum {
-	PROP_0,
-	PROP_NAME,
-	PROP_PASSWORD,
-	PROP_DB,
-	PROP_PLAYLIST_MANAGER,
-	PROP_ENTRY_TYPE
-};
-
-G_DEFINE_TYPE (RBDAAPShare, rb_daap_share, G_TYPE_OBJECT)
-
-static void
-rb_daap_share_class_init (RBDAAPShareClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-	object_class->get_property = rb_daap_share_get_property;
-	object_class->set_property = rb_daap_share_set_property;
-	object_class->dispose = rb_daap_share_dispose;
-
-	g_object_class_install_property (object_class,
-					 PROP_NAME,
-					 g_param_spec_string ("name",
-						 	      "Name",
-							      "Share Name",
-							      NULL,
-							      G_PARAM_READWRITE));
-	g_object_class_install_property (object_class,
-					 PROP_PASSWORD,
-					 g_param_spec_string ("password",
-							      "Authentication password",
-							      "Authentication password",
-							      NULL,
-							      G_PARAM_READWRITE));
-	g_object_class_install_property (object_class,
-					 PROP_DB,
-					 g_param_spec_object ("db",
-							      "RhythmDB",
-							      "RhythmDB object",
-							      RHYTHMDB_TYPE,
-							       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-	g_object_class_install_property (object_class,
-					 PROP_PLAYLIST_MANAGER,
-					 g_param_spec_object ("playlist-manager",
-							      "Playlist Manager",
-							      "Playlist manager object",
-							      RB_TYPE_PLAYLIST_MANAGER,
-							       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-	g_object_class_install_property (object_class,
-					 PROP_ENTRY_TYPE,
-					 g_param_spec_boxed ("entry-type",
-							     "Entry type",
-							     "Type of entries to be shared",
-							     RHYTHMDB_TYPE_ENTRY_TYPE,
-							     G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-
-	g_type_class_add_private (klass, sizeof (RBDAAPSharePrivate));
-}
-
-static void
-rb_daap_share_set_name (RBDAAPShare *share,
-			const char  *name)
-{
-	GError *error;
-	gboolean res;
-
-	g_return_if_fail (share != NULL);
-
-	g_free (share->priv->name);
-	share->priv->name = g_strdup (name);
-
-	error = NULL;
-	res = rb_daap_mdns_publisher_set_name (share->priv->publisher, name, &error);
-	if (error != NULL) {
-		g_warning ("Unable to change MDNS service name: %s", error->message);
-		g_error_free (error);
-	}
-}
-
-static void
-published_cb (RBDaapMdnsPublisher *publisher,
-	      const char          *name,
-	      RBDAAPShare         *share)
-{
-	if (share->priv->name == NULL || name == NULL) {
-		return;
-	}
-
-	if (strcmp (name, share->priv->name) == 0) {
-		rb_debug ("mDNS publish successful");
-		share->priv->published = TRUE;
-	}
-}
-
-static void
-name_collision_cb (RBDaapMdnsPublisher *publisher,
-		   const char          *name,
-		   RBDAAPShare         *share)
-{
-	char *new_name;
-
-	if (share->priv->name == NULL || name == NULL) {
-		return;
-	}
-
-	if (strcmp (name, share->priv->name) == 0) {
-		rb_debug ("Duplicate share name on mDNS");
-
-		GDK_THREADS_ENTER ();
-		new_name = rb_daap_collision_dialog_new_run (NULL, share->priv->name);
-		GDK_THREADS_LEAVE ();
-
-		rb_daap_share_set_name (share, new_name);
-		g_free (new_name);
-	}
-
-	return;
-}
-
-static void
-rb_daap_share_init (RBDAAPShare *share)
-{
-	share->priv = RB_DAAP_SHARE_GET_PRIVATE (share);
-
-	share->priv->revision_number = 5;
-
-	share->priv->auth_method = RB_DAAP_SHARE_AUTH_METHOD_NONE;
-	share->priv->publisher = rb_daap_mdns_publisher_new ();
-	g_signal_connect_object (share->priv->publisher,
-				 "published",
-				 G_CALLBACK (published_cb),
-				 share, 0);
-	g_signal_connect_object (share->priv->publisher,
-				 "name-collision",
-				 G_CALLBACK (name_collision_cb),
-				 share, 0);
-
-}
-
-static void
-rb_daap_share_set_password (RBDAAPShare *share,
-			    const char  *password)
-{
-	g_return_if_fail (share != NULL);
-
-	if (share->priv->password && password &&
-	    strcmp (password, share->priv->password) == 0) {
-		return;
-	}
-
-	g_free (share->priv->password);
-	share->priv->password = g_strdup (password);
-	if (password != NULL) {
-		share->priv->auth_method = RB_DAAP_SHARE_AUTH_METHOD_PASSWORD;
-	} else {
-		share->priv->auth_method = RB_DAAP_SHARE_AUTH_METHOD_NONE;
-	}
-
-	rb_daap_share_maybe_restart (share);
-}
-
-static void
-rb_daap_share_set_db (RBDAAPShare *share,
-		      RhythmDB    *db)
-{
-	if (share->priv->db != NULL) {
-		g_object_unref (share->priv->db);
-	}
-
-	share->priv->db = db;
-
-	if (share->priv->db != NULL) {
-		g_object_ref (share->priv->db);
-	}
-}
-
-static void
-rb_daap_share_set_playlist_manager (RBDAAPShare       *share,
-				    RBPlaylistManager *playlist_manager)
-{
-	GList *playlists;
-
-	g_return_if_fail (share != NULL);
-
-	if (share->priv->playlist_manager != NULL) {
-		g_object_unref (share->priv->playlist_manager);
-		g_signal_handlers_disconnect_by_func (share->priv->playlist_manager,
-						      G_CALLBACK (rb_daap_share_playlist_created),
-						      share);
-	}
-
-	share->priv->playlist_manager = playlist_manager;
-
-	if (share->priv->playlist_manager != NULL) {
-		g_object_ref (share->priv->playlist_manager);
-
-		g_signal_connect_object (G_OBJECT (share->priv->playlist_manager),
-					 "playlist_added",
-					 G_CALLBACK (rb_daap_share_playlist_created),
-					 share, 0);
-
-		/* Currently, there are no playlists when this object is created, but in
-		 * case it changes..
-		 */
-		playlists = rb_playlist_manager_get_playlists (share->priv->playlist_manager);
-		g_list_foreach (playlists, (GFunc) rb_daap_share_process_playlist, share);
-		g_list_free (playlists);
-	}
-}
-
-static void
-rb_daap_share_set_property (GObject *object,
-			    guint prop_id,
-			    const GValue *value,
-			    GParamSpec *pspec)
-{
-	RBDAAPShare *share = RB_DAAP_SHARE (object);
-
-	switch (prop_id) {
-	case PROP_NAME:
-		rb_daap_share_set_name (share, g_value_get_string (value));
-		break;
-	case PROP_PASSWORD:
-		rb_daap_share_set_password (share, g_value_get_string (value));
-		break;
-	case PROP_DB:
-		rb_daap_share_set_db (share, g_value_get_object (value));
-		break;
-	case PROP_PLAYLIST_MANAGER:
-		rb_daap_share_set_playlist_manager (share, g_value_get_object (value));
-		break;
-	case PROP_ENTRY_TYPE:
-		share->priv->entry_type = g_value_get_boxed (value);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-rb_daap_share_get_property (GObject *object,
-			    guint prop_id,
-			    GValue *value,
-			    GParamSpec *pspec)
-{
-	RBDAAPShare *share = RB_DAAP_SHARE (object);
-
-	switch (prop_id) {
-	case PROP_NAME:
-		g_value_set_string (value, share->priv->name);
-		break;
-	case PROP_PASSWORD:
-		g_value_set_string (value, share->priv->password);
-		break;
-	case PROP_DB:
-		g_value_set_object (value, share->priv->db);
-		break;
-	case PROP_PLAYLIST_MANAGER:
-		g_value_set_object (value, share->priv->playlist_manager);
-		break;
-	case PROP_ENTRY_TYPE:
-		g_value_set_boxed (value, share->priv->entry_type);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static gint
-_find_by_id (gconstpointer a, gconstpointer b)
-{
-	RBPlaylistID *ai = (RBPlaylistID *)a;
-	gint bv = GPOINTER_TO_INT (b);
-	return (ai->id - bv);
-}
-
-static gint
-_find_by_source (gconstpointer a, gconstpointer b)
-{
-	RBPlaylistID *ai = (RBPlaylistID *)a;
-	RBSource *bs = (RBSource *)b;
-	return (ai->source - bs);
-}
-
-static void
-rb_daap_share_playlist_created (RBPlaylistManager *manager,
-				RBSource *source,
-				RBDAAPShare *share)
-{
-	rb_daap_share_process_playlist (source, share);
-}
-
-static void
-rb_daap_share_process_playlist (RBSource *source,
-				RBDAAPShare *share)
-{
-	RBPlaylistID *id;
-
-	/* make sure we're not going insane.. */
-	g_assert (g_list_find_custom (share->priv->playlist_ids,
-				      source,
-				      _find_by_source) == NULL);
-
-	g_object_weak_ref (G_OBJECT (source),
-			   (GWeakNotify) rb_daap_share_playlist_destroyed,
-			   share);
-	id = g_new0 (RBPlaylistID, 1);
-	id->source = source;
-	id->id = share->priv->next_playlist_id++;
-	share->priv->playlist_ids = g_list_append (share->priv->playlist_ids, id);
-
-	/* if we knew how to send updates to clients, we'd probably do something here */
-}
-
-static void
-rb_daap_share_playlist_destroyed (RBDAAPShare *share,
-				  RBSource *source)
-{
-	GList *id;
-
-	id = g_list_find_custom (share->priv->playlist_ids, source, _find_by_source);
-	if (!id)
-		return;
-
-	share->priv->playlist_ids = g_list_remove_link (share->priv->playlist_ids, id);
-	g_free (id->data);
-	g_list_free_1 (id);
-}
-
-static void
-rb_daap_share_forget_playlist (gpointer data,
-			       RBDAAPShare *share)
-{
-	RBPlaylistID *id = (RBPlaylistID *)data;
-	g_object_weak_unref (G_OBJECT (id->source),
-			     (GWeakNotify) rb_daap_share_playlist_destroyed,
-			     share);
-}
-
-static void
-rb_daap_share_dispose (GObject *object)
-{
-	RBDAAPShare *share = RB_DAAP_SHARE (object);
-
-	if (share->priv->published) {
-		rb_daap_share_publish_stop (share);
-	}
-
-	if (share->priv->server_active) {
-		rb_daap_share_server_stop (share);
-	}
-
-	g_free (share->priv->name);
-	g_object_unref (share->priv->db);
-	g_object_unref (share->priv->playlist_manager);
-
-	g_list_foreach (share->priv->playlist_ids, (GFunc) rb_daap_share_forget_playlist, share);
-	g_list_foreach (share->priv->playlist_ids, (GFunc) g_free, NULL);
-	g_list_free (share->priv->playlist_ids);
-
-	if (share->priv->publisher) {
-		g_object_unref (share->priv->publisher);
-	}
-
-	G_OBJECT_CLASS (rb_daap_share_parent_class)->dispose (object);
-}
-
-RBDAAPShare *
-rb_daap_share_new (const char *name,
-		   const char *password,
-		   RhythmDB *db,
-		   RhythmDBEntryType entry_type,
-		   RBPlaylistManager *playlist_manager)
-{
-	RBDAAPShare *share;
-
-	share = RB_DAAP_SHARE (g_object_new (RB_TYPE_DAAP_SHARE,
-					     "name", name,
-					     "password", password,
-					     "db", db,
-					     "playlist-manager", playlist_manager,
-					     "entry-type", entry_type,
-					     NULL));
-
-	rb_daap_share_server_start (share);
-	rb_daap_share_publish_start (share);
-
-	return share;
-}
-
-static void
-message_add_standard_headers (SoupMessage *message)
-{
-	soup_message_headers_append (message->response_headers, "DAAP-Server", "Rhythmbox " VERSION);
-
-	soup_message_headers_append (message->response_headers, "Content-Type", "application/x-dmap-tagged");
-}
-
-static void
-message_set_from_rb_daap_structure (SoupMessage *message,
-				    GNode *structure)
-{
-	gchar *resp;
-	guint length;
-
-	resp = rb_daap_structure_serialize (structure, &length);
-
-	if (resp == NULL) {
-		rb_debug ("serialize gave us null?\n");
-		return;
-	}
-
-	soup_message_set_response (message, "application/x-dmap-tagged", SOUP_MEMORY_TAKE, resp, length);
-
-	message_add_standard_headers (message);
-
-	soup_message_set_status (message, SOUP_STATUS_OK);
-}
-
-#define DMAP_STATUS_OK 200
-
-#define DMAP_VERSION 2.0
-#define DAAP_VERSION 3.0
-#define DMAP_TIMEOUT 1800
-
-static void
-server_info_cb (SoupServer        *server,
-		SoupMessage       *message,
-		const char        *path,
-		GHashTable        *query,
-		SoupClientContext *context,
-		RBDAAPShare       *share)
-{
-/* MSRV	server info response
- * 	MSTT status
- * 	MPRO dmap version
- * 	APRO daap version
- * 	MINM name
- * 	MSAU authentication method
- * 	MSLR login required
- * 	MSTM timeout interval
- * 	MSAL supports auto logout
- * 	MSUP supports update
- * 	MSPI supports persistent ids
- * 	MSEX supports extensions
- * 	MSBR supports browse
- * 	MSQY supports query
- * 	MSIX supports index
- * 	MSRS supports resolve
- * 	MSDC databases count
- */
-	GNode *msrv;
-
-	msrv = rb_daap_structure_add (NULL, RB_DAAP_CC_MSRV);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSTT, (gint32) DMAP_STATUS_OK);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MPRO, (gdouble) DMAP_VERSION);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_APRO, (gdouble) DAAP_VERSION);
-	/* 2/3 is for itunes 4.8 (at least).  its determined by the
-	 * Client-DAAP-Version header sent, but if we decide not to support
-	 * older versions..? anyway
-	 *
-	 * 1.0 is 1/1
-	 * 2.0 is 1/2
-	 * 3.0 is 2/3
-	 */
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MINM, share->priv->name);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSAU, share->priv->auth_method);
-	/* authentication method
-	 * 0 is nothing
-	 * 1 is name & password
-	 * 2 is password only
-	 */
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSLR, 0);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSTM, (gint32) DMAP_TIMEOUT);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSAL, (gchar) 0);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSUP, (gchar) 0);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSPI, (gchar) 0);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSEX, (gchar) 0);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSBR, (gchar) 0);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSQY, (gchar) 0);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSIX, (gchar) 0);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSRS, (gchar) 0);
-	rb_daap_structure_add (msrv, RB_DAAP_CC_MSDC, (gint32) 1);
-
-	message_set_from_rb_daap_structure (message, msrv);
-	rb_daap_structure_destroy (msrv);
-}
-
-static void
-content_codes_cb (SoupServer        *server,
-		  SoupMessage       *message,
-		  const char        *path,
-		  GHashTable        *query,
-		  SoupClientContext *context,
-		  RBDAAPShare       *share)
-{
-/* MCCR content codes response
- * 	MSTT status
- * 	MDCL dictionary
- * 		MCNM content codes number
- * 		MCNA content codes name
- * 		MCTY content codes type
- * 	MDCL dictionary
- * 	...
- */
-	const RBDAAPContentCodeDefinition *defs;
-	guint num_defs = 0;
-	guint i;
-	GNode *mccr;
-
-	defs = rb_daap_content_codes (&num_defs);
-
-	mccr = rb_daap_structure_add (NULL, RB_DAAP_CC_MCCR);
-	rb_daap_structure_add (mccr, RB_DAAP_CC_MSTT, (gint32) DMAP_STATUS_OK);
-
-	for (i = 0; i < num_defs; i++) {
-		GNode *mdcl;
-
-		mdcl = rb_daap_structure_add (mccr, RB_DAAP_CC_MDCL);
-		rb_daap_structure_add (mdcl, RB_DAAP_CC_MCNM, rb_daap_content_code_string_as_int32(defs[i].string));
-		rb_daap_structure_add (mdcl, RB_DAAP_CC_MCNA, defs[i].name);
-		rb_daap_structure_add (mdcl, RB_DAAP_CC_MCTY, (gint32) defs[i].type);
-	}
-
-	message_set_from_rb_daap_structure (message, mccr);
-	rb_daap_structure_destroy (mccr);
-}
-
-static gboolean
-get_session_id (GHashTable *query,
-		guint32    *id)
-{
-	char *session_id_str;
-	guint32 session_id;
-
-	session_id_str = g_hash_table_lookup (query, "session-id");
-	if (session_id_str == NULL) {
-		rb_debug ("session id not found");
-		return FALSE;
-	}
-
-	session_id = (guint32) strtoul (session_id_str, NULL, 10);
-	if (id != NULL) {
-		*id = session_id;
-	}
-	return TRUE;
-}
-
-static gboolean
-get_revision_number (GHashTable *query,
-		     guint *number)
-{
-	char *revision_number_str;
-	guint revision_number;
-
-	revision_number_str = g_hash_table_lookup (query, "revision-number");
-	if (revision_number_str == NULL) {
-		rb_debug ("client asked for an update without a revision number?!?");
-		return FALSE;
-	}
-
-	revision_number = strtoul (revision_number_str, NULL, 10);
-	if (number != NULL) {
-		*number = revision_number;
-	}
-	return TRUE;
-}
-
-static gboolean
-session_id_validate (RBDAAPShare       *share,
-		     SoupClientContext *context,
-		     SoupMessage       *message,
-		     GHashTable        *query,
-		     guint32           *id)
-{
-	guint32     session_id;
-	gboolean    res;
-	const char *addr;
-	const char *remote_address;
-
-	if (id) {
-		*id = 0;
-	}
-
-	res = get_session_id (query, &session_id);
-	if (! res) {
-		rb_debug ("Validation failed: Unable to parse session id from message");
-		return FALSE;
-	}
-
-	/* check hash for remote address */
-	addr = g_hash_table_lookup (share->priv->session_ids, GUINT_TO_POINTER (session_id));
-	if (addr == NULL) {
-		rb_debug ("Validation failed: Unable to lookup session id %u", session_id);
-		return FALSE;
-	}
-
-	remote_address = soup_client_context_get_host (context);
-	rb_debug ("Validating session id %u from %s matches %s",
-		  session_id, remote_address, addr);
-	if (remote_address == NULL || strcmp (addr, remote_address) != 0) {
-		rb_debug ("Validation failed: Remote address does not match stored address");
-		return FALSE;
-	}
-
-	if (id) {
-		*id = session_id;
-	}
-
-	return TRUE;
-}
-
-static guint32
-session_id_generate (RBDAAPShare       *share,
-		     SoupClientContext *context)
-{
-	guint32 id;
-
-	id = g_random_int ();
-
-	return id;
-}
-
-static guint32
-session_id_create (RBDAAPShare       *share,
-		   SoupClientContext *context)
-{
-	guint32     id;
-	const char *addr;
-	char       *remote_address;
-
-	do {
-		/* create a unique session id */
-		id = session_id_generate (share, context);
-		rb_debug ("Generated session id %u", id);
-
-		/* if already used, try again */
-		addr = g_hash_table_lookup (share->priv->session_ids, GUINT_TO_POINTER (id));
-	} while	(addr != NULL);
-
-	/* store session id and remote address */
-	remote_address = g_strdup (soup_client_context_get_host (context));
-	g_hash_table_insert (share->priv->session_ids, GUINT_TO_POINTER (id), remote_address);
-
-	return id;
-}
-
-static void
-session_id_remove (RBDAAPShare       *share,
-		   SoupClientContext *context,
-		   guint32            id)
-{
-	g_hash_table_remove (share->priv->session_ids, GUINT_TO_POINTER (id));
-}
-
-static void
-login_cb (SoupServer        *server,
-	  SoupMessage       *message,
-	  const char        *path,
-	  GHashTable        *query,
-	  SoupClientContext *context,
-	  RBDAAPShare       *share)
-{
-/* MLOG login response
- * 	MSTT status
- * 	MLID session id
- */
-	GNode *mlog;
-	guint32 session_id;
-
-	session_id = session_id_create (share, context);
-
-	rb_debug ("Handling login session id %u", session_id);
-
-	mlog = rb_daap_structure_add (NULL, RB_DAAP_CC_MLOG);
-	rb_daap_structure_add (mlog, RB_DAAP_CC_MSTT, (gint32) DMAP_STATUS_OK);
-	rb_daap_structure_add (mlog, RB_DAAP_CC_MLID, session_id);
-
-	message_set_from_rb_daap_structure (message, mlog);
-	rb_daap_structure_destroy (mlog);
-}
-
-static void
-logout_cb (SoupServer        *server,
-	   SoupMessage       *message,
-	   const char        *path,
-	   GHashTable        *query,
-	   SoupClientContext *context,
-	   RBDAAPShare       *share)
-{
-	int     status;
-	guint32 id;
-
-	if (session_id_validate (share, context, message, query, &id)) {
-		rb_debug ("Handling logout session id %u", id);
-		session_id_remove (share, context, id);
-
-		status = SOUP_STATUS_NO_CONTENT;
-	} else {
-		status = SOUP_STATUS_FORBIDDEN;
-	}
-
-	soup_message_set_status (message, status);
-}
-
-static void
-update_cb (SoupServer        *server,
-	   SoupMessage       *message,
-	   const char        *path,
-	   GHashTable        *query,
-	   SoupClientContext *context,
-	   RBDAAPShare       *share)
-{
-	guint    revision_number;
-	gboolean res;
-
-	res = get_revision_number (query, &revision_number);
-
-	if (res && revision_number != share->priv->revision_number) {
-		/* MUPD update response
-		 * 	MSTT status
-		 * 	MUSR server revision
-		 */
-		GNode *mupd;
-
-		mupd = rb_daap_structure_add (NULL, RB_DAAP_CC_MUPD);
-		rb_daap_structure_add (mupd, RB_DAAP_CC_MSTT, (gint32) DMAP_STATUS_OK);
-		rb_daap_structure_add (mupd, RB_DAAP_CC_MUSR, (gint32) share->priv->revision_number);
-
-		message_set_from_rb_daap_structure (message, mupd);
-		rb_daap_structure_destroy (mupd);
-	} else {
-		/* FIXME: This seems like a bug. It just leaks the
-		 * message (and socket) without ever replying.
-		 */
-		g_object_ref (message);
-		soup_server_pause_message (server, message);
-	}
-}
-
-typedef enum {
-	ITEM_ID = 0,
-	ITEM_NAME,
-	ITEM_KIND,
-	PERSISTENT_ID,
-	CONTAINER_ITEM_ID,
-	SONG_ALBUM,
-	SONG_GROUPING,
-	SONG_ARTIST,
-	SONG_BITRATE,
-	SONG_BPM,
-	SONG_COMMENT,
-	SONG_COMPILATION,
-	SONG_COMPOSER,
-	SONG_DATA_KIND,
-	SONG_DATA_URL,
-	SONG_DATE_ADDED,
-	SONG_DATE_MODIFIED,
-	SONG_DISC_COUNT,
-	SONG_DISC_NUMBER,
-	SONG_DISABLED,
-	SONG_EQ_PRESET,
-	SONG_FORMAT,
-	SONG_GENRE,
-	SONG_DESCRIPTION,
-	SONG_RELATIVE_VOLUME,
-	SONG_SAMPLE_RATE,
-	SONG_SIZE,
-	SONG_START_TIME,
-	SONG_STOP_TIME,
-	SONG_TIME,
-	SONG_TRACK_COUNT,
-	SONG_TRACK_NUMBER,
-	SONG_USER_RATING,
-	SONG_YEAR
-} DAAPMetaData;
-
-struct DAAPMetaDataMap {
-	gchar *tag;
-	DAAPMetaData md;
-};
-
-struct DAAPMetaDataMap meta_data_map[] = {
-	{"dmap.itemid",			ITEM_ID},
-    	{"dmap.itemname",		ITEM_NAME},
-    	{"dmap.itemkind",		ITEM_KIND},
-    	{"dmap.persistentid",		PERSISTENT_ID},
-	{"dmap.containeritemid",	CONTAINER_ITEM_ID},
-    	{"daap.songalbum",		SONG_ALBUM},
-    	{"daap.songartist",		SONG_ARTIST},
-    	{"daap.songbitrate",		SONG_BITRATE},
-    	{"daap.songbeatsperminute",	SONG_BPM},
-    	{"daap.songcomment",		SONG_COMMENT},
-    	{"daap.songcompilation",	SONG_COMPILATION},
-    	{"daap.songcomposer",		SONG_COMPOSER},
-    	{"daap.songdatakind",		SONG_DATA_KIND},
-    	{"daap.songdataurl",		SONG_DATA_URL},
-    	{"daap.songdateadded",		SONG_DATE_ADDED},
-    	{"daap.songdatemodified",	SONG_DATE_MODIFIED},
-    	{"daap.songdescription",	SONG_DESCRIPTION},
-    	{"daap.songdisabled",		SONG_DISABLED},
-    	{"daap.songdisccount",		SONG_DISC_COUNT},
-    	{"daap.songdiscnumber",		SONG_DISC_NUMBER},
-    	{"daap.songeqpreset",		SONG_EQ_PRESET},
-    	{"daap.songformat",		SONG_FORMAT},
-    	{"daap.songgenre",		SONG_GENRE},
-    	{"daap.songgrouping",		SONG_GROUPING},
-    	{"daap.songrelativevolume",	SONG_RELATIVE_VOLUME},
-    	{"daap.songsamplerate",		SONG_SAMPLE_RATE},
-    	{"daap.songsize",		SONG_SIZE},
-    	{"daap.songstarttime",		SONG_START_TIME},
-    	{"daap.songstoptime",		SONG_STOP_TIME},
-   	{"daap.songtime",		SONG_TIME},
-    	{"daap.songtrackcount",		SONG_TRACK_COUNT},
-    	{"daap.songtracknumber",	SONG_TRACK_NUMBER},
-    	{"daap.songuserrating",		SONG_USER_RATING},
-    	{"daap.songyear",		SONG_YEAR}};
-
-typedef unsigned long long bitwise;
-
-struct MLCL_Bits {
-	GNode *mlcl;
-	bitwise bits;
-	gpointer pointer;
-};
-
-static gboolean
-client_requested (bitwise bits,
-		  gint field)
-{
-	return 0 != (bits & (((bitwise) 1) << field));
-}
-
-#define DMAP_ITEM_KIND_AUDIO 2
-#define DAAP_SONG_DATA_KIND_NONE 0
-
-static void
-add_entry_to_mlcl (RhythmDBEntry *entry,
-		   struct MLCL_Bits *mb)
-{
-	GNode *mlit;
-	gint id;
-
-	if (rhythmdb_entry_get_boolean (entry, RHYTHMDB_PROP_HIDDEN))
-		return;
-
-	id = rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_ENTRY_ID);
-	mlit = rb_daap_structure_add (mb->mlcl, RB_DAAP_CC_MLIT);
-
-	if (client_requested (mb->bits, ITEM_KIND))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MIKD, (gchar) DMAP_ITEM_KIND_AUDIO);
-	if (client_requested (mb->bits, ITEM_ID))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MIID, (gint32) id);
-	if (client_requested (mb->bits, ITEM_NAME))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MINM, rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_TITLE));
-	if (client_requested (mb->bits, PERSISTENT_ID))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MPER, (gint64) id);
-	if (client_requested (mb->bits, CONTAINER_ITEM_ID))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MCTI, (gint32) id);
-	if (client_requested (mb->bits, SONG_DATA_KIND))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASDK, (gchar) DAAP_SONG_DATA_KIND_NONE);
-	if (client_requested (mb->bits, SONG_DATA_URL))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASUL, "");
-	if (client_requested (mb->bits, SONG_ALBUM))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASAL, rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ALBUM));
-	if (client_requested (mb->bits, SONG_GROUPING))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_AGRP, "");
-	if (client_requested (mb->bits, SONG_ARTIST))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASAR, rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ARTIST));
-	if (client_requested (mb->bits, SONG_BITRATE)) {
-		gulong bitrate = rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_BITRATE);
-		if (bitrate != 0)
-			rb_daap_structure_add (mlit, RB_DAAP_CC_ASBR, (gint32) bitrate);
-	}
-	if (client_requested (mb->bits, SONG_BPM))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASBT, (gint32) 0);
-	if (client_requested (mb->bits, SONG_COMMENT))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASCM, "");
-	if (client_requested (mb->bits, SONG_COMPILATION))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASCO, (gchar) FALSE);
-	if (client_requested (mb->bits, SONG_COMPOSER))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASCP, "");
-	if (client_requested (mb->bits, SONG_DATE_ADDED))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASDA, (gint32) rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_FIRST_SEEN));
-	if (client_requested (mb->bits, SONG_DATE_MODIFIED))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASDM, (gint32) rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_MTIME));
-	if (client_requested (mb->bits, SONG_DISC_COUNT))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASDC, (gint32) 0);
-	if (client_requested (mb->bits, SONG_DISC_NUMBER))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASDN, (gint32) rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_DISC_NUMBER));
-	if (client_requested (mb->bits, SONG_DISABLED))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASDB, (gchar) FALSE);
-	if (client_requested (mb->bits, SONG_EQ_PRESET))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASEQ, "");
-	if (client_requested (mb->bits, SONG_FORMAT)) {
-		const gchar *filename;
-		gchar *ext;
-
-		filename = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION);
-		ext = strrchr (filename, '.');
-		if (ext == NULL) {
-			/* FIXME we should use RHYTHMDB_PROP_MIMETYPE instead */
-			ext = "mp3";
-			rb_daap_structure_add (mlit, RB_DAAP_CC_ASFM, ext);
-		} else {
-			ext++;
-			rb_daap_structure_add (mlit, RB_DAAP_CC_ASFM, ext);
-		}
-	}
-	if (client_requested (mb->bits, SONG_GENRE))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASGN, rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_GENRE));
-	if (client_requested (mb->bits, SONG_DESCRIPTION))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASDT, "");
-	if (client_requested (mb->bits, SONG_RELATIVE_VOLUME))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASRV, 0);
-	if (client_requested (mb->bits, SONG_SAMPLE_RATE))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASSR, 0);
-	if (client_requested (mb->bits, SONG_SIZE))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASSZ, (gint32) rhythmdb_entry_get_uint64 (entry, RHYTHMDB_PROP_FILE_SIZE));
-	if (client_requested (mb->bits, SONG_START_TIME))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASST, 0);
-	if (client_requested (mb->bits, SONG_STOP_TIME))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASSP, 0);
-	if (client_requested (mb->bits, SONG_TIME))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASTM, (gint32) (1000 * rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_DURATION)));
-	if (client_requested (mb->bits, SONG_TRACK_COUNT))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASTC, 0);
-	if (client_requested (mb->bits, SONG_TRACK_NUMBER))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASTN, (gint32) rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_TRACK_NUMBER));
-	if (client_requested (mb->bits, SONG_USER_RATING))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASUR, 0); /* FIXME */
-	if (client_requested (mb->bits, SONG_YEAR))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ASYR, (gint32) rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_YEAR));
-
-	return;
-}
-
-static void
-add_playlist_to_mlcl (RBPlaylistID *playlist_id,
-		      GNode *mlcl)
-{
- /* 	MLIT listing item
- * 		MIID item id
- * 		MPER persistent item id
- * 		MINM item name
- * 		MIMC item count
- */
-	GNode *mlit;
-	gchar *name;
-	guint num_songs;
-	RhythmDBQueryModel *model;
-
-	g_object_get (playlist_id->source,
-		      "name", &name,
-		      "query-model", &model,
-		      NULL);
-
-	num_songs = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL);
-	g_object_unref (model);
-
-	mlit = rb_daap_structure_add (mlcl, RB_DAAP_CC_MLIT);
-	rb_daap_structure_add (mlit, RB_DAAP_CC_MIID, playlist_id->id);
-	/* we don't have a persistant ID for playlists, unfortunately */
-	rb_daap_structure_add (mlit, RB_DAAP_CC_MPER, (gint64) playlist_id->id);
-	rb_daap_structure_add (mlit, RB_DAAP_CC_MINM, name);
-	rb_daap_structure_add (mlit, RB_DAAP_CC_MIMC, (gint32) num_songs);
-
-	g_free (name);
-
-	return;
-}
-
-static gboolean
-add_playlist_entry_to_mlcl (GtkTreeModel *model,
-			    GtkTreePath *path,
-			    GtkTreeIter *iter,
-			    struct MLCL_Bits *mb)
-{
-	GNode *mlit;
-	RhythmDBEntry *entry;
-	gint id;
-
-	mlit = rb_daap_structure_add (mb->mlcl, RB_DAAP_CC_MLIT);
-
-	gtk_tree_model_get (model, iter, 0, &entry, -1);
-
-	id = rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_ENTRY_ID);
-
-	if (client_requested (mb->bits, ITEM_KIND))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MIKD, (gchar) DMAP_ITEM_KIND_AUDIO);
-	if (client_requested (mb->bits, ITEM_ID))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MIID, (gint32) id);
-	if (client_requested (mb->bits, CONTAINER_ITEM_ID))
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MCTI, (gint32) id);
-
-	rhythmdb_entry_unref (entry);
-
-	return FALSE;
-}
-
-static bitwise
-parse_meta_str (const char *attrs)
-{
-	gchar **attrsv;
-	guint i;
-	bitwise bits = 0;
-	
-	attrsv = g_strsplit (attrs, ",", -1);
-
-	for (i = 0; attrsv[i]; i++) {
-		guint j;
-
-		for (j = 0; j < G_N_ELEMENTS (meta_data_map); j++) {
-			if (strcmp (meta_data_map[j].tag, attrsv[i]) == 0) {
-				bits |= (((bitwise) 1) << meta_data_map[j].md);
-			}
-		}
-	}
-	
-	g_strfreev (attrsv);
-
-	return bits;
-}
-
-static bitwise
-parse_meta (GHashTable *query)
-{
-	const gchar *attrs;
-
-	attrs = g_hash_table_lookup (query, "meta");
-	if (attrs == NULL) {
-		return 0;
-	}
-	return parse_meta_str (attrs);
-}
-
-static void
-write_next_chunk (SoupMessage *message, GInputStream *instream)
-{
-	gssize read_size;
-	GError *error = NULL;
-	gchar *chunk = g_malloc (DAAP_SHARE_CHUNK_SIZE);
-
-	read_size = g_input_stream_read (instream, chunk, DAAP_SHARE_CHUNK_SIZE, NULL, &error);
-	if (read_size > 0) {
-		soup_message_body_append (message->response_body, SOUP_MEMORY_TAKE, chunk, read_size);
-	} else {
-		if (error != NULL) {
-			rb_debug ("error reading from input stream: %s", error->message);
-			g_error_free (error);
-		}
-		g_free (chunk);
-		soup_message_body_complete (message->response_body);
-	}
-}
-
-static void
-chunked_message_finished (SoupMessage *message, GInputStream *instream)
-{
-	rb_debug ("finished sending chunked file");
-	g_input_stream_close (instream, NULL, NULL);
-}
-
-static void
-send_chunked_file (SoupMessage *message, RhythmDBEntry *entry, guint64 file_size, guint64 offset)
-{
-	GFile *file;
-	GInputStream *stream;
-	const char *location;
-	GError *error = NULL;
-
-	location = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION);
-
-	rb_debug ("sending %s chunked from offset %" G_GUINT64_FORMAT, location, offset);
-	file = g_file_new_for_uri (location);
-	stream = G_INPUT_STREAM (g_file_read (file, NULL, &error));
-	if (error != NULL) {
-		rb_debug ("couldn't open %s: %s", location, error->message);
-		g_error_free (error);
-		soup_message_set_status (message, SOUP_STATUS_INTERNAL_SERVER_ERROR);
-		return;
-	}
-
-	if (offset != 0) {
-		if (g_seekable_seek (G_SEEKABLE (stream), offset, G_SEEK_SET, NULL, &error) == FALSE) {
-			g_warning ("error seeking: %s", error->message);
-			g_input_stream_close (stream, NULL, NULL);
-			soup_message_set_status (message, SOUP_STATUS_INTERNAL_SERVER_ERROR);
-			return;
-		}
-		file_size -= offset;
-	}
-
-	soup_message_headers_set_encoding (message->response_headers, SOUP_ENCODING_CHUNKED);
-
-	g_signal_connect (message, "wrote_chunk", G_CALLBACK (write_next_chunk), stream);
-	g_signal_connect (message, "finished", G_CALLBACK (chunked_message_finished), stream);
-	write_next_chunk (message, stream);
-}
-
-static void
-mapped_file_message_finished (SoupMessage *message, GMappedFile *file)
-{
-	rb_debug ("finished sending mmapped file");
-	g_mapped_file_free (file);
-}
-
-static void
-send_mapped_file (SoupMessage *message, RhythmDBEntry *entry, guint64 file_size, guint64 offset)
-{
-	GFile *file;
-	GMappedFile *mapped_file;
-	char *path;
-	GError *error = NULL;
-
-	file = g_file_new_for_uri (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION));
-	path = g_file_get_path (file);
-	if (path == NULL) {
-		rb_debug ("couldn't send %s mmapped: couldn't get path", path);
-		soup_message_set_status (message, SOUP_STATUS_INTERNAL_SERVER_ERROR);
-		g_object_unref (file);
-		return;
-	}
-	g_object_unref (file);
-	rb_debug ("sending file %s mmapped, from offset %" G_GUINT64_FORMAT, path, offset);
-
-	mapped_file = g_mapped_file_new (path, FALSE, &error);
-	if (mapped_file == NULL) {
-		g_warning ("Unable to map file %s: %s", path, error->message);
-		soup_message_set_status (message, SOUP_STATUS_INTERNAL_SERVER_ERROR);
-	} else {
-		soup_message_set_response (message, "application/x-dmap-tagged",
-					   SOUP_MEMORY_TEMPORARY,
-					   g_mapped_file_get_contents (mapped_file) + offset,
-					   file_size);
-
-		g_signal_connect (message,
-				  "finished",
-				  G_CALLBACK (mapped_file_message_finished),
-				  mapped_file);
-	}
-	g_free (path);
-}
-
-static void
-databases_cb (SoupServer        *server,
-	      SoupMessage       *message,
-	      const char        *path,
-	      GHashTable        *query,
-	      SoupClientContext *context,
-	      RBDAAPShare       *share)
-
-{
-	const char *rest_of_path;
-	/*guint revision_number;*/
-
-	if (! session_id_validate (share, context, message, query, NULL)) {
-		soup_message_set_status (message, SOUP_STATUS_FORBIDDEN);
-		return;
-	}
-
-	rest_of_path = strchr (path + 1, '/');
-
-	if (rest_of_path == NULL) {
-	/* AVDB server databases
-	 * 	MSTT status
-	 * 	MUTY update type
-	 * 	MTCO specified total count
-	 * 	MRCO returned count
-	 * 	MLCL listing
-	 * 		MLIT listing item
-	 * 			MIID item id
-	 * 			MPER persistent id
-	 * 			MINM item name
-	 * 			MIMC item count
-	 * 			MCTC container count
-	 */
-		GNode *avdb;
-		GNode *mlcl;
-		GNode *mlit;
-
-		avdb = rb_daap_structure_add (NULL, RB_DAAP_CC_AVDB);
-		rb_daap_structure_add (avdb, RB_DAAP_CC_MSTT, (gint32) DMAP_STATUS_OK);
-		rb_daap_structure_add (avdb, RB_DAAP_CC_MUTY, 0);
-		rb_daap_structure_add (avdb, RB_DAAP_CC_MTCO, (gint32) 1);
-		rb_daap_structure_add (avdb, RB_DAAP_CC_MRCO, (gint32) 1);
-		mlcl = rb_daap_structure_add (avdb, RB_DAAP_CC_MLCL);
-		mlit = rb_daap_structure_add (mlcl, RB_DAAP_CC_MLIT);
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MIID, (gint32) 1);
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MPER, (gint64) 1);
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MINM, share->priv->name);
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MIMC, (gint32) rhythmdb_entry_count_by_type (share->priv->db, share->priv->entry_type));
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MCTC, (gint32) 1);
-
-		message_set_from_rb_daap_structure (message, avdb);
-		rb_daap_structure_destroy (avdb);
-	} else if (g_ascii_strcasecmp ("/1/items", rest_of_path) == 0) {
-	/* ADBS database songs
-	 * 	MSTT status
-	 * 	MUTY update type
-	 * 	MTCO specified total count
-	 * 	MRCO returned count
-	 * 	MLCL listing
-	 * 		MLIT
-	 * 			attrs
-	 * 		MLIT
-	 * 		...
-	 */
-		GNode *adbs;
-		gint32 num_songs = rhythmdb_entry_count_by_type (share->priv->db, share->priv->entry_type);
-		struct MLCL_Bits mb = {NULL,0};
-
-		mb.bits = parse_meta (query);
-
-		adbs = rb_daap_structure_add (NULL, RB_DAAP_CC_ADBS);
-		rb_daap_structure_add (adbs, RB_DAAP_CC_MSTT, (gint32) DMAP_STATUS_OK);
-		rb_daap_structure_add (adbs, RB_DAAP_CC_MUTY, 0);
-		rb_daap_structure_add (adbs, RB_DAAP_CC_MTCO, (gint32) num_songs);
-		rb_daap_structure_add (adbs, RB_DAAP_CC_MRCO, (gint32) num_songs);
-		mb.mlcl = rb_daap_structure_add (adbs, RB_DAAP_CC_MLCL);
-
-		rhythmdb_entry_foreach_by_type (share->priv->db, share->priv->entry_type, (GFunc) add_entry_to_mlcl, &mb);
-
-		message_set_from_rb_daap_structure (message, adbs);
-		rb_daap_structure_destroy (adbs);
-		adbs = NULL;
-	} else if (g_ascii_strcasecmp ("/1/containers", rest_of_path) == 0) {
-	/* APLY database playlists
-	 * 	MSTT status
-	 * 	MUTY update type
-	 * 	MTCO specified total count
-	 * 	MRCO returned count
-	 * 	MLCL listing
-	 * 		MLIT listing item
-	 * 			MIID item id
-	 * 			MPER persistent item id
-	 * 			MINM item name
-	 * 			MIMC item count
-	 * 			ABPL baseplaylist (only for base)
-	 * 		MLIT
-	 * 		...
-	 */
-		GNode *aply;
-		GNode *mlcl;
-		GNode *mlit;
-
-		aply = rb_daap_structure_add (NULL, RB_DAAP_CC_APLY);
-		rb_daap_structure_add (aply, RB_DAAP_CC_MSTT, (gint32) DMAP_STATUS_OK);
-		rb_daap_structure_add (aply, RB_DAAP_CC_MUTY, 0);
-		rb_daap_structure_add (aply, RB_DAAP_CC_MTCO, (gint32) 1);
-		rb_daap_structure_add (aply, RB_DAAP_CC_MRCO, (gint32) 1);
-		mlcl = rb_daap_structure_add (aply, RB_DAAP_CC_MLCL);
-		mlit = rb_daap_structure_add (mlcl, RB_DAAP_CC_MLIT);
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MIID, (gint32) 1);
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MPER, (gint64) 1);
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MINM, share->priv->name);
-		rb_daap_structure_add (mlit, RB_DAAP_CC_MIMC, (gint32) rhythmdb_entry_count_by_type (share->priv->db, share->priv->entry_type));
-		rb_daap_structure_add (mlit, RB_DAAP_CC_ABPL, (gchar) 1); /* base playlist */
-
-		g_list_foreach (share->priv->playlist_ids, (GFunc) add_playlist_to_mlcl, mlcl);
-
-		message_set_from_rb_daap_structure (message, aply);
-		rb_daap_structure_destroy (aply);
-
-	} else if (g_ascii_strncasecmp ("/1/containers/", rest_of_path, 14) == 0) {
-	/* APSO playlist songs
-	 * 	MSTT status
-	 * 	MUTY update type
-	 * 	MTCO specified total count
-	 * 	MRCO returned count
-	 * 	MLCL listing
-	 * 		MLIT listing item
-	 * 			MIKD item kind
-	 * 			MIID item id
-	 * 			MCTI container item id
-	 * 		MLIT
-	 * 		...
-	 */
-		GNode *apso;
-		struct MLCL_Bits mb = {NULL,0};
-		gint pl_id = atoi (rest_of_path + 14);
-
-		mb.bits = parse_meta (query);
-
-		apso = rb_daap_structure_add (NULL, RB_DAAP_CC_APSO);
-		rb_daap_structure_add (apso, RB_DAAP_CC_MSTT, (gint32) DMAP_STATUS_OK);
-		rb_daap_structure_add (apso, RB_DAAP_CC_MUTY, 0);
-
-		if (pl_id == 1) {
-			gint32 num_songs = (gint32) rhythmdb_entry_count_by_type (share->priv->db, share->priv->entry_type);
-			rb_daap_structure_add (apso, RB_DAAP_CC_MTCO, (gint32) num_songs);
-			rb_daap_structure_add (apso, RB_DAAP_CC_MRCO, (gint32) num_songs);
-			mb.mlcl = rb_daap_structure_add (apso, RB_DAAP_CC_MLCL);
-
-			rhythmdb_entry_foreach_by_type (share->priv->db,
-							share->priv->entry_type,
-							(GFunc) add_entry_to_mlcl,
-							&mb);
-		} else {
-			RBPlaylistID *id;
-			GList *idl;
-			guint num_songs;
-			RhythmDBQueryModel *model;
-
-			idl = g_list_find_custom (share->priv->playlist_ids,
-						  GINT_TO_POINTER (pl_id),
-						  _find_by_id);
-			if (idl == NULL) {
-				soup_message_set_status (message, SOUP_STATUS_NOT_FOUND);
-				return;
-			}
-			id = (RBPlaylistID *)idl->data;
-
-			mb.mlcl = rb_daap_structure_add (apso, RB_DAAP_CC_MLCL);
-
-			g_object_get (id->source, "base-query-model", &model, NULL);
-			num_songs = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL);
-
-			rb_daap_structure_add (apso, RB_DAAP_CC_MTCO, (gint32) num_songs);
-			rb_daap_structure_add (apso, RB_DAAP_CC_MRCO, (gint32) num_songs);
-
-			gtk_tree_model_foreach (GTK_TREE_MODEL (model), (GtkTreeModelForeachFunc) add_playlist_entry_to_mlcl, &mb);
-			g_object_unref (model);
-		}
-
-		message_set_from_rb_daap_structure (message, apso);
-		rb_daap_structure_destroy (apso);
-	} else if (g_ascii_strncasecmp ("/1/items/", rest_of_path, 9) == 0) {
-	/* just the file :) */
-		const gchar *id_str;
-		gint id;
-		RhythmDBEntry *entry;
-		const gchar *location;
-		const gchar *range_header;
-		guint64 file_size;
-		guint64 offset = 0;
-
-		id_str = rest_of_path + 9;
-		id = atoi (id_str);
-
-		entry = rhythmdb_entry_lookup_by_id (share->priv->db, id);
-		location = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION);
-		file_size = rhythmdb_entry_get_uint64 (entry, RHYTHMDB_PROP_FILE_SIZE);
-
-		message_add_standard_headers (message);
-		soup_message_headers_append (message->response_headers, "Accept-Ranges", "bytes");
-
-		range_header = soup_message_headers_get (message->request_headers, "Range");
-		if (range_header) {
-			const gchar *s;
-			gchar *content_range;
-
-			s = range_header + 6; /* bytes= */
-			offset = atoll (s);
-
-			content_range = g_strdup_printf ("bytes %" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT, offset, file_size, file_size);
-			soup_message_headers_append (message->response_headers, "Content-Range", content_range);
-			g_free (content_range);
-
-			soup_message_set_status (message, SOUP_STATUS_PARTIAL_CONTENT);
-			file_size -= offset;
-		} else {
-			soup_message_set_status (message, SOUP_STATUS_OK);
-		}
-
-		/* don't use chunked transfers if we can send the file mmapped,
-		 * as itunes clients can't seek properly when we do.
-		 */
-		if (rb_uri_is_local (location)) {
-			send_mapped_file (message, entry, file_size, offset);
-		} else {
-			send_chunked_file (message, entry, file_size, offset);
-		}
-	} else {
-		rb_debug ("unhandled: %s\n", path);
-	}
-}
-
-static void
-db_entry_added_cb (RhythmDB *db,
-		   RhythmDBEntry *entry,
-		   RBDAAPShare *share)
-{
-	/* TODO: update our db version number? */
-}
-
-static void
-add_db_entry (RhythmDBEntry *entry,
-	      RBDAAPShare *share)
-{
-	db_entry_added_cb (share->priv->db, entry, share);
-}
-
-static void
-db_entry_deleted_cb (RhythmDB *db,
-		     RhythmDBEntry *entry,
-		     RBDAAPShare *share)
-{
-	/* TODO: update our db version number? */
-}
-
-static void
-db_entry_changed_cb (RhythmDB *db,
-		     RhythmDBEntry *entry,
-		     GSList *changes,
-		     RBDAAPShare *share)
-{
-	if (rhythmdb_entry_get_boolean (entry, RHYTHMDB_PROP_HIDDEN)) {
-		db_entry_deleted_cb (db, entry, share);
-	} else {
-		db_entry_added_cb (db, entry, share);
-	}
-}
-
-static gboolean
-soup_auth_filter (SoupAuthDomain *auth_domain,
-		  SoupMessage    *msg,
-		  gpointer        user_data)
-{
-	const char *path;
-
-	path = soup_message_get_uri (msg)->path;
-	if (g_str_has_prefix (path, "/databases/")) {
-		/* Subdirectories of /databases don't actually require
-		 * authentication
-		 */
-		return FALSE;
-	} else {
-		/* Everything else in auth_domain's paths, including
-		 * /databases itself, does require auth.
-		 */
-		return TRUE;
-	}
-}
-
-static gboolean
-soup_auth_callback (SoupAuthDomain *auth_domain,
-		    SoupMessage    *msg,
-		    const char     *username,
-		    gpointer        password,
-		    RBDAAPShare    *share)
-{
-	gboolean    allowed;
-	const char *path;
-
-	path = soup_message_get_uri (msg)->path;
-	rb_debug ("Auth request for %s, user %s", path, username);
-
-	allowed = !strcmp (password, share->priv->password);
-	rb_debug ("Auth request: %s", allowed ? "ALLOWED" : "DENIED");
-
-	return allowed;
-}
-
-static gboolean
-rb_daap_share_server_start (RBDAAPShare *share)
-{
-	int                   port = STANDARD_DAAP_PORT;
-	gboolean              password_required;
-
-	share->priv->server = soup_server_new (SOUP_SERVER_PORT, port, NULL);
-	if (share->priv->server == NULL) {
-		rb_debug ("Unable to start music sharing server on port %d, trying any open port", port);
-		share->priv->server = soup_server_new (SOUP_SERVER_PORT, SOUP_ADDRESS_ANY_PORT, NULL);
-
-		if (share->priv->server == NULL) {
-			g_warning ("Unable to start music sharing server");
-			return FALSE;
-		}
-	}
-
-	share->priv->port = (guint)soup_server_get_port (share->priv->server);
-	rb_debug ("Started DAAP server on port %u", share->priv->port);
-
-	password_required = (share->priv->auth_method != RB_DAAP_SHARE_AUTH_METHOD_NONE);
-
-	if (password_required) {
-		SoupAuthDomain *auth_domain;
-
-		auth_domain = soup_auth_domain_basic_new (SOUP_AUTH_DOMAIN_REALM, "Music Sharing",
-							  SOUP_AUTH_DOMAIN_ADD_PATH, "/login",
-							  SOUP_AUTH_DOMAIN_ADD_PATH, "/update",
-							  SOUP_AUTH_DOMAIN_ADD_PATH, "/database",
-							  SOUP_AUTH_DOMAIN_FILTER, soup_auth_filter,
-							  NULL);
-		soup_auth_domain_basic_set_auth_callback (auth_domain,
-							  (SoupAuthDomainBasicAuthCallback)soup_auth_callback,
-							  g_object_ref (share),
-							  g_object_unref);
-		soup_server_add_auth_domain (share->priv->server, auth_domain);
-	}
-
-	soup_server_add_handler (share->priv->server, "/server-info",
-				 (SoupServerCallback) server_info_cb,
-				 share, NULL);
-	soup_server_add_handler (share->priv->server, "/content-codes",
-				 (SoupServerCallback) content_codes_cb,
-				 share, NULL);
-	soup_server_add_handler (share->priv->server, "/login",
-				 (SoupServerCallback) login_cb,
-				 share, NULL);
-	soup_server_add_handler (share->priv->server, "/logout",
-				 (SoupServerCallback) logout_cb,
-				 share, NULL);
-	soup_server_add_handler (share->priv->server, "/update",
-				 (SoupServerCallback) update_cb,
-				 share, NULL);
-	soup_server_add_handler (share->priv->server, "/databases",
-				 (SoupServerCallback) databases_cb,
-				 share, NULL);
-	soup_server_run_async (share->priv->server);
-
-	/* using direct since there is no g_uint_hash or g_uint_equal */
-	share->priv->session_ids = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
-
-	share->priv->next_playlist_id = 2;		/* 1 already used */
-
-	rhythmdb_entry_foreach (share->priv->db, (GFunc)add_db_entry, share);
-
-	share->priv->entry_added_id = g_signal_connect (G_OBJECT (share->priv->db),
-							"entry-added",
-							G_CALLBACK (db_entry_added_cb),
-							share);
-	share->priv->entry_deleted_id = g_signal_connect (G_OBJECT (share->priv->db),
-							  "entry-deleted",
-							  G_CALLBACK (db_entry_deleted_cb),
-							  share);
-	share->priv->entry_changed_id = g_signal_connect (G_OBJECT (share->priv->db),
-							  "entry-changed",
-							  G_CALLBACK (db_entry_changed_cb),
-							  share);
-
-	share->priv->server_active = TRUE;
-
-	return TRUE;
-}
-
-static gboolean
-rb_daap_share_server_stop (RBDAAPShare *share)
-{
-	rb_debug ("Stopping music sharing server on port %d", share->priv->port);
-
-	if (share->priv->server) {
-		soup_server_quit (share->priv->server);
-		g_object_unref (share->priv->server);
-		share->priv->server = NULL;
-	}
-
-	if (share->priv->session_ids) {
-		g_hash_table_destroy (share->priv->session_ids);
-		share->priv->session_ids = NULL;
-	}
-
-	if (share->priv->entry_added_id != 0) {
-		g_signal_handler_disconnect (share->priv->db, share->priv->entry_added_id);
-		share->priv->entry_added_id = 0;
-	}
-
-	if (share->priv->entry_deleted_id != 0) {
-		g_signal_handler_disconnect (share->priv->db, share->priv->entry_deleted_id);
-		share->priv->entry_deleted_id = 0;
-	}
-
-	if (share->priv->entry_changed_id != 0) {
-		g_signal_handler_disconnect (share->priv->db, share->priv->entry_changed_id);
-		share->priv->entry_changed_id = 0;
-	}
-
-	share->priv->server_active = FALSE;
-
-	return TRUE;
-}
-
-static gboolean
-rb_daap_share_publish_start (RBDAAPShare *share)
-{
-	GError  *error;
-	gboolean res;
-	gboolean password_required;
-
-	password_required = (share->priv->auth_method != RB_DAAP_SHARE_AUTH_METHOD_NONE);
-
-	error = NULL;
-	res = rb_daap_mdns_publisher_publish (share->priv->publisher,
-					      share->priv->name,
-					      share->priv->port,
-					      password_required,
-					      &error);
-
-	if (res == FALSE) {
-		if (error != NULL) {
-			g_warning ("Unable to notify network of music sharing: %s", error->message);
-			g_error_free (error);
-		} else {
-			g_warning ("Unable to notify network of music sharing");
-		}
-		return FALSE;
-	} else {
-		rb_debug ("Published DAAP server information to mdns");
-	}
-
-	return TRUE;
-}
-
-static gboolean
-rb_daap_share_publish_stop (RBDAAPShare *share)
-{
-	if (share->priv->publisher) {
-		gboolean res;
-		GError  *error;
-		error = NULL;
-		res = rb_daap_mdns_publisher_withdraw (share->priv->publisher, &error);
-		if (error != NULL) {
-			g_warning ("Unable to withdraw music sharing service: %s", error->message);
-			g_error_free (error);
-		}
-		return res;
-	}
-
-	share->priv->published = FALSE;
-	return TRUE;
-}
-
-static void
-rb_daap_share_restart (RBDAAPShare *share)
-{
-	gboolean res;
-
-	rb_daap_share_server_stop (share);
-	res = rb_daap_share_server_start (share);
-	if (res) {
-		/* To update information just publish again */
-		rb_daap_share_publish_start (share);
-	} else {
-		rb_daap_share_publish_stop (share);
-	}
-}
-
-static void
-rb_daap_share_maybe_restart (RBDAAPShare *share)
-{
-	if (share->priv->published) {
-		rb_daap_share_restart (share);
-	}
-}
diff --git a/plugins/daap/rb-daap-share.h b/plugins/daap/rb-daap-share.h
deleted file mode 100644
index 4f63493..0000000
--- a/plugins/daap/rb-daap-share.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Header for DAAP (iTunes Music Sharing) sharing
- *
- *  Copyright (C) 2005 Charles Schmidt <cschmidt2@emich.edu>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The Rhythmbox authors hereby grant permission for non-GPL compatible
- *  GStreamer plugins to be used and distributed together with GStreamer
- *  and Rhythmbox. This permission is above and beyond the permissions granted
- *  by the GPL license by which Rhythmbox is covered. If you modify this code
- *  you may extend this exception to your version of the code, but you are not
- *  obligated to do so. If you do not wish to do so, delete this exception
- *  statement from your version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#ifndef __RB_DAAP_SHARE_H
-#define __RB_DAAP_SHARE_H
-
-#include <glib-object.h>
-#include "rhythmdb.h"
-#include "rb-playlist-manager.h"
-
-G_BEGIN_DECLS
-
-#define RB_TYPE_DAAP_SHARE         (rb_daap_share_get_type ())
-#define RB_DAAP_SHARE(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), RB_TYPE_DAAP_SHARE, RBDAAPShare))
-#define RB_DAAP_SHARE_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), RB_TYPE_DAAP_SHARE, RBDAAPShareClass))
-#define RB_IS_DAAP_SHARE(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), RB_TYPE_DAAP_SHARE))
-#define RB_IS_DAAP_SHARE_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), RB_TYPE_DAAP_SHARE))
-#define RB_DAAP_SHARE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), RB_TYPE_DAAP_SHARE, RBDAAPShareClass))
-
-typedef struct RBDAAPSharePrivate RBDAAPSharePrivate;
-
-typedef struct {
-	GObject parent;
-
-	RBDAAPSharePrivate *priv;
-} RBDAAPShare;
-
-typedef struct {
-	GObjectClass parent;
-} RBDAAPShareClass;
-
-GType         rb_daap_share_get_type (void);
-
-RBDAAPShare * rb_daap_share_new      (const char *name,
-                                      const char *password,
-                                      RhythmDB *db,
-				      RhythmDBEntryType entry_type,
-                                      RBPlaylistManager *playlist_manager);
-
-#endif /* __RB_DAAP_SHARE_H */
-
-G_END_DECLS
diff --git a/plugins/daap/rb-daap-sharing.c b/plugins/daap/rb-daap-sharing.c
index a5f43bb..2fde8df 100644
--- a/plugins/daap/rb-daap-sharing.c
+++ b/plugins/daap/rb-daap-sharing.c
@@ -36,14 +36,17 @@
 #include <glib/gprintf.h>
 
 #include "rb-daap-sharing.h"
-#include "rb-daap-share.h"
+#include "rb-dmap-db-adapter.h"
+#include "rb-dmap-container-db.h"
 #include "rb-debug.h"
 #include "rb-dialog.h"
 #include "rb-playlist-manager.h"
 #include "eel-gconf-extensions.h"
 #include "rb-preferences.h"
 
-static RBDAAPShare *share = NULL;
+#include <libdmapsharing/dmap.h>
+
+static DAAPShare *share = NULL;
 static guint enable_sharing_notify_id = EEL_GCONF_UNDEFINED_CONNECTION;
 static guint require_password_notify_id = EEL_GCONF_UNDEFINED_CONNECTION;
 static guint share_name_notify_id = EEL_GCONF_UNDEFINED_CONNECTION;
@@ -65,7 +68,9 @@ rb_daap_sharing_default_share_name ()
 static void
 create_share (RBShell *shell)
 {
-	RhythmDB *db;
+	RhythmDB *rdb;
+	DMAPDb *db;
+	DMAPContainerDb *container_db;
 	RBPlaylistManager *playlist_manager;
 	char *name;
 	char *password;
@@ -81,8 +86,10 @@ create_share (RBShell *shell)
 	}
 
 	g_object_get (shell,
-		      "db", &db,
+		      "db", &rdb,
 		      "playlist-manager", &playlist_manager, NULL);
+	db = DMAP_DB (rb_dmap_db_adapter_new (rdb, RHYTHMDB_ENTRY_TYPE_SONG));
+	container_db = DMAP_CONTAINER_DB (rb_dmap_container_db_new ());
 
 	require_password = eel_gconf_get_boolean (CONF_DAAP_REQUIRE_PASSWORD);
 	if (require_password) {
@@ -91,9 +98,9 @@ create_share (RBShell *shell)
 		password = NULL;
 	}
 
-	share = rb_daap_share_new (name, password, db, RHYTHMDB_ENTRY_TYPE_SONG, playlist_manager);
+	share = daap_share_new (name, password, db, container_db, NULL);
 
-	g_object_unref (db);
+	g_object_unref (rdb);
 	g_object_unref (playlist_manager);
 
 	g_free (name);
diff --git a/plugins/daap/rb-daap-source.c b/plugins/daap/rb-daap-source.c
index 619e518..88a9111 100644
--- a/plugins/daap/rb-daap-source.c
+++ b/plugins/daap/rb-daap-source.c
@@ -54,14 +54,16 @@
 #include "rb-dialog.h"
 #include "rb-preferences.h"
 #include "rb-daap-src.h"
+#include "rb-daap-record-factory.h"
+#include "rb-dmap-db-adapter.h"
 
-#include "rb-daap-connection.h"
-#include "rb-daap-mdns-browser.h"
 #include "rb-daap-dialog.h"
 #include "rb-daap-plugin.h"
 
 #include "rb-static-playlist-source.h"
 
+#include <libdmapsharing/dmap.h>
+
 static void rb_daap_source_dispose (GObject *object);
 static void rb_daap_source_set_property  (GObject *object,
 					  guint prop_id,
@@ -462,7 +464,7 @@ ask_password (RBDAAPSource *source, const char *name, const char *keyring)
 #endif
 
 static char *
-connection_auth_cb (RBDAAPConnection *connection,
+connection_auth_cb (DAAPConnection   *connection,
 		    const char       *name,
 		    RBDAAPSource     *source)
 {
@@ -510,8 +512,8 @@ connection_auth_cb (RBDAAPConnection *connection,
 }
 
 static void
-connection_connecting_cb (RBDAAPConnection     *connection,
-			  RBDAAPConnectionState state,
+connection_connecting_cb (DAAPConnection       *connection,
+			  DMAPConnectionState   state,
 			  float		        progress,
 			  RBDAAPSource         *source)
 {
@@ -522,20 +524,20 @@ connection_connecting_cb (RBDAAPConnection     *connection,
 	rb_debug ("DAAP connection status: %d/%f", state, progress);
 
 	switch (state) {
-	case DAAP_GET_INFO:
-	case DAAP_GET_PASSWORD:
-	case DAAP_LOGIN:
+	case DMAP_GET_INFO:
+	case DMAP_GET_PASSWORD:
+	case DMAP_LOGIN:
 		source->priv->connection_status = _("Connecting to music share");
 		break;
-	case DAAP_GET_REVISION_NUMBER:
-	case DAAP_GET_DB_INFO:
-	case DAAP_GET_SONGS:
-	case DAAP_GET_PLAYLISTS:
-	case DAAP_GET_PLAYLIST_ENTRIES:
+	case DMAP_GET_REVISION_NUMBER:
+	case DMAP_GET_DB_INFO:
+	case DMAP_GET_SONGS:
+	case DMAP_GET_PLAYLISTS:
+	case DMAP_GET_PLAYLIST_ENTRIES:
 		source->priv->connection_status = _("Retrieving songs from music share");
 		break;
-	case DAAP_LOGOUT:
-	case DAAP_DONE:
+	case DMAP_LOGOUT:
+	case DMAP_DONE:
 		source->priv->connection_status = NULL;
 		break;
 	}
@@ -544,7 +546,7 @@ connection_connecting_cb (RBDAAPConnection     *connection,
 
 	rb_source_notify_status_changed (RB_SOURCE (source));
 
-	is_connected = rb_daap_connection_is_connected (connection);
+	is_connected = dmap_connection_is_connected (DMAP_CONNECTION (connection));
 
 	g_object_get (source, "plugin", &plugin, NULL);
 	g_assert (plugin != NULL);
@@ -561,7 +563,7 @@ connection_connecting_cb (RBDAAPConnection     *connection,
 }
 
 static void
-connection_disconnected_cb (RBDAAPConnection *connection,
+connection_disconnected_cb (DAAPConnection   *connection,
 			    RBDAAPSource     *source)
 {
 	GdkPixbuf *icon;
@@ -603,7 +605,7 @@ _add_location_to_playlist (RBRefString *uri, RBStaticPlaylistSource *source)
 }
 
 static void
-rb_daap_source_connection_cb (RBDAAPConnection *connection,
+rb_daap_source_connection_cb (DAAPConnection   *connection,
 			      gboolean          result,
 			      const char       *reason,
 			      RBSource         *source)
@@ -634,9 +636,9 @@ rb_daap_source_connection_cb (RBDAAPConnection *connection,
 		      "shell", &shell,
 		      "entry-type", &entry_type,
 		      NULL);
-	playlists = rb_daap_connection_get_playlists (RB_DAAP_CONNECTION (daap_source->priv->connection));
+	playlists = dmap_connection_get_playlists (DMAP_CONNECTION (daap_source->priv->connection));
 	for (l = playlists; l != NULL; l = g_slist_next (l)) {
-		RBDAAPPlaylist *playlist = l->data;
+		DMAPPlaylist *playlist = l->data;
 		RBSource *playlist_source;
 		char *sorting_name;
 
@@ -661,7 +663,9 @@ rb_daap_source_activate (RBSource *source)
 {
 	RBDAAPSource *daap_source = RB_DAAP_SOURCE (source);
 	RBShell *shell = NULL;
-	RhythmDB *db = NULL;
+	DMAPRecordFactory *factory;
+	RhythmDB *rdb = NULL;
+	DMAPDb *db = NULL;
 	char *name = NULL;
 	RhythmDBEntryType type;
 
@@ -671,17 +675,20 @@ rb_daap_source_activate (RBSource *source)
 
 	g_object_get (daap_source,
 		      "shell", &shell,
-		      "entry-type", &type,
 		      "name", &name,
+		      "entry-type", &type,
 		      NULL);
-	g_object_get (shell, "db", &db, NULL);
+	g_object_get (shell, "db", &rdb, NULL);
+	db = DMAP_DB (rb_dmap_db_adapter_new (rdb, type));
+
+	factory = DMAP_RECORD_FACTORY (rb_daap_record_factory_new ());
 
-	daap_source->priv->connection = rb_daap_connection_new (name,
+	daap_source->priv->connection = daap_connection_new (name,
 								daap_source->priv->host,
 								daap_source->priv->port,
 								daap_source->priv->password_protected,
 								db,
-								type);
+								factory);
         g_boxed_free (RHYTHMDB_TYPE_ENTRY_TYPE, type);
 	g_object_add_weak_pointer (G_OBJECT (daap_source->priv->connection), (gpointer *)&daap_source->priv->connection);
 
@@ -700,16 +707,16 @@ rb_daap_source_activate (RBSource *source)
                           G_CALLBACK (connection_disconnected_cb),
 			  source);
 
-	rb_daap_connection_connect (RB_DAAP_CONNECTION (daap_source->priv->connection),
-				    (RBDAAPConnectionCallback) rb_daap_source_connection_cb,
+	dmap_connection_connect (DMAP_CONNECTION (daap_source->priv->connection),
+				    (DMAPConnectionCallback) rb_daap_source_connection_cb,
 				    source);
 
-	g_object_unref (G_OBJECT (db));
+	g_object_unref (G_OBJECT (rdb));
 	g_object_unref (G_OBJECT (shell));
 }
 
 static void
-rb_daap_source_disconnect_cb (RBDAAPConnection *connection,
+rb_daap_source_disconnect_cb (DAAPConnection   *connection,
 			      gboolean          result,
 			      const char       *reason,
 			      RBSource         *source)
@@ -774,8 +781,8 @@ rb_daap_source_disconnect (RBDAAPSource *daap_source)
 
 	/* keep the source alive until the disconnect completes */
 	g_object_ref (daap_source);
-	rb_daap_connection_disconnect (daap_source->priv->connection,
-				       (RBDAAPConnectionCallback) rb_daap_source_disconnect_cb,
+	dmap_connection_disconnect (daap_source->priv->connection,
+				       (DMAPConnectionCallback) rb_daap_source_disconnect_cb,
 				       daap_source);
 
 	/* wait until disconnected */
@@ -806,7 +813,7 @@ rb_daap_source_get_headers (RBDAAPSource *source,
 		return NULL;
 	}
 
-	return rb_daap_connection_get_headers (source->priv->connection, uri, bytes);
+	return dmap_connection_get_headers (source->priv->connection, uri, bytes);
 }
 
 static char *
@@ -866,4 +873,3 @@ rb_daap_source_get_playback_uri (RhythmDBEntry *entry, gpointer data)
 
 	return g_strdup (location);
 }
-
diff --git a/plugins/daap/rb-daap-structure.c b/plugins/daap/rb-daap-structure.c
deleted file mode 100644
index d3f98db..0000000
--- a/plugins/daap/rb-daap-structure.c
+++ /dev/null
@@ -1,749 +0,0 @@
-/*
- *  Header for DAAP (iTunes Music Sharing) structures
- *
- *  Copyright (C) 2004,2005 Charles Schmidt <cschmidt2@emich.edu>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The Rhythmbox authors hereby grant permission for non-GPL compatible
- *  GStreamer plugins to be used and distributed together with GStreamer
- *  and Rhythmbox. This permission is above and beyond the permissions granted
- *  by the GPL license by which Rhythmbox is covered. If you modify this code
- *  you may extend this exception to your version of the code, but you are not
- *  obligated to do so. If you do not wish to do so, delete this exception
- *  statement from your version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#include "config.h"
-
-#include <glib.h>
-#include <glib-object.h>
-#include <gobject/gvaluecollector.h>
-#include "rb-daap-structure.h"
-#include "rb-debug.h"
-
-#include <gst/gstutils.h>
-
-#include <string.h>
-#include <stdarg.h>
-
-#define MAKE_CONTENT_CODE(ch0, ch1, ch2, ch3) \
-    (( (gint32)(gchar)(ch0) | ( (gint32)(gchar)(ch1) << 8 ) | \
-    ( (gint32)(gchar)(ch2) << 16 ) | \
-    ( (gint32)(gchar)(ch3) << 24 ) ))
-
-static const RBDAAPContentCodeDefinition cc_defs[] = {
-	{RB_DAAP_CC_MDCL, MAKE_CONTENT_CODE('m','d','c','l'), "dmap.dictionary", "mdcl", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_MSTT, MAKE_CONTENT_CODE('m','s','t','t'), "dmap.status", "mstt", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MIID, MAKE_CONTENT_CODE('m','i','i','d'), "dmap.itemid", "miid", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MINM, MAKE_CONTENT_CODE('m','i','n','m'), "dmap.itemname", "minm", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_MIKD, MAKE_CONTENT_CODE('m','i','k','d'), "dmap.itemkind", "mikd", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MPER, MAKE_CONTENT_CODE('m','p','e','r'), "dmap.persistentid", "mper", RB_DAAP_TYPE_INT64},
-	{RB_DAAP_CC_MCON, MAKE_CONTENT_CODE('m','c','o','n'), "dmap.container", "mcon", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_MCTI, MAKE_CONTENT_CODE('m','c','t','i'), "dmap.containeritemid", "mcti", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MPCO, MAKE_CONTENT_CODE('m','p','c','o'), "dmap.parentcontainerid", "mpco", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MSTS, MAKE_CONTENT_CODE('m','s','t','s'), "dmap.statusstring", "msts", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_MIMC, MAKE_CONTENT_CODE('m','i','m','c'), "dmap.itemcount", "mimc", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MCTC, MAKE_CONTENT_CODE('m','c','t','c'), "dmap.containercount", "mctc", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MRCO, MAKE_CONTENT_CODE('m','r','c','o'), "dmap.returnedcount", "mrco", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MTCO, MAKE_CONTENT_CODE('m','t','c','o'), "dmap.specifiedtotalcount", "mtco", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MLCL, MAKE_CONTENT_CODE('m','l','c','l'), "dmap.listing", "mlcl", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_MLIT, MAKE_CONTENT_CODE('m','l','i','t'), "dmap.listingitem", "mlit", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_MBCL, MAKE_CONTENT_CODE('m','b','c','l'), "dmap.bag", "mbcl", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_MSRV, MAKE_CONTENT_CODE('m','s','r','v'), "dmap.serverinforesponse", "msrv", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_MSAU, MAKE_CONTENT_CODE('m','s','a','u'), "dmap.authenticationmethod", "msau", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MSLR, MAKE_CONTENT_CODE('m','s','l','r'), "dmap.loginrequired", "mslr", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MPRO, MAKE_CONTENT_CODE('m','p','r','o'), "dmap.protocolversion", "mpro", RB_DAAP_TYPE_VERSION},
-	{RB_DAAP_CC_APRO, MAKE_CONTENT_CODE('a','p','r','o'), "daap.protocolversion", "apro", RB_DAAP_TYPE_VERSION},
-	{RB_DAAP_CC_MSAL, MAKE_CONTENT_CODE('m','s','a','l'), "dmap.supportsautologout", "msal", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MSUP, MAKE_CONTENT_CODE('m','s','u','p'), "dmap.supportsupdate", "msup", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MSPI, MAKE_CONTENT_CODE('m','s','p','i'), "dmap.supportspersistenids", "mspi", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MSEX, MAKE_CONTENT_CODE('m','s','e','x'), "dmap.supportsextensions", "msex", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MSBR, MAKE_CONTENT_CODE('m','s','b','r'), "dmap.supportsbrowse", "msbr", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MSQY, MAKE_CONTENT_CODE('m','s','q','y'), "dmap.supportsquery", "msqy", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MSIX, MAKE_CONTENT_CODE('m','s','i','x'), "dmap.supportsindex", "msix", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MSRS, MAKE_CONTENT_CODE('m','s','r','s'), "dmap.supportsresolve", "msrs", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MSTM, MAKE_CONTENT_CODE('m','s','t','m'), "dmap.timeoutinterval", "mstm", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MSDC, MAKE_CONTENT_CODE('m','s','d','c'), "dmap.databasescount", "msdc", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MCCR, MAKE_CONTENT_CODE('m','c','c','r'), "dmap.contentcodesresponse", "mccr", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_MCNM, MAKE_CONTENT_CODE('m','c','n','m'), "dmap.contentcodesnumber", "mcnm", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MCNA, MAKE_CONTENT_CODE('m','c','n','a'), "dmap.contentcodesname", "mcna", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_MCTY, MAKE_CONTENT_CODE('m','c','t','y'), "dmap.contentcodestype", "mcty", RB_DAAP_TYPE_SHORT},
-	{RB_DAAP_CC_MLOG, MAKE_CONTENT_CODE('m','l','o','g'), "dmap.loginresponse", "mlog", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_MLID, MAKE_CONTENT_CODE('m','l','i','d'), "dmap.sessionid", "mlid", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MUPD, MAKE_CONTENT_CODE('m','u','p','d'), "dmap.updateresponse", "mupd", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_MUSR, MAKE_CONTENT_CODE('m','u','s','r'), "dmap.serverrevision", "musr", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MUTY, MAKE_CONTENT_CODE('m','u','t','y'), "dmap.updatetype", "muty", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_MUDL, MAKE_CONTENT_CODE('m','u','d','l'), "dmap.deletedidlisting", "mudl", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_AVDB, MAKE_CONTENT_CODE('a','v','d','b'), "daap.serverdatabases", "avdb", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_ABRO, MAKE_CONTENT_CODE('a','b','r','o'), "daap.databasebrowse", "abro", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_ABAL, MAKE_CONTENT_CODE('a','b','a','l'), "daap.browsealbumlisting", "abal", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_ABAR, MAKE_CONTENT_CODE('a','b','a','r'), "daap.browseartistlisting", "abar", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_ABCP, MAKE_CONTENT_CODE('a','b','c','p'), "daap.browsecomposerlisting", "abcp", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_ABGN, MAKE_CONTENT_CODE('a','b','g','n'), "daap.browsegenrelisting", "abgn", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_ADBS, MAKE_CONTENT_CODE('a','d','b','s'), "daap.returndatabasesongs", "adbs", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_ASAL, MAKE_CONTENT_CODE('a','s','a','l'), "daap.songalbum", "asal", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_ASAR, MAKE_CONTENT_CODE('a','s','a','r'), "daap.songartist", "asar", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_ASBT, MAKE_CONTENT_CODE('a','s','b','t'), "daap.songsbeatsperminute", "asbt", RB_DAAP_TYPE_SHORT},
-	{RB_DAAP_CC_ASBR, MAKE_CONTENT_CODE('a','s','b','r'), "daap.songbitrate", "asbr", RB_DAAP_TYPE_SHORT},
-	{RB_DAAP_CC_ASCM, MAKE_CONTENT_CODE('a','s','c','m'), "daap.songcomment", "ascm", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_ASCO, MAKE_CONTENT_CODE('a','s','c','o'), "daap.songcompliation", "asco", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_ASDA, MAKE_CONTENT_CODE('a','s','d','a'), "daap.songdateadded", "asda", RB_DAAP_TYPE_DATE},
-	{RB_DAAP_CC_ASDM, MAKE_CONTENT_CODE('a','s','d','m'), "daap.songdatemodified", "asdm", RB_DAAP_TYPE_DATE},
-	{RB_DAAP_CC_ASDC, MAKE_CONTENT_CODE('a','s','d','c'), "daap.songdisccount", "asdc", RB_DAAP_TYPE_SHORT},
-	{RB_DAAP_CC_ASDN, MAKE_CONTENT_CODE('a','s','d','n'), "daap.songdiscnumber", "asdn", RB_DAAP_TYPE_SHORT},
-	{RB_DAAP_CC_ASDB, MAKE_CONTENT_CODE('a','s','d','b'), "daap.songdisabled", "asdb", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_ASEQ, MAKE_CONTENT_CODE('a','s','e','q'), "daap.songeqpreset", "aseq", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_ASFM, MAKE_CONTENT_CODE('a','s','f','m'), "daap.songformat", "asfm", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_ASGN, MAKE_CONTENT_CODE('a','s','g','n'), "daap.songgenre", "asgn", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_ASDT, MAKE_CONTENT_CODE('a','s','d','t'), "daap.songdescription", "asdt", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_ASRV, MAKE_CONTENT_CODE('a','s','r','v'), "daap.songrelativevolume", "asrv", RB_DAAP_TYPE_SIGNED_INT},
-	{RB_DAAP_CC_ASSR, MAKE_CONTENT_CODE('a','s','s','r'), "daap.songsamplerate", "assr", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_ASSZ, MAKE_CONTENT_CODE('a','s','s','z'), "daap.songsize", "assz", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_ASST, MAKE_CONTENT_CODE('a','s','s','t'), "daap.songstarttime", "asst", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_ASSP, MAKE_CONTENT_CODE('a','s','s','p'), "daap.songstoptime", "assp", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_ASTM, MAKE_CONTENT_CODE('a','s','t','m'), "daap.songtime", "astm", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_ASTC, MAKE_CONTENT_CODE('a','s','t','c'), "daap.songtrackcount", "astc", RB_DAAP_TYPE_SHORT},
-	{RB_DAAP_CC_ASTN, MAKE_CONTENT_CODE('a','s','t','n'), "daap.songtracknumber", "astn", RB_DAAP_TYPE_SHORT},
-	{RB_DAAP_CC_ASUR, MAKE_CONTENT_CODE('a','s','u','r'), "daap.songuserrating", "asur", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_ASYR, MAKE_CONTENT_CODE('a','s','y','r'), "daap.songyear", "asyr", RB_DAAP_TYPE_SHORT},
-	{RB_DAAP_CC_ASDK, MAKE_CONTENT_CODE('a','s','d','k'), "daap.songdatakind", "asdk", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_ASUL, MAKE_CONTENT_CODE('a','s','u','l'), "daap.songdataurl", "asul", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_APLY, MAKE_CONTENT_CODE('a','p','l','y'), "daap.databaseplaylists", "aply", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_ABPL, MAKE_CONTENT_CODE('a','b','p','l'), "daap.baseplaylist", "abpl", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_APSO, MAKE_CONTENT_CODE('a','p','s','o'), "daap.playlistsongs", "apso", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_PRSV, MAKE_CONTENT_CODE('p','r','s','v'), "daap.resolve", "prsv", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_ARIF, MAKE_CONTENT_CODE('a','r','i','f'), "daap.resolveinfo", "arif", RB_DAAP_TYPE_CONTAINER},
-	{RB_DAAP_CC_AESV, MAKE_CONTENT_CODE('a','e','S','V'), "com.applie.itunes.music-sharing-version", "aesv", RB_DAAP_TYPE_INT},
-	{RB_DAAP_CC_MSAS, MAKE_CONTENT_CODE('m','s','a','s'), "daap.authentication.schemes", "msas", RB_DAAP_TYPE_BYTE},
-	{RB_DAAP_CC_AGRP, MAKE_CONTENT_CODE('a','g','r','p'), "daap.songgrouping", "agrp", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_ASCP, MAKE_CONTENT_CODE('a','s','c','p'), "daap.songcomposer", "ascp", RB_DAAP_TYPE_STRING},
-	{RB_DAAP_CC_AESP, MAKE_CONTENT_CODE('a','e','S','P'), "com.apple.itunes.smart-playlist", "aesp", RB_DAAP_TYPE_BYTE}
-	};
-
-const gchar *
-rb_daap_content_code_name (RBDAAPContentCode code)
-{
-	return cc_defs[code-1].name;
-}
-
-RBDAAPType
-rb_daap_content_code_rb_daap_type (RBDAAPContentCode code)
-{
-	return cc_defs[code-1].type;
-}
-
-const gchar *
-rb_daap_content_code_string (RBDAAPContentCode code)
-{
-	return cc_defs[code-1].string;
-}
-
-static GType
-rb_daap_content_code_gtype (RBDAAPContentCode code)
-{
-	switch (rb_daap_content_code_rb_daap_type (code)) {
-		case RB_DAAP_TYPE_BYTE:
-		case RB_DAAP_TYPE_SIGNED_INT:
-			return G_TYPE_CHAR;
-		case RB_DAAP_TYPE_SHORT:
-		case RB_DAAP_TYPE_INT:
-		case RB_DAAP_TYPE_DATE:
-			return G_TYPE_INT;
-		case RB_DAAP_TYPE_INT64:
-			return G_TYPE_INT64;
-		case RB_DAAP_TYPE_VERSION:
-			return G_TYPE_DOUBLE;
-		case RB_DAAP_TYPE_STRING:
-			return G_TYPE_STRING;
-		case RB_DAAP_TYPE_CONTAINER:
-		default:
-			return G_TYPE_NONE;
-	}
-}
-
-GNode *
-rb_daap_structure_add (GNode *parent,
-		       RBDAAPContentCode cc,
-		       ...)
-{
-	RBDAAPType rb_daap_type;
-	GType gtype;
-	RBDAAPItem *item;
-	va_list list;
-	GNode *node;
-	gchar *error = NULL;
-
-	va_start (list, cc);
-
-	rb_daap_type = rb_daap_content_code_rb_daap_type (cc);
-	gtype = rb_daap_content_code_gtype (cc);
-
-	item = g_new0(RBDAAPItem, 1);
-	item->content_code = cc;
-
-	if (gtype != G_TYPE_NONE) {
-		g_value_init (&(item->content), gtype);
-	}
-
-	if (rb_daap_type != RB_DAAP_TYPE_STRING && rb_daap_type != RB_DAAP_TYPE_CONTAINER) {
-		G_VALUE_COLLECT (&(item->content), list, G_VALUE_NOCOPY_CONTENTS, &error);
-		if (error) {
-			g_warning ("%s", error);
-			g_free (error);
-		}
-	}
-
-	switch (rb_daap_type) {
-		case RB_DAAP_TYPE_BYTE:
-		case RB_DAAP_TYPE_SIGNED_INT:
-			item->size = 1;
-			break;
-		case RB_DAAP_TYPE_SHORT:
-			item->size = 2;
-			break;
-		case RB_DAAP_TYPE_DATE:
-		case RB_DAAP_TYPE_INT:
-		case RB_DAAP_TYPE_VERSION:
-			item->size = 4;
-			break;
-		case RB_DAAP_TYPE_INT64:
-			item->size = 8;
-			break;
-		case RB_DAAP_TYPE_STRING: {
-			gchar *s = va_arg (list, gchar *);
-
-			g_value_set_string (&(item->content), s);
-
-			/* we dont use G_VALUE_COLLECT for this because we also
-			 * need the length */
-			item->size = strlen (s);
-			break;
-		}
-		case RB_DAAP_TYPE_CONTAINER:
-		default:
-			break;
-	}
-
-	node = g_node_new (item);
-
-	if (parent) {
-		g_node_append (parent, node);
-
-		while (parent) {
-			RBDAAPItem *parent_item = parent->data;
-
-			parent_item->size += (4 + 4 + item->size);
-
-			parent = parent->parent;
-		}
-	}
-
-	return node;
-}
-
-static gboolean
-rb_daap_structure_node_serialize (GNode *node,
-				  GByteArray *array)
-{
-	RBDAAPItem *item = node->data;
-	RBDAAPType rb_daap_type;
-	guint32 size = GINT32_TO_BE (item->size);
-
-	g_byte_array_append (array, (const guint8 *)rb_daap_content_code_string (item->content_code), 4);
-	g_byte_array_append (array, (const guint8 *)&size, 4);
-
-	rb_daap_type = rb_daap_content_code_rb_daap_type (item->content_code);
-
-	switch (rb_daap_type) {
-		case RB_DAAP_TYPE_BYTE:
-		case RB_DAAP_TYPE_SIGNED_INT: {
-			gchar c = g_value_get_char (&(item->content));
-
-			g_byte_array_append (array, (const guint8 *)&c, 1);
-
-			break;
-		}
-		case RB_DAAP_TYPE_SHORT: {
-			gint32 i = g_value_get_int (&(item->content));
-			gint16 s = GINT16_TO_BE ((gint16) i);
-
-			g_byte_array_append (array, (const guint8 *)&s, 2);
-
-			break;
-	        }
-		case RB_DAAP_TYPE_DATE:
-		case RB_DAAP_TYPE_INT: {
-			gint32 i = g_value_get_int (&(item->content));
-			gint32 s = GINT32_TO_BE (i);
-
-			g_byte_array_append (array, (const guint8 *)&s, 4);
-
-			break;
-		}
-		case RB_DAAP_TYPE_VERSION: {
-			gdouble v = g_value_get_double (&(item->content));
-			gint16 major;
-			gint8 minor;
-			gint8 patch = 0;
-
-			major = (gint16)v;
-			minor = (gint8)(v - ((gdouble)major));
-
-			major = GINT16_TO_BE (major);
-
-			g_byte_array_append (array, (const guint8 *)&major, 2);
-			g_byte_array_append (array, (const guint8 *)&minor, 1);
-			g_byte_array_append (array, (const guint8 *)&patch, 1);
-
-			break;
-		}
-		case RB_DAAP_TYPE_INT64: {
-			gint64 i = g_value_get_int64 (&(item->content));
-			gint64 s = GINT64_TO_BE (i);
-
-			g_byte_array_append (array, (const guint8 *)&s, 8);
-
-			break;
-		}
-		case RB_DAAP_TYPE_STRING: {
-			const gchar *s = g_value_get_string (&(item->content));
-
-			g_byte_array_append (array, (const guint8 *)s, strlen (s));
-
-			break;
-		}
-		case RB_DAAP_TYPE_CONTAINER:
-		default:
-			break;
-	}
-
-	return FALSE;
-}
-
-gchar *
-rb_daap_structure_serialize (GNode *structure,
-			     guint *length)
-{
-	GByteArray *array;
-	gchar *data;
-
-	array = g_byte_array_new ();
-
-	if (structure) {
-		g_node_traverse (structure, G_PRE_ORDER, G_TRAVERSE_ALL, -1, (GNodeTraverseFunc)rb_daap_structure_node_serialize, array);
-	}
-
-	data = (gchar *) array->data;
-	*length = array->len;
-	g_byte_array_free (array, FALSE);
-
-	return data;
-}
-
-static RBDAAPContentCode
-rb_daap_buffer_read_content_code (const gchar *buf)
-{
-	gint32 c = MAKE_CONTENT_CODE (buf[0], buf[1], buf[2], buf[3]);
-	guint i;
-
-	for (i = 0; i < G_N_ELEMENTS (cc_defs); i++) {
-		if (cc_defs[i].int_code == c) {
-			return cc_defs[i].code;
-		}
-	}
-
-	return RB_DAAP_CC_INVALID;
-}
-
-#define rb_daap_buffer_read_int8(b)  	GST_READ_UINT8 (b)
-#define rb_daap_buffer_read_int16(b) 	(gint16) GST_READ_UINT16_BE (b)
-#define rb_daap_buffer_read_int32(b) 	(gint32) GST_READ_UINT32_BE (b)
-#define rb_daap_buffer_read_int64(b) 	(gint64) GST_READ_UINT64_BE (b)
-
-static gchar *
-rb_daap_buffer_read_string (const gchar *buf, gssize size)
-{
-	if (g_utf8_validate (buf, size, NULL) == TRUE) {
-		return g_strndup (buf, size);
-	} else {
-		return g_strdup ("");
-	}
-}
-
-//#define PARSE_DEBUG
-#define PARSE_DEBUG_FILE "daapbuffer"
-
-#ifdef PARSE_DEBUG
-#include <unistd.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#endif
-
-static void
-rb_daap_structure_parse_container_buffer (GNode *parent,
-					  const guchar *buf,
-					  gint buf_length)
-{
-	gint l = 0;
-
-	while (l < buf_length) {
-		RBDAAPContentCode cc;
-		gint codesize = 0;
-		RBDAAPItem *item = NULL;
-		GNode *node = NULL;
-		GType gtype;
-
-#ifdef PARSE_DEBUG
-		g_print ("l is %d and buf_length is %d\n", l, buf_length);
-#endif
-
-		/* we need at least 8 bytes, 4 of content_code and 4 of size */
-		if (buf_length - l < 8) {
-#ifdef PARSE_DEBUG
-			g_print ("Malformed response recieved\n");
-#endif
-			return;
-		}
-
-		cc = rb_daap_buffer_read_content_code ((const gchar*)&(buf[l]));
-		if (cc == RB_DAAP_CC_INVALID) {
-#ifdef PARSE_DEBUG
-			g_print ("Invalid content_code recieved\n");
-#endif
-			return;
-		}
-		l += 4;
-
-		codesize = rb_daap_buffer_read_int32(&(buf[l]));
-		/* CCCCSIZECONTENT
-		 * if the buffer length (minus 8 for the content code & size)
-		 * is smaller than the read codesize (ie, someone sent us
-		 * a codesize that is larger than the remaining data)
-		 * then get out before we start processing it
-		 */
-		if (codesize > buf_length - l - 4 || codesize < 0) {
-#ifdef PARSE_DEBUG
-			g_print ("Invalid codesize %d recieved in buf_length %d\n", codesize, buf_length);
-#endif
-			return;
-		}
-		l += 4;
-
-#ifdef PARSE_DEBUG
-		g_print ("content_code = %d, codesize is %d, l is %d\n", cc, codesize, l);
-#endif
-
-		item = g_new0 (RBDAAPItem, 1);
-		item->content_code = cc;
-		node = g_node_new (item);
-		g_node_append (parent, node);
-
-		gtype = rb_daap_content_code_gtype (item->content_code);
-
-		if (gtype != G_TYPE_NONE) {
-			g_value_init (&(item->content), gtype);
-		}
-
-#ifdef PARSE_DEBUG
-		{
-			guint i;
-
-			for (i = 2; i < g_node_depth (node); i++) {
-				g_print ("\t");
-			}
-		}
-#endif
-
-// FIXME USE THE G_TYPE CONVERTOR FUNCTION rb_daap_type_to_gtype
-		switch (rb_daap_content_code_rb_daap_type (item->content_code)) {
-			case RB_DAAP_TYPE_SIGNED_INT:
-			case RB_DAAP_TYPE_BYTE: {
-				gchar c = 0;
-
-				if (codesize == 1) {
-					c = (gchar) rb_daap_buffer_read_int8(&(buf[l]));
-				}
-
-				g_value_set_char (&(item->content), c);
-#ifdef PARSE_DEBUG
-				g_print ("Code: %s, content (%d): \"%c\"\n", rb_daap_content_code_string (item->content_code), codesize, (gchar)c);
-#endif
-
-				break;
-			}
-			case RB_DAAP_TYPE_SHORT: {
-				gint16 s = 0;
-
-				if (codesize == 2) {
-					s = rb_daap_buffer_read_int16(&(buf[l]));
-				}
-
-				g_value_set_int (&(item->content),(gint32)s);
-#ifdef PARSE_DEBUG
-				g_print ("Code: %s, content (%d): %hi\n", rb_daap_content_code_string (item->content_code), codesize, s);
-#endif
-
-				break;
-			}
-			case RB_DAAP_TYPE_DATE:
-			case RB_DAAP_TYPE_INT: {
-				gint32 i = 0;
-
-				if (codesize == 4) {
-					i = rb_daap_buffer_read_int32(&(buf[l]));
-				}
-
-				g_value_set_int (&(item->content), i);
-#ifdef PARSE_DEBUG
-				g_print ("Code: %s, content (%d): %d\n", rb_daap_content_code_string (item->content_code), codesize, i);
-#endif
-				break;
-			}
-			case RB_DAAP_TYPE_INT64: {
-				gint64 i = 0;
-
-				if (codesize == 8) {
-					i = rb_daap_buffer_read_int16(&(buf[l]));
-				}
-
-				g_value_set_int64 (&(item->content), i);
-#ifdef PARSE_DEBUG
-				g_print ("Code: %s, content (%d): %"G_GINT64_FORMAT"\n", rb_daap_content_code_string (item->content_code), codesize, i);
-#endif
-
-				break;
-			}
-			case RB_DAAP_TYPE_STRING: {
-				gchar *s = rb_daap_buffer_read_string ((const gchar*)&(buf[l]), codesize);
-
-				g_value_take_string (&(item->content), s);
-#ifdef PARSE_DEBUG
-				g_print ("Code: %s, content (%d): \"%s\"\n", rb_daap_content_code_string (item->content_code), codesize, s);
-#endif
-
-				break;
-			}
-			case RB_DAAP_TYPE_VERSION: {
-				gint16 major = 0;
-				gint16 minor = 0;
-				gint16 patch = 0;
-				gdouble v = 0;
-
-				if (codesize == 4) {
-					major = rb_daap_buffer_read_int16(&(buf[l]));
-					minor = rb_daap_buffer_read_int8(&(buf[l]) + 2);
-					patch = rb_daap_buffer_read_int8(&(buf[l]) + 3);
-				}
-
-				v = (gdouble)major;
-				v += (gdouble)(minor * 0.1);
-				v += (gdouble)(patch * 0.01);
-
-				g_value_set_double (&(item->content), v);
-#ifdef PARSE_DEBUG
-				g_print ("Code: %s, content: %f\n", rb_daap_content_code_string (item->content_code), v);
-#endif
-
-				break;
-			}
-			case RB_DAAP_TYPE_CONTAINER: {
-#ifdef PARSE_DEBUG
-				g_print ("Code: %s, container\n", rb_daap_content_code_string (item->content_code));
-#endif
-				rb_daap_structure_parse_container_buffer (node,&(buf[l]), codesize);
-				break;
-			}
-		}
-
-		l += codesize;
-	}
-
-	return;
-}
-
-GNode *
-rb_daap_structure_parse (const gchar *buf,
-			 gint buf_length)
-{
-	GNode *root = NULL;
-	GNode *child = NULL;
-
-#ifdef PARSE_DEBUG
-	{
-		int fd;
-
-		fd = open (PARSE_DEBUG_FILE, O_WRONLY | O_CREAT);
-		write (fd, (const void *)buf, (size_t)buf_length);
-		close (fd);
-	}
-#endif
-
-	root = g_node_new (NULL);
-
-	rb_daap_structure_parse_container_buffer (root, (guchar *)buf, buf_length);
-
-	child = root->children;
-	if (child) {
-		g_node_unlink (child);
-	}
-	g_node_destroy (root);
-
-	return child;
-}
-
-struct NodeFinder {
-	RBDAAPContentCode code;
-	GNode *node;
-};
-
-static gboolean
-gnode_find_node (GNode *node,
-		 gpointer data)
-{
-	struct NodeFinder *finder = (struct NodeFinder *)data;
-	RBDAAPItem *item = node->data;
-
-	if (item->content_code == finder->code) {
-		finder->node = node;
-		return TRUE;
-	}
-
-	return FALSE;
-}
-
-RBDAAPItem *
-rb_daap_structure_find_item (GNode *structure,
-			     RBDAAPContentCode code)
-{
-	GNode *node = NULL;
-
-	node = rb_daap_structure_find_node (structure, code);
-
-	if (node) {
-		return node->data;
-	}
-
-	return NULL;
-}
-
-GNode *
-rb_daap_structure_find_node (GNode *structure,
-			     RBDAAPContentCode code)
-{
-	struct NodeFinder *finder;
-	GNode *node = NULL;
-
-	finder = g_new0(struct NodeFinder,1);
-	finder->code = code;
-
-	g_node_traverse (structure, G_IN_ORDER, G_TRAVERSE_ALL, -1, gnode_find_node, finder);
-
-	node = finder->node;
-	g_free (finder);
-	finder = NULL;
-
-	return node;
-}
-
-static void
-rb_daap_item_free (RBDAAPItem *item)
-{
-	if (rb_daap_content_code_rb_daap_type (item->content_code) != RB_DAAP_TYPE_CONTAINER) {
-		g_value_unset (&(item->content));
-	}
-
-	g_free (item);
-}
-
-static gboolean
-gnode_free_rb_daap_item (GNode *node,
-			 gpointer data)
-{
-	rb_daap_item_free ((RBDAAPItem *)node->data);
-
-	return FALSE;
-}
-
-void
-rb_daap_structure_destroy (GNode *structure)
-{
-	if (structure) {
-		g_node_traverse (structure, G_IN_ORDER, G_TRAVERSE_ALL, -1, gnode_free_rb_daap_item, NULL);
-
-		g_node_destroy (structure);
-
-		structure = NULL;
-	}
-}
-
-const RBDAAPContentCodeDefinition *
-rb_daap_content_codes (guint *number)
-{
-	*number = G_N_ELEMENTS (cc_defs);
-
-	return cc_defs;
-}
-
-gint32
-rb_daap_content_code_string_as_int32 (const gchar *str)
-{
-	union {
-		gint32 i;
-		gchar str[4];
-	} u;
-
-	strncpy (u.str, str, 4);
-
-	return g_htonl (u.i);
-}
-
-static gboolean
-print_rb_daap_item (GNode *node,
-		    gpointer data)
-{
-	RBDAAPItem *item;
-	const gchar *name;
-	gchar *value;
-	gint i;
-
-	for (i = 1; i < g_node_depth (node); i++) {
-		g_print ("\t");
-	}
-
-	item = node->data;
-
-	name = rb_daap_content_code_name (item->content_code);
-
-	if (G_IS_VALUE (&(item->content))) {
-		value = g_strdup_value_contents (&(item->content));
-	} else {
-		value = g_strdup ("");
-	}
-
-	g_print ("%d, %s = %s (%d)\n", g_node_depth (node), name, value, item->size);
-	g_free (value);
-
-	return FALSE;
-}
-
-void
-rb_daap_structure_print (GNode *structure)
-{
-	if (structure) {
-		g_node_traverse (structure, G_PRE_ORDER, G_TRAVERSE_ALL, -1, (GNodeTraverseFunc)print_rb_daap_item, NULL);
-	}
-}
diff --git a/plugins/daap/rb-daap-structure.h b/plugins/daap/rb-daap-structure.h
deleted file mode 100644
index 4b9ba39..0000000
--- a/plugins/daap/rb-daap-structure.h
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- *  Header for DAAP (iTunes Music Sharing) structures
- *
- *  Copyright (C) 2004,2005 Charles Schmidt <cschmidt2@emich.edu>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The Rhythmbox authors hereby grant permission for non-GPL compatible
- *  GStreamer plugins to be used and distributed together with GStreamer
- *  and Rhythmbox. This permission is above and beyond the permissions granted
- *  by the GPL license by which Rhythmbox is covered. If you modify this code
- *  you may extend this exception to your version of the code, but you are not
- *  obligated to do so. If you do not wish to do so, delete this exception
- *  statement from your version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
- *
- */
-
-#ifndef __RB_DAAP_STRUCTURE_H
-#define __RB_DAAP_STRUCTURE_H
-
-#include <glib.h>
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-typedef enum {
-	RB_DAAP_CC_INVALID = 0,
-	RB_DAAP_CC_MDCL = 1,
-	RB_DAAP_CC_MSTT,
-	RB_DAAP_CC_MIID,
-	RB_DAAP_CC_MINM,
-	RB_DAAP_CC_MIKD,
-	RB_DAAP_CC_MPER,
-	RB_DAAP_CC_MCON,
-	RB_DAAP_CC_MCTI,
-	RB_DAAP_CC_MPCO,
-	RB_DAAP_CC_MSTS, /* 10 */
-	RB_DAAP_CC_MIMC,
-	RB_DAAP_CC_MCTC,
-	RB_DAAP_CC_MRCO,
-	RB_DAAP_CC_MTCO,
-	RB_DAAP_CC_MLCL,
-	RB_DAAP_CC_MLIT,
-	RB_DAAP_CC_MBCL,
-	RB_DAAP_CC_MSRV,
-	RB_DAAP_CC_MSAU,
-	RB_DAAP_CC_MSLR, /* 20 */
-	RB_DAAP_CC_MPRO,
-	RB_DAAP_CC_APRO,
-	RB_DAAP_CC_MSAL,
-	RB_DAAP_CC_MSUP,
-	RB_DAAP_CC_MSPI,
-	RB_DAAP_CC_MSEX,
-	RB_DAAP_CC_MSBR,
-	RB_DAAP_CC_MSQY,
-	RB_DAAP_CC_MSIX,
-	RB_DAAP_CC_MSRS, /* 30 */
-	RB_DAAP_CC_MSTM,
-	RB_DAAP_CC_MSDC,
-	RB_DAAP_CC_MCCR,
-	RB_DAAP_CC_MCNM,
-	RB_DAAP_CC_MCNA,
-	RB_DAAP_CC_MCTY,
-	RB_DAAP_CC_MLOG,
-	RB_DAAP_CC_MLID,
-	RB_DAAP_CC_MUPD,
-	RB_DAAP_CC_MUSR, /* 40 */
-	RB_DAAP_CC_MUTY,
-	RB_DAAP_CC_MUDL,
-	RB_DAAP_CC_AVDB,
-	RB_DAAP_CC_ABRO,
-	RB_DAAP_CC_ABAL,
-	RB_DAAP_CC_ABAR,
-	RB_DAAP_CC_ABCP,
-	RB_DAAP_CC_ABGN,
-	RB_DAAP_CC_ADBS,
-	RB_DAAP_CC_ASAL, /* 50 */
-	RB_DAAP_CC_ASAR,
-	RB_DAAP_CC_ASBT,
-	RB_DAAP_CC_ASBR,
-	RB_DAAP_CC_ASCM,
-	RB_DAAP_CC_ASCO,
-	RB_DAAP_CC_ASDA,
-	RB_DAAP_CC_ASDM,
-	RB_DAAP_CC_ASDC,
-	RB_DAAP_CC_ASDN,
-	RB_DAAP_CC_ASDB, /* 60 */
-	RB_DAAP_CC_ASEQ,
-	RB_DAAP_CC_ASFM,
-	RB_DAAP_CC_ASGN,
-	RB_DAAP_CC_ASDT,
-	RB_DAAP_CC_ASRV,
-	RB_DAAP_CC_ASSR,
-	RB_DAAP_CC_ASSZ,
-	RB_DAAP_CC_ASST,
-	RB_DAAP_CC_ASSP,
-	RB_DAAP_CC_ASTM, /* 70 */
-	RB_DAAP_CC_ASTC,
-	RB_DAAP_CC_ASTN,
-	RB_DAAP_CC_ASUR,
-	RB_DAAP_CC_ASYR,
-	RB_DAAP_CC_ASDK,
-	RB_DAAP_CC_ASUL,
-	RB_DAAP_CC_APLY,
-	RB_DAAP_CC_ABPL,
-	RB_DAAP_CC_APSO,
-	RB_DAAP_CC_PRSV, /* 80 */
-	RB_DAAP_CC_ARIF,
-	RB_DAAP_CC_AESV,
-	RB_DAAP_CC_MSAS,
-	RB_DAAP_CC_AGRP,
-	RB_DAAP_CC_ASCP,
-	RB_DAAP_CC_AESP
-} RBDAAPContentCode;
-
-typedef struct _RBDAAPItem RBDAAPItem;
-
-struct _RBDAAPItem {
-	RBDAAPContentCode content_code;
-	GValue content;
-	guint size;
-};
-
-GNode *
-rb_daap_structure_add (GNode *parent,
-		       RBDAAPContentCode cc,
-		       ...);
-
-gchar *
-rb_daap_structure_serialize (GNode *structure,
-			     guint *length);
-
-GNode *
-rb_daap_structure_parse (const gchar *buf,
-			 gint buf_length);
-
-RBDAAPItem *
-rb_daap_structure_find_item (GNode *structure,
-			     RBDAAPContentCode code);
-
-GNode *
-rb_daap_structure_find_node (GNode *structure,
-			     RBDAAPContentCode code);
-
-void
-rb_daap_structure_print (GNode *structure);
-
-void
-rb_daap_structure_destroy (GNode *structure);
-
-typedef enum {
-	RB_DAAP_TYPE_BYTE = 0x0001,
-	RB_DAAP_TYPE_SIGNED_INT = 0x0002,
-	RB_DAAP_TYPE_SHORT = 0x0003,
-	RB_DAAP_TYPE_INT = 0x0005,
-	RB_DAAP_TYPE_INT64 = 0x0007,
-	RB_DAAP_TYPE_STRING = 0x0009,
-	RB_DAAP_TYPE_DATE = 0x000A,
-	RB_DAAP_TYPE_VERSION = 0x000B,
-	RB_DAAP_TYPE_CONTAINER = 0x000C
-} RBDAAPType;
-
-typedef struct _RBDAAPContentCodeDefinition RBDAAPContentCodeDefinition;
-
-struct _RBDAAPContentCodeDefinition {
-	RBDAAPContentCode code;
-	gint32 int_code;
-	const gchar *name;
-	const gchar *string;
-	RBDAAPType type;
-};
-
-const RBDAAPContentCodeDefinition *
-rb_daap_content_codes (guint *number);
-
-gint32
-rb_daap_content_code_string_as_int32 (const gchar *str);
-
-const gchar *
-rb_daap_content_code_name (RBDAAPContentCode code);
-
-RBDAAPType
-rb_daap_content_code_rb_daap_type (RBDAAPContentCode code);
-
-const gchar *
-rb_daap_content_code_string (RBDAAPContentCode code);
-
-G_END_DECLS
-
-#endif /* __RB_DAAP_STRUCTURE_H */
diff --git a/plugins/daap/rb-dmap-container-db.c b/plugins/daap/rb-dmap-container-db.c
new file mode 100644
index 0000000..1f1c220
--- /dev/null
+++ b/plugins/daap/rb-dmap-container-db.c
@@ -0,0 +1,97 @@
+/*
+ * Database class for DMAP sharing
+ *
+ * Copyright (C) 2008 W. Michael Petullo <mike@flyn.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <glib/ghash.h>
+
+#include "rb-dmap-container-db.h"
+
+struct RBDMAPContainerDbPrivate {
+	GHashTable *db;
+};
+
+DMAPContainerRecord *
+rb_dmap_container_db_lookup_by_id (DMAPContainerDb *db, gint id)
+{
+	DMAPContainerRecord *record = g_hash_table_lookup (RB_DMAP_CONTAINER_DB (db)->priv->db, &id);
+	g_object_ref (record);
+	return record;
+}
+
+void
+rb_dmap_container_db_foreach (DMAPContainerDb *db,
+			      GHFunc func,
+			      gpointer data)
+{
+	g_hash_table_foreach (RB_DMAP_CONTAINER_DB (db)->priv->db, (GHFunc) func, data);
+}
+
+gint64
+rb_dmap_container_db_count (DMAPContainerDb *db)
+{
+	return g_hash_table_size (RB_DMAP_CONTAINER_DB (db)->priv->db);
+}
+
+void
+rb_dmap_container_db_add (DMAPContainerDb *db, DMAPContainerRecord *record)
+{
+        gint *id = g_new (gint, 1);
+	*id = dmap_container_record_get_id (record);
+	g_object_ref (record);
+	g_hash_table_insert (RB_DMAP_CONTAINER_DB (db)->priv->db, id, record);
+}
+
+static void
+rb_dmap_container_db_init (RBDMAPContainerDb *db)
+{
+	db->priv = RB_DMAP_CONTAINER_DB_GET_PRIVATE (db);
+	db->priv->db = g_hash_table_new (g_int_hash, g_int_equal);
+}
+
+static void
+rb_dmap_container_db_class_init (RBDMAPContainerDbClass *klass)
+{
+        g_type_class_add_private (klass, sizeof (RBDMAPContainerDbPrivate));
+}
+
+static void
+rb_dmap_container_db_interface_init (gpointer iface, gpointer data)
+{
+	DMAPContainerDbInterface *dmap_container_db = iface;
+
+	g_assert (G_TYPE_FROM_INTERFACE (dmap_container_db) == TYPE_DMAP_CONTAINER_DB);
+
+	dmap_container_db->lookup_by_id = rb_dmap_container_db_lookup_by_id;
+	dmap_container_db->foreach = rb_dmap_container_db_foreach;
+	dmap_container_db->count = rb_dmap_container_db_count;
+}
+
+G_DEFINE_TYPE_WITH_CODE (RBDMAPContainerDb, rb_dmap_container_db, G_TYPE_OBJECT, 
+			 G_IMPLEMENT_INTERFACE (TYPE_DMAP_CONTAINER_DB,
+						rb_dmap_container_db_interface_init))
+
+RBDMAPContainerDb *
+rb_dmap_container_db_new (void)
+{
+	RBDMAPContainerDb *db;
+
+	db = RB_DMAP_CONTAINER_DB (g_object_new (TYPE_RB_DMAP_CONTAINER_DB, NULL));
+
+	return db;
+}
diff --git a/plugins/daap/rb-dmap-container-db.h b/plugins/daap/rb-dmap-container-db.h
new file mode 100644
index 0000000..a83be24
--- /dev/null
+++ b/plugins/daap/rb-dmap-container-db.h
@@ -0,0 +1,70 @@
+/*
+ * Database class for DMAP sharing
+ *
+ * Copyright (C) 2008 W. Michael Petullo <mike@flyn.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RB_DMAP_CONTAINER_DB
+#define __RB_DMAP_CONTAINER_DB
+
+#include <libdmapsharing/dmap.h>
+
+G_BEGIN_DECLS
+
+#define TYPE_RB_DMAP_CONTAINER_DB         (rb_dmap_container_db_get_type ())
+#define RB_DMAP_CONTAINER_DB(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), \
+				   TYPE_RB_DMAP_CONTAINER_DB, RBDMAPContainerDb))
+#define RB_DMAP_CONTAINER_DB_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), \
+				   TYPE_RB_DMAP_CONTAINER_DB, RBDMAPContainerDbClass))
+#define IS_RB_DMAP_CONTAINER_DB(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
+				   TYPE_RB_DMAP_CONTAINER_DB))
+#define IS_RB_DMAP_CONTAINER_DB_CLASS (k) (G_TYPE_CHECK_CLASS_TYPE ((k), \
+				   TYPE_RB_DMAP_CONTAINER_DB_CLASS))
+#define RB_DMAP_CONTAINER_DB_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), \
+				   TYPE_RB_DMAP_CONTAINER_DB, RBDMAPContainerDbClass))
+#define RB_DMAP_CONTAINER_DB_GET_PRIVATE(o)	     (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
+					      TYPE_RB_DMAP_CONTAINER_DB, \
+					      RBDMAPContainerDbPrivate))
+
+typedef struct RBDMAPContainerDbPrivate RBDMAPContainerDbPrivate;
+
+typedef struct {
+	GObject parent;
+	RBDMAPContainerDbPrivate *priv;
+} RBDMAPContainerDb;
+
+typedef struct {
+	GObjectClass parent;
+} RBDMAPContainerDbClass;
+
+RBDMAPContainerDb *rb_dmap_container_db_new             (void);
+
+GType       rb_dmap_container_db_get_type        (void);
+
+DMAPContainerRecord *rb_dmap_container_db_lookup_by_id    (DMAPContainerDb *db, gint id);
+
+void        rb_dmap_container_db_foreach (DMAPContainerDb *db,
+					  GHFunc func,
+					  gpointer data);
+
+gint64      rb_dmap_container_db_count (DMAPContainerDb *db);
+
+void rb_dmap_container_db_add (DMAPContainerDb *db, DMAPContainerRecord *record);
+
+#endif /* __RB_DMAP_CONTAINER_DB */
+
+G_END_DECLS
diff --git a/plugins/daap/rb-dmap-db-adapter.c b/plugins/daap/rb-dmap-db-adapter.c
new file mode 100644
index 0000000..32f6abb
--- /dev/null
+++ b/plugins/daap/rb-dmap-db-adapter.c
@@ -0,0 +1,255 @@
+/*
+ *  Database class for DMAP sharing
+ *
+ *  Copyright (C) 2008 W. Michael Petullo <mike@flyn.org>
+ *
+ * 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include "rhythmdb.h"
+#include "rb-dmap-db-adapter.h"
+#include "rb-daap-record.h"
+
+#include <glib/gi18n.h>
+#include <libdmapsharing/dmap.h>
+
+struct RBDMAPDbAdapterPrivate {
+	RhythmDB *db;
+	/* FIXME: for sharing this is RHYTHMDB_ENTRY_TYPE_SONG because we
+	* want to share local songs. For browsing this is daap:x:x:x because
+	* we want to add remote media. Does this class need to be split into
+	* two, sharing and browsing? */
+	RhythmDBEntryType type;
+};
+
+typedef struct ForeachAdapterData {
+	gpointer data;
+	GHFunc func;
+} ForeachAdapterData;
+
+static DMAPRecord *rb_dmap_db_adapter_lookup_by_id (DMAPDb *db, guint id)
+{
+	RhythmDBEntry *entry;
+	DMAPRecord *record;
+
+	entry = rhythmdb_entry_lookup_by_id (RB_DMAP_DB_ADAPTER (db)->priv->db,
+					     id);
+
+	record = DMAP_RECORD (rb_daap_record_new (entry));
+
+	return record;
+}
+
+static void foreach_adapter (RhythmDBEntry *entry, gpointer data)
+{
+	ulong id;
+	DMAPRecord *record;
+	ForeachAdapterData *foreach_adapter_data;
+	
+	id = rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_ENTRY_ID);
+	foreach_adapter_data = data;
+	record = DMAP_RECORD (rb_daap_record_new (entry));
+
+	foreach_adapter_data->func (GUINT_TO_POINTER (id),
+				    record,
+				    foreach_adapter_data->data);
+
+	g_object_unref (record);
+}
+
+static void rb_dmap_db_adapter_foreach	(const DMAPDb *db,
+					 GHFunc func,
+				         gpointer data)
+{
+	ForeachAdapterData *foreach_adapter_data;
+
+	foreach_adapter_data = g_new (ForeachAdapterData, 1);
+	foreach_adapter_data->data = data;
+	foreach_adapter_data->func = func;
+
+	rhythmdb_entry_foreach_by_type (RB_DMAP_DB_ADAPTER (db)->priv->db,
+					RB_DMAP_DB_ADAPTER (db)->priv->type,
+				       (GFunc) foreach_adapter,
+				        foreach_adapter_data);
+
+	g_free (foreach_adapter_data);
+}
+
+static gint64 rb_dmap_db_adapter_count (const DMAPDb *db)
+{
+	return rhythmdb_entry_count_by_type (RB_DMAP_DB_ADAPTER (db)->priv->db,
+					     RB_DMAP_DB_ADAPTER (db)->priv->type);
+}
+
+static void
+entry_set_string_prop (RhythmDB        *db,
+                       RhythmDBEntry   *entry,
+                       RhythmDBPropType propid,
+                       const char      *str)
+{
+        GValue value = {0,};
+        const gchar *tmp;
+
+        if (str == NULL || *str == '\0' || !g_utf8_validate (str, -1, NULL)) {
+                tmp = _("Unknown");
+        } else {
+                tmp = str;
+        }
+
+        g_value_init (&value, G_TYPE_STRING);
+        g_value_set_string (&value, tmp);
+        rhythmdb_entry_set (RHYTHMDB (db), entry, propid, &value);
+        g_value_unset (&value);
+}
+
+static gint rb_dmap_db_adapter_add (DMAPDb *db, DMAPRecord *record)
+{
+	gchar *uri = NULL;
+	const gchar *title = NULL;
+	const gchar *album = NULL;
+	const gchar *artist = NULL;
+	const gchar *format = NULL;
+	const gchar *genre = NULL;
+	gint length = 0;
+	gint track = 0;
+	gint disc = 0;
+	gint year = 0;
+	gint filesize = 0;
+	gint bitrate = 0;
+	GValue value = { 0, };
+	RhythmDBEntry *entry = NULL;
+	RBDMAPDbAdapterPrivate *priv = RB_DMAP_DB_ADAPTER (db)->priv;
+
+	g_object_get (record,
+		     "location", &uri,
+		     "year", &year,
+                     "track", &track,
+                     "disc", &disc,
+                     "bitrate", &bitrate,
+                     "duration", &length,
+                     "filesize", &filesize,
+		     "format", &format,
+                     "title", &title,
+                     "album", &album,
+                     "artist", &artist,
+                     "genre", &genre,
+		      NULL);
+
+	entry = rhythmdb_entry_new (priv->db, priv->type, uri);
+
+	if (entry == NULL) {
+		g_warning ("cannot create entry for daap track %s", uri);
+		return FALSE;
+	}
+
+	/* year */
+	if (year != 0) {
+		GDate date;
+		gulong julian;
+
+		/* create dummy date with given year */
+		g_date_set_dmy (&date, 1, G_DATE_JANUARY, year);
+		julian = g_date_get_julian (&date);
+
+		g_value_init (&value, G_TYPE_ULONG);
+		g_value_set_ulong (&value,julian);
+		rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_DATE, &value);
+		g_value_unset (&value);
+	}
+
+	/* track number */
+	g_value_init (&value, G_TYPE_ULONG);
+	g_value_set_ulong (&value,(gulong)track);
+	rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_TRACK_NUMBER, &value);
+	g_value_unset (&value);
+
+	/* disc number */
+	g_value_init (&value, G_TYPE_ULONG);
+	g_value_set_ulong (&value,(gulong)disc);
+	rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_DISC_NUMBER, &value);
+	g_value_unset (&value);
+
+	/* bitrate */
+	g_value_init (&value, G_TYPE_ULONG);
+	g_value_set_ulong (&value,(gulong)bitrate);
+	rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_BITRATE, &value);
+	g_value_unset (&value);
+
+	/* length */
+	g_value_init (&value, G_TYPE_ULONG);
+	g_value_set_ulong (&value,(gulong)length / 1000);
+	rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_DURATION, &value);
+	g_value_unset (&value);
+
+	/* file size */
+	g_value_init (&value, G_TYPE_UINT64);
+	g_value_set_uint64(&value,(gint64)filesize);
+	rhythmdb_entry_set (priv->db, entry, RHYTHMDB_PROP_FILE_SIZE, &value);
+	g_value_unset (&value);
+
+	/* title */
+	entry_set_string_prop (priv->db, entry, RHYTHMDB_PROP_TITLE, title);
+
+	/* album */
+	entry_set_string_prop (priv->db, entry, RHYTHMDB_PROP_ALBUM, album);
+
+	/* artist */
+	entry_set_string_prop (priv->db, entry, RHYTHMDB_PROP_ARTIST, artist);
+
+	/* genre */
+	entry_set_string_prop (priv->db, entry, RHYTHMDB_PROP_GENRE, genre);
+
+	rhythmdb_commit (priv->db);
+
+	return rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_ENTRY_ID);
+}
+
+static void rb_dmap_db_adapter_init (RBDMAPDbAdapter *db)
+{
+	db->priv = RB_DMAP_DB_ADAPTER_GET_PRIVATE (db);
+}
+
+static void rb_dmap_db_adapter_class_init (RBDMAPDbAdapterClass *klass)
+{
+	g_type_class_add_private (klass, sizeof (RBDMAPDbAdapterPrivate));
+}
+
+static void rb_dmap_db_adapter_interface_init (gpointer iface, gpointer data)
+{
+	DMAPDbInterface *dmap_db = iface;
+
+	g_assert (G_TYPE_FROM_INTERFACE (dmap_db) == TYPE_DMAP_DB);
+
+	dmap_db->add = rb_dmap_db_adapter_add;
+	dmap_db->lookup_by_id = rb_dmap_db_adapter_lookup_by_id;
+	dmap_db->foreach = rb_dmap_db_adapter_foreach;
+	dmap_db->count = rb_dmap_db_adapter_count;
+}
+
+G_DEFINE_TYPE_WITH_CODE (RBDMAPDbAdapter, rb_dmap_db_adapter, G_TYPE_OBJECT, 
+			 G_IMPLEMENT_INTERFACE (TYPE_DMAP_DB, rb_dmap_db_adapter_interface_init))
+
+RBDMAPDbAdapter *rb_dmap_db_adapter_new (RhythmDB *rdb, RhythmDBEntryType type)
+{
+	RBDMAPDbAdapter *db;
+
+	db = RB_DMAP_DB_ADAPTER (g_object_new (TYPE_RB_DMAP_DB_ADAPTER,
+					       NULL));
+
+	db->priv->db = rdb;
+	db->priv->type = type;
+
+	return db;
+}
diff --git a/plugins/daap/rb-dmap-db-adapter.h b/plugins/daap/rb-dmap-db-adapter.h
new file mode 100644
index 0000000..f0b4adf
--- /dev/null
+++ b/plugins/daap/rb-dmap-db-adapter.h
@@ -0,0 +1,52 @@
+/*
+ *  Database class for DMAP sharing
+ *
+ *  Copyright (C) 2008 W. Michael Petullo <mike@flyn.org>
+ *
+ * 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef __RB_DMAP_DB_ADAPTER
+#define __RB_DMAP_DB_ADAPTER
+
+#include <libdmapsharing/dmap.h>
+
+G_BEGIN_DECLS
+
+#define TYPE_RB_DMAP_DB_ADAPTER         (rb_dmap_db_adapter_get_type ())
+#define RB_DMAP_DB_ADAPTER(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_RB_DMAP_DB_ADAPTER, RBDMAPDbAdapter))
+#define RB_DMAP_DB_ADAPTER_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), TYPE_RB_DMAP_DB_ADAPTER, RBDMAPDbAdapterClass))
+#define IS_RB_DMAP_DB_ADAPTER(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_RB_DMAP_DB_ADAPTER))
+#define IS_RB_DMAP_DB_ADAPTER_CLASS (k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_RB_DMAP_DB_ADAPTER_CLASS))
+#define RB_DMAP_DB_ADAPTER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_RB_DMAP_DB_ADAPTER, RBDMAPDbAdapterClass))
+#define RB_DMAP_DB_ADAPTER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_RB_DMAP_DB_ADAPTER, RBDMAPDbAdapterPrivate))
+
+typedef struct RBDMAPDbAdapterPrivate RBDMAPDbAdapterPrivate;
+
+typedef struct {
+	GObject parent;
+	RBDMAPDbAdapterPrivate *priv;
+} RBDMAPDbAdapter;
+
+typedef struct {
+	GObjectClass parent;
+} RBDMAPDbAdapterClass;
+
+RBDMAPDbAdapter *rb_dmap_db_adapter_new (RhythmDB *db, RhythmDBEntryType type);
+GType rb_dmap_db_adapter_get_type (void);
+
+#endif /* _RB_DMAP_DB_ADAPTER */
+
+G_END_DECLS
diff --git a/po/pa.po b/po/pa.po
index 7b47154..a6ad386 100644
--- a/po/pa.po
+++ b/po/pa.po
@@ -9,22 +9,22 @@ msgstr ""
 "Project-Id-Version: rhythmbox.HEAD\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
 "cgi?product=rhythmbox&component=general\n"
-"POT-Creation-Date: 2009-07-22 13:41+0000\n"
-"PO-Revision-Date: 2009-07-31 07:39+0530\n"
+"POT-Creation-Date: 2009-08-10 23:39+0000\n"
+"PO-Revision-Date: 2009-09-01 07:08+0530\n"
 "Last-Translator: A S Alam <aalam@users.sf.net>\n"
 "Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 0.3\n"
+"X-Generator: Lokalize 1.0\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../backends/gstreamer/rb-encoder-gst.c:573
+#: ../backends/gstreamer/rb-encoder-gst.c:591
 #, c-format
 msgid "Do you want to overwrite the file \"%s\"?"
 msgstr "ਕੀ ਤੁਸੀਂ \"%s\" ਫਾਇਲ ਉੱਤੇ ਲਿਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
 
-#: ../backends/gstreamer/rb-encoder-gst.c:644
+#: ../backends/gstreamer/rb-encoder-gst.c:663
 #, c-format
 msgid "Could not create a GStreamer sink element to write to %s"
 msgstr "ਜੀਸਟਰੀਮਰ ਸਿੰਕ ਐਲੀਮੈਂਟ %s ਲਿਖਣ ਲਈ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ"
@@ -600,29 +600,29 @@ msgstr "%b %d %Y"
 #.
 #. don't search for 'unknown' when we don't have the artist or title information
 #. Translators: unknown track title
-#: ../lib/rb-cut-and-paste-code.c:326 ../lib/rb-util.c:581
-#: ../lib/rb-util.c:821
+#: ../lib/rb-cut-and-paste-code.c:326 ../lib/rb-util.c:576
+#: ../lib/rb-util.c:816
 #: ../plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py:93
 #: ../plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py:95
 #: ../plugins/artdisplay/artdisplay/CoverArtDatabase.py:180
 #: ../plugins/artdisplay/artdisplay/CoverArtDatabase.py:181
-#: ../plugins/audiocd/rb-audiocd-source.c:373
+#: ../plugins/audiocd/rb-audiocd-source.c:436
 #: ../plugins/audioscrobbler/rb-audioscrobbler-entry.c:94
 #: ../plugins/audioscrobbler/rb-audioscrobbler-entry.c:101
 #: ../plugins/audioscrobbler/rb-audioscrobbler.c:493
 #: ../plugins/audioscrobbler/rb-audioscrobbler.c:497
 #: ../plugins/daap/rb-daap-connection.c:698
-#: ../plugins/generic-player/rb-generic-player-source.c:1401
-#: ../plugins/ipod/rb-ipod-source.c:305
+#: ../plugins/generic-player/rb-generic-player-source.c:1063
+#: ../plugins/ipod/rb-ipod-source.c:307
 #: ../plugins/jamendo/jamendo/JamendoSaxHandler.py:67
 #: ../plugins/iradio/rb-iradio-source.c:527
 #: ../plugins/iradio/rb-iradio-source.c:1092
 #: ../plugins/iradio/rb-station-properties-dialog.c:491
 #: ../plugins/lyrics/lyrics/__init__.py:81
 #: ../plugins/lyrics/lyrics/__init__.py:83
-#: ../plugins/mtpdevice/rb-mtp-source.c:552
-#: ../plugins/mtpdevice/rb-mtp-source.c:927
-#: ../plugins/mtpdevice/rb-mtp-source.c:1018
+#: ../plugins/mtpdevice/rb-mtp-source.c:536
+#: ../plugins/mtpdevice/rb-mtp-source.c:907
+#: ../plugins/mtpdevice/rb-mtp-source.c:995
 #: ../plugins/status-icon/rb-status-icon-plugin.c:727
 #: ../podcast/rb-feed-podcast-properties-dialog.c:316
 #: ../podcast/rb-podcast-manager.c:1873
@@ -654,45 +654,45 @@ msgstr "ਬਹੁਤ ਸਾਰੇ ਸਿੰਮਲਿੰਕ"
 msgid "Cannot get free space at %s: %s"
 msgstr "%s 'ਤੇ ਖਾਲੀ ਥਾਂ ਮਿਲ ਨਹੀਂ ਸਕਦੀ ਹੈ: %s"
 
-#: ../lib/rb-util.c:583 ../remote/dbus/rb-client.c:144
+#: ../lib/rb-util.c:578 ../remote/dbus/rb-client.c:144
 #, c-format
 msgid "%d:%02d"
 msgstr "%d:%02d"
 
-#: ../lib/rb-util.c:585 ../remote/dbus/rb-client.c:146
+#: ../lib/rb-util.c:580 ../remote/dbus/rb-client.c:146
 #, c-format
 msgid "%d:%02d:%02d"
 msgstr "%d:%02d:%02d"
 
-#: ../lib/rb-util.c:620
+#: ../lib/rb-util.c:615
 #, c-format
 msgid "%d:%02d of %d:%02d remaining"
 msgstr "%d:%02d ਵਿਚੋਂ %d:%02d ਬਕਾਇਆ"
 
-#: ../lib/rb-util.c:624
+#: ../lib/rb-util.c:619
 #, c-format
 msgid "%d:%02d:%02d of %d:%02d:%02d remaining"
 msgstr "%d:%02d:%02d ਵਿੱਚੋਂ %d:%02d:%02d ਬਾਕੀ"
 
-#: ../lib/rb-util.c:629
+#: ../lib/rb-util.c:624
 #, c-format
 msgid "%d:%02d of %d:%02d"
 msgstr "%d:%02d ਵਿਚੋਂ %d:%02d"
 
-#: ../lib/rb-util.c:633
+#: ../lib/rb-util.c:628
 #, c-format
 msgid "%d:%02d:%02d of %d:%02d:%02d"
 msgstr "%d:%02d:%02d ਵਿੱਚੋਂ %d:%02d:%02d"
 
-#: ../metadata/rb-metadata-dbus-client.c:377
+#: ../metadata/rb-metadata-dbus-client.c:381
 #, c-format
 msgid "Internal GStreamer problem; file a bug"
 msgstr "ਅੰਦਰੂਨੀ ਜੀ-ਸਟਰੀਮਰ ਗਲਤੀ, ਇੱਕ ਬੱਗ ਜਾਣਕਾਰੀ ਦਿਓ"
 
-#: ../metadata/rb-metadata-dbus-client.c:395
-#: ../metadata/rb-metadata-dbus-client.c:431
-#: ../metadata/rb-metadata-dbus-client.c:767
-#: ../metadata/rb-metadata-dbus-client.c:777
+#: ../metadata/rb-metadata-dbus-client.c:399
+#: ../metadata/rb-metadata-dbus-client.c:435
+#: ../metadata/rb-metadata-dbus-client.c:773
+#: ../metadata/rb-metadata-dbus-client.c:783
 #, c-format
 msgid "D-BUS communication error"
 msgstr "D-BUS ਕਮਿਊਨੀਕੇਸ਼ਨ ਗਲਤੀ"
@@ -789,37 +789,64 @@ msgstr ""
 msgid "_Continue"
 msgstr "ਜਾਰੀ ਰੱਖੋ(_C)"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:377
+#: ../plugins/audiocd/rb-audiocd-source.c:138
+msgid "Reload"
+msgstr "ਮੁੜ-ਲੋਡ ਕਰੋ"
+
+#: ../plugins/audiocd/rb-audiocd-source.c:139
+#| msgid "Magnatune Information"
+msgid "Reload Album Information"
+msgstr "ਐਲਬਮ ਜਾਣਕਾਰੀ ਮੁੜ-ਲੋਡ ਕਰੋ"
+
+#. Info bar for non-Musicbrainz data
+#: ../plugins/audiocd/rb-audiocd-source.c:309
+#| msgid "_Album:"
+msgid "S_ubmit Album"
+msgstr "ਐਲਬਮ ਭੇਜੋ(_u)"
+
+#: ../plugins/audiocd/rb-audiocd-source.c:310
+msgid "Hide"
+msgstr "ਓਹਲੇ"
+
+#: ../plugins/audiocd/rb-audiocd-source.c:312
+msgid "Could not find this album on MusicBrainz."
+msgstr "MusicBrainz ਉੱਤੇ ਇਹ ਐਲਬਮ ਨਹੀਂ ਲੱਭੀ।"
+
+#: ../plugins/audiocd/rb-audiocd-source.c:313
+msgid "You can improve the MusicBrainz database by adding this album."
+msgstr "ਤੁਸੀਂ ਇਹ ਐਲਬਮ MusicBrainz ਡਾਟਾ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰਕੇ ਸੁਧਾਰ ਕਰ ਸਕਦੇ ਹੋ।"
+
+#: ../plugins/audiocd/rb-audiocd-source.c:440
 msgid "<Invalid unicode>"
 msgstr "<ਗਲਤ ਯੂਨੀਕੋਡ>"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:423
+#: ../plugins/audiocd/rb-audiocd-source.c:486
 #, c-format
 msgid "Track %u"
 msgstr "ਟਰੈਕ %u"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:483
-#: ../plugins/audiocd/rb-audiocd-source.c:491
-#: ../plugins/audiocd/rb-audiocd-source.c:859
+#: ../plugins/audiocd/rb-audiocd-source.c:546
+#: ../plugins/audiocd/rb-audiocd-source.c:554
+#: ../plugins/audiocd/rb-audiocd-source.c:942
 msgid "Couldn't load Audio CD"
 msgstr "ਆਡੀਓ CD ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:484
+#: ../plugins/audiocd/rb-audiocd-source.c:547
 msgid "Rhythmbox couldn't access the CD."
 msgstr "ਰੀਥਮਬਾਕਸ CD ਨੂੰ ਵਰਤ ਨਹੀਂ ਸਕਿਆ।"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:492
+#: ../plugins/audiocd/rb-audiocd-source.c:555
 msgid "Rhythmbox couldn't read the CD information."
 msgstr "ਰੀਥਮਬਾਕਸ CD ਜਾਣਕਾਰੀ ਨੂੰ ਨਹੀਂ ਪੜ੍ਹ ਸਕਿਆ ਹੈ।"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:581
+#: ../plugins/audiocd/rb-audiocd-source.c:653
 #: ../sources/rb-library-source.c:150 ../widgets/rb-entry-view.c:1476
 #: ../widgets/rb-query-creator-properties.c:75
 #: ../widgets/rb-query-creator-properties.c:105
 msgid "Title"
 msgstr "ਟਾਈਟਲ"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:588
+#: ../plugins/audiocd/rb-audiocd-source.c:660
 #: ../sources/rb-library-source.c:141 ../widgets/rb-entry-view.c:1486
 #: ../widgets/rb-library-browser.c:143
 #: ../widgets/rb-query-creator-properties.c:76
@@ -827,7 +854,7 @@ msgstr "ਟਾਈਟਲ"
 msgid "Artist"
 msgstr "ਕਲਾਕਾਰ"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:860
+#: ../plugins/audiocd/rb-audiocd-source.c:943
 msgid "Rhythmbox could not get access to the CD device."
 msgstr "ਰੀਥਮਬਾਕਸ CD ਡਰਾਇਵ ਨੂੰ ਨਹੀਂ ਵਰਤ ਸਕਿਆ ਹੈ।"
 
@@ -1822,24 +1849,24 @@ msgstr "ਪੋਰਟੇਬਲ ਪਲੇਅਰ"
 msgid "Support for generic audio player devices (plus PSP and Nokia 770)"
 msgstr "ਸਧਾਰਨ ਆਡੀਓ ਪਲੇਅਰ ਜੰਤਰਾਂ (ਅਤੇ PSP ਅਤੇ ਨੋਕੀਆ 770) ਲਈ ਸਹਿਯੋਗ"
 
-#: ../plugins/generic-player/rb-generic-player-plugin.c:98
+#: ../plugins/generic-player/rb-generic-player-plugin.c:96
 #: ../shell/rb-playlist-manager.c:1150 ../shell/rb-playlist-manager.c:1193
 msgid "New Playlist"
 msgstr "ਨਵੀਂ ਪਲੇਅਲਿਸਟ"
 
-#: ../plugins/generic-player/rb-generic-player-plugin.c:99
+#: ../plugins/generic-player/rb-generic-player-plugin.c:97
 msgid "Create a new playlist on this device"
 msgstr "ਇਸ ਜੰਤਰ ਉੱਤੇ ਨਵੀਂ ਪਲੇਅਲਿਸਟ ਬਣਾਓ"
 
-#: ../plugins/generic-player/rb-generic-player-plugin.c:101
+#: ../plugins/generic-player/rb-generic-player-plugin.c:99
 msgid "Delete Playlist"
 msgstr "ਸੰਗੀਤ-ਸੂਚੀ ਹਟਾਓ"
 
-#: ../plugins/generic-player/rb-generic-player-plugin.c:102
+#: ../plugins/generic-player/rb-generic-player-plugin.c:100
 msgid "Delete this playlist"
 msgstr "ਇਹ ਸੰਗੀਤ-ਸੂਚੀ ਹਟਾਓ"
 
-#: ../plugins/generic-player/rb-generic-player-source.c:982
+#: ../plugins/generic-player/rb-generic-player-source.c:627
 #, c-format
 msgid "Importing (%d/%d)"
 msgstr "ਇੰਪੋਰਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ (%d/%d)"
@@ -1993,60 +2020,60 @@ msgstr "ਨਾਂ(_N):"
 msgid "iPod detected"
 msgstr "iPod ਖੋਜਿਆ"
 
-#: ../plugins/ipod/rb-ipod-helpers.c:304
+#: ../plugins/ipod/rb-ipod-helpers.c:300
 msgid "Unable to initialize new iPod"
 msgstr "ਨਵਾਂ iPod ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:104 ../plugins/ipod/rb-ipod-plugin.c:113
-#: ../plugins/mtpdevice/rb-mtp-plugin.c:109 ../shell/rb-playlist-manager.c:184
+#: ../plugins/ipod/rb-ipod-plugin.c:107 ../plugins/ipod/rb-ipod-plugin.c:116
+#: ../plugins/mtpdevice/rb-mtp-plugin.c:123 ../shell/rb-playlist-manager.c:184
 msgid "_Rename"
 msgstr "ਨਾਂ ਬਦਲੋ(_R)"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:105
+#: ../plugins/ipod/rb-ipod-plugin.c:108
 msgid "Rename iPod"
 msgstr "iPod ਨਾਂ ਬਦਲੋ"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:107 ../shell/rb-shell-clipboard.c:188
+#: ../plugins/ipod/rb-ipod-plugin.c:110 ../shell/rb-shell-clipboard.c:188
 #: ../sources/rb-podcast-source.c:317
 msgid "_Properties"
 msgstr "ਵਿਸ਼ੇਸ਼ਤਾ(_P)"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:108
+#: ../plugins/ipod/rb-ipod-plugin.c:111
 msgid "Display iPod properties"
 msgstr "iPod ਵਿਸ਼ੇਸ਼ਤਾ ਵੇਖੋ"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:110 ../shell/rb-shell-clipboard.c:175
+#: ../plugins/ipod/rb-ipod-plugin.c:113 ../shell/rb-shell-clipboard.c:175
 msgid "_New Playlist"
 msgstr "ਨਵੀਂ ਸੰਗੀਤ-ਸੂਚੀ(_N)"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:111
+#: ../plugins/ipod/rb-ipod-plugin.c:114
 msgid "Add new playlist to iPod"
 msgstr "ਨਵੀਂ ਪਲੇਅਲਿਸਟ iPod ਵਿੱਚ ਸ਼ਾਮਲ"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:114 ../shell/rb-playlist-manager.c:185
+#: ../plugins/ipod/rb-ipod-plugin.c:117 ../shell/rb-playlist-manager.c:185
 msgid "Rename playlist"
 msgstr "ਸੰਗੀਤ-ਸੂਚੀ ਨਾਂ-ਤਬਦੀਲ"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:116 ../shell/rb-playlist-manager.c:187
+#: ../plugins/ipod/rb-ipod-plugin.c:119 ../shell/rb-playlist-manager.c:187
 msgid "_Delete"
 msgstr "ਹਟਾਓ(_D)"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:117 ../shell/rb-playlist-manager.c:188
+#: ../plugins/ipod/rb-ipod-plugin.c:120 ../shell/rb-playlist-manager.c:188
 msgid "Delete playlist"
 msgstr "ਸੰਗੀਤ-ਸੂਚੀ ਹਟਾਓ"
 
-#: ../plugins/ipod/rb-ipod-source.c:1210 ../sources/rb-podcast-source.c:843
+#: ../plugins/ipod/rb-ipod-source.c:1212 ../sources/rb-podcast-source.c:843
 msgid "Podcasts"
 msgstr "ਪੋਡ-ਕਾਸਟ"
 
-#: ../plugins/ipod/rb-ipod-source.c:1563
+#: ../plugins/ipod/rb-ipod-source.c:1565
 msgid "New playlist"
 msgstr "ਨਵੀਂ ਪਲੇਅਲਿਸਟ"
 
 #. Translators: this is used to display the amount of storage space
 #. * used and the total storage space on an iPod.
 #.
-#: ../plugins/ipod/rb-ipod-source.c:1673
+#: ../plugins/ipod/rb-ipod-source.c:1675
 #, c-format
 msgid "%s of %s"
 msgstr "%2$s ਵਿੱਚੋਂ %1$s"
@@ -2914,24 +2941,24 @@ msgstr "%s ਵਿੱਚ ਲੋੜੀਦੀ ਥਾਂ ਨਹੀਂ"
 msgid "Unable to open temporary file: %s"
 msgstr "ਆਰਜ਼ੀ ਫਾਇਲਾਂ ਖੋਲ੍ਹਣ ਲਈ ਅਸਮਰੱਥ: %s"
 
-#: ../plugins/mtpdevice/rb-mtp-plugin.c:106
-#: ../shell/rb-removable-media-manager.c:150
+#: ../plugins/mtpdevice/rb-mtp-plugin.c:120
+#: ../shell/rb-removable-media-manager.c:165
 msgid "_Eject"
 msgstr "ਬਾਹਰ ਕੱਢੋ(_E)"
 
-#: ../plugins/mtpdevice/rb-mtp-plugin.c:107
+#: ../plugins/mtpdevice/rb-mtp-plugin.c:121
 msgid "Eject MTP-device"
 msgstr "MTP-ਜੰਤਰ ਹਟਾਓ"
 
-#: ../plugins/mtpdevice/rb-mtp-plugin.c:110
+#: ../plugins/mtpdevice/rb-mtp-plugin.c:124
 msgid "Rename MTP-device"
 msgstr "MTP-ਜੰਤਰ ਨਾਂ ਬਦਲੋ"
 
-#: ../plugins/mtpdevice/rb-mtp-source.c:177
+#: ../plugins/mtpdevice/rb-mtp-source.c:145
 msgid "Media player device error"
 msgstr "ਮੀਡਿਆ ਪਲੇਅਰ ਜੰਤਰ ਗਲਤੀ"
 
-#: ../plugins/mtpdevice/rb-mtp-source.c:753
+#: ../plugins/mtpdevice/rb-mtp-source.c:733
 msgid "Digital Audio Player"
 msgstr "ਡਿਜ਼ਿਟਲ ਆਡੀਓ ਪਲੇਅਰ"
 
@@ -2986,23 +3013,6 @@ msgstr "ਇੰਟਰਐਕਟਿਵ ਪਾਈਥਨ ਕੰਨਸੋਂਲ"
 msgid "Python Console"
 msgstr "ਪਾਈਥਨ ਕਨਸੋਲ"
 
-#: ../plugins/rb-plugin-manager.c:54
-msgid "Plugin"
-msgstr "ਪਲੱਗਇਨ"
-
-#: ../plugins/rb-plugin-manager.c:55
-msgid "Enabled"
-msgstr "ਯੋਗ ਕੀਤਾ"
-
-#: ../plugins/rb-plugins-engine.c:556
-msgid "Plugin Error"
-msgstr "ਪਲੱਗਇਨ ਗਲਤੀ"
-
-#: ../plugins/rb-plugins-engine.c:556
-#, c-format
-msgid "Unable to activate plugin %s"
-msgstr "ਪਲੱਗਇਨ %s ਨੂੰ ਸਰਗਰਮ ਲਈ ਅਸਫ਼ਲ"
-
 #: ../plugins/sample-python/sample-python.py:14
 msgid "Python Source"
 msgstr "ਪਾਈਥਨ ਸਰੋਤ"
@@ -3109,12 +3119,10 @@ msgid "Always visible"
 msgstr "ਹਮੇਸ਼ਾ ਵੇਖਾਓ"
 
 #: ../plugins/status-icon/status-icon-preferences.ui.h:3
-#| msgid "Banning song"
 msgid "Change song"
 msgstr "ਗਾਣਾ ਬਦਲੋ"
 
 #: ../plugins/status-icon/status-icon-preferences.ui.h:4
-#| msgid "Change the music volume"
 msgid "Change volume"
 msgstr "ਆਵਾਜ਼ ਬਦਲੋ"
 
@@ -3143,15 +3151,18 @@ msgid "Visible with notifications"
 msgstr "ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਾਲ ਵੇਖੋ"
 
 #: ../plugins/status-icon/status-icon-preferences.ui.h:11
-msgid "_Mouse Wheel"
-msgstr "ਮਾਊਸ ਵੀਲ੍ਹ(_M)"
+#| msgid "_Mouse Wheel"
+msgid "_Mouse wheel:"
+msgstr "ਮਾਊਸ ਵੀਲ੍ਹ(_M):"
 
 #: ../plugins/status-icon/status-icon-preferences.ui.h:12
-msgid "_Notifications"
-msgstr "ਨੋਟੀਫਿਕੇਸ਼ਨ(_N)"
+#| msgid "_Notifications"
+msgid "_Notifications:"
+msgstr "ਨੋਟੀਫਿਕੇਸ਼ਨ(_N):"
 
 #: ../plugins/status-icon/status-icon-preferences.ui.h:13
-msgid "_Status Icon:"
+#| msgid "_Status Icon:"
+msgid "_Status icon:"
 msgstr "ਹਾਲਤ ਆਈਕਾਨ(_S):"
 
 #: ../plugins/visualizer/rb-visualizer-plugin.c:229
@@ -3699,41 +3710,58 @@ msgstr "ਅਣਜਾਣ ਸੰਗੀਤ-ਸੂਚੀ: %s"
 msgid "Playlist %s is an automatic playlist"
 msgstr "ਸੰਗੀਤ-ਸੂਚੀ %s ਇੱਕ ਸਵੈ-ਚਾਲਤ ਗੀਤ-ਸੂਚੀ ਹੈ"
 
-#: ../shell/rb-removable-media-manager.c:151
+#: ../shell/rb-plugin-manager.c:54
+msgid "Plugin"
+msgstr "ਪਲੱਗਇਨ"
+
+#: ../shell/rb-plugin-manager.c:55
+msgid "Enabled"
+msgstr "ਯੋਗ ਕੀਤਾ"
+
+#: ../shell/rb-plugins-engine.c:556
+msgid "Plugin Error"
+msgstr "ਪਲੱਗਇਨ ਗਲਤੀ"
+
+#: ../shell/rb-plugins-engine.c:556
+#, c-format
+msgid "Unable to activate plugin %s"
+msgstr "ਪਲੱਗਇਨ %s ਨੂੰ ਸਰਗਰਮ ਲਈ ਅਸਫ਼ਲ"
+
+#: ../shell/rb-removable-media-manager.c:166
 msgid "Eject this medium"
 msgstr "ਇਹ ਮੀਡਿਆ ਬਾਹਰ ਕੱਢੋ"
 
-#: ../shell/rb-removable-media-manager.c:153
+#: ../shell/rb-removable-media-manager.c:168
 msgid "_Extract to Library"
 msgstr "ਲਾਇਬਰੇਰੀ 'ਚ ਐਸਟਰੈਕਟਰ(_E)"
 
-#: ../shell/rb-removable-media-manager.c:154
+#: ../shell/rb-removable-media-manager.c:169
 msgid "Copy all tracks to the library"
 msgstr "ਸਭ ਟਰੈਕਾਂ ਨੂੰ ਲਾਇਬਰੇਰੀ 'ਚ ਨਕਲ ਕਰੋ"
 
-#: ../shell/rb-removable-media-manager.c:156
+#: ../shell/rb-removable-media-manager.c:171
 msgid "_Scan Removable Media"
 msgstr "ਹਟਾਉਣ ਯੋਗ ਮੀਡਿਏ ਦੀ ਜਾਂਚ(_S)"
 
-#: ../shell/rb-removable-media-manager.c:157
+#: ../shell/rb-removable-media-manager.c:172
 msgid "Scan for new Removable Media"
 msgstr "ਨਵੇਂ ਹਟਾਉਣਯੋਗ ਮੀਡਿਆ ਦੀਂ ਜਾਂਚ"
 
 #. Translators: this is the toolbar button label
 #. for Copy to Library action.
-#: ../shell/rb-removable-media-manager.c:710
+#: ../shell/rb-removable-media-manager.c:826
 msgid "Extract"
 msgstr "ਐਕਸਟਰੈਕਟ"
 
-#: ../shell/rb-removable-media-manager.c:741
+#: ../shell/rb-removable-media-manager.c:857
 msgid "Unable to eject"
 msgstr "ਬਾਹਰ ਕੱਢਣ ਲਈ ਅਸਮਰੱਥ"
 
-#: ../shell/rb-removable-media-manager.c:762
+#: ../shell/rb-removable-media-manager.c:878
 msgid "Unable to unmount"
 msgstr "ਅਣ-ਮਾਊਂਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
 
-#: ../shell/rb-removable-media-manager.c:963
+#: ../shell/rb-removable-media-manager.c:1089
 msgid "Error transferring track"
 msgstr "ਟਰੈਕ ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ"
 
diff --git a/po/pt.po b/po/pt.po
index 3939eeb..5219886 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -9,506 +9,470 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: 2.18\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?\n"
-"POT-Creation-Date: 2009-03-11 13:45+0000\n"
-"PO-Revision-Date: 2009-03-13 18:33+0000\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-08-31 22:59+0100\n"
+"PO-Revision-Date: 2009-08-31 14:17+0100\n"
 "Last-Translator: Filipe Gomes <filipefgomes@gmail.com>\n"
 "Language-Team: Portuguese <gnome_pt@yahoogroups.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../backends/gstreamer/rb-encoder-gst.c:584
+#: ../backends/gstreamer/rb-encoder-gst.c:591
 #, c-format
 msgid "Do you want to overwrite the file \"%s\"?"
 msgstr "Deseja sobrepor o ficheiro \"%s\"?"
 
-#: ../backends/gstreamer/rb-encoder-gst.c:655
+#: ../backends/gstreamer/rb-encoder-gst.c:663
 #, c-format
 msgid "Could not create a GStreamer sink element to write to %s"
 msgstr "Incapaz de criar um elemento depósito do GStreamer para escrever em %s"
 
-#: ../backends/gstreamer/rb-player-gst.c:695 ../metadata/rb-metadata-gst.c:850
-#: ../metadata/rb-metadata-gst.c:1413
-#: ../plugins/cd-recorder/rb-recorder-gst.c:508
+#: ../backends/gstreamer/rb-player-gst.c:368
 #, c-format
-msgid "Failed to create %s element; check your installation"
-msgstr "Falha ao criar o elemento %s; verifique a sua instalação"
+msgid "Failed to create playbin2 element; check your GStreamer installation"
+msgstr ""
+"Falha ao criar o elemento playbin2; verifique a sua instalação do GStreamer"
 
-#: ../backends/gstreamer/rb-player-gst.c:763
+#. ?
+#: ../backends/gstreamer/rb-player-gst.c:582
+#: ../backends/gstreamer/rb-player-gst-xfade.c:2754
 #, c-format
-msgid "Unknown playback error"
-msgstr "Erro de reprodução desconhecido"
+msgid "Failed to open output device: %s"
+msgstr "Falha ao abrir dispositivo de saída: %s"
+
+#: ../backends/gstreamer/rb-player-gst.c:627
+#, c-format
+msgid "Unable to start playback pipeline"
+msgstr "Incapaz de iniciar o pipeline de reprodução"
 
-#: ../backends/gstreamer/rb-player-gst-xfade.c:1136
-#: ../backends/gstreamer/rb-player-gst-xfade.c:1150
+#: ../backends/gstreamer/rb-player-gst-xfade.c:1151
+#: ../backends/gstreamer/rb-player-gst-xfade.c:1165
 #, c-format
 msgid "Failed to link new stream into GStreamer pipeline"
 msgstr "Falha ao ligar um novo stream ao pipeline do GStreamer"
 
-#: ../backends/gstreamer/rb-player-gst-xfade.c:1178
+#: ../backends/gstreamer/rb-player-gst-xfade.c:1193
 #, c-format
 msgid "Failed to start new stream"
 msgstr "Falhou ao iniciar novo stream"
 
 #. ?
-#: ../backends/gstreamer/rb-player-gst-xfade.c:2717
+#: ../backends/gstreamer/rb-player-gst-xfade.c:2679
 #, c-format
 msgid "Failed to open output device"
 msgstr "Falha ao abrir dispositivo de saída"
 
-#. ?
-#: ../backends/gstreamer/rb-player-gst-xfade.c:2796
-#, c-format
-msgid "Failed to open output device: %s"
-msgstr "Falha ao abrir dispositivo de saída: %s"
-
-#: ../backends/gstreamer/rb-player-gst-xfade.c:3033
-#: ../backends/gstreamer/rb-player-gst-xfade.c:3115
+#: ../backends/gstreamer/rb-player-gst-xfade.c:3020
+#: ../backends/gstreamer/rb-player-gst-xfade.c:3102
 #, c-format
 msgid "Failed to create GStreamer element; check your installation"
 msgstr "Falha ao criar um elemento GStreamer; verifique a sua instalação"
 
-#: ../backends/gstreamer/rb-player-gst-xfade.c:3044
+#: ../backends/gstreamer/rb-player-gst-xfade.c:3031
 #, c-format
 msgid "Failed to create audio output element; check your installation"
 msgstr ""
 "Falha ao criar um elemento de saída de áudio; verifique a sua instalação"
 
-#: ../backends/gstreamer/rb-player-gst-xfade.c:3089
-#: ../backends/gstreamer/rb-player-gst-xfade.c:3131
-#: ../backends/gstreamer/rb-player-gst-xfade.c:3157
-#: ../backends/gstreamer/rb-player-gst-xfade.c:3166
-#: ../backends/gstreamer/rb-player-gst-xfade.c:3175
+#: ../backends/gstreamer/rb-player-gst-xfade.c:3076
+#: ../backends/gstreamer/rb-player-gst-xfade.c:3118
+#: ../backends/gstreamer/rb-player-gst-xfade.c:3144
+#: ../backends/gstreamer/rb-player-gst-xfade.c:3153
+#: ../backends/gstreamer/rb-player-gst-xfade.c:3162
 #, c-format
 msgid "Failed to link GStreamer pipeline; check your installation"
 msgstr "Falha ao ligar pipeline do GStreamer; verifique a sua instalação"
 
-#: ../backends/gstreamer/rb-player-gst-xfade.c:3270
+#: ../backends/gstreamer/rb-player-gst-xfade.c:3257
 #, c-format
 msgid "Failed to create GStreamer pipeline to play %s"
 msgstr "Falha ao ligar pipeline do GStreamer para tocar %s"
 
-#: ../backends/gstreamer/rb-player-gst-xfade.c:3286
+#: ../backends/gstreamer/rb-player-gst-xfade.c:3273
 #, c-format
 msgid "Failed to start playback of %s"
 msgstr "Falha ao iniciar a reprodução de %s"
 
-#: ../data/glade/create-playlist.glade.h:1
+#: ../data/ui/create-playlist.ui.h:1
 msgid " "
 msgstr " "
 
-#: ../data/glade/create-playlist.glade.h:2
+#: ../data/ui/create-playlist.ui.h:2
 msgid "A_dd if any criteria are matched"
 msgstr "A_dicionar se algum critério for satisfeito"
 
-#: ../data/glade/create-playlist.glade.h:3
+#: ../data/ui/create-playlist.ui.h:3
 msgid "Create automatically updating playlist where:"
 msgstr "Criar lista de reprodução de actualização automática onde:"
 
-#: ../data/glade/create-playlist.glade.h:4
+#: ../data/ui/create-playlist.ui.h:4
+msgid "GB"
+msgstr "GB"
+
+#: ../data/ui/create-playlist.ui.h:5
+msgid "MB"
+msgstr "MB"
+
+#: ../data/ui/create-playlist.ui.h:6
+msgid "Minutes"
+msgstr "Minutos"
+
+#: ../data/ui/create-playlist.ui.h:7
 msgid "_Limit to: "
 msgstr "_Limitar a: "
 
-#: ../data/glade/create-playlist.glade.h:5
+#: ../data/ui/create-playlist.ui.h:8
 msgid "_When sorted by:"
 msgstr "_Quando ordenado por:"
 
-#: ../data/glade/create-playlist.glade.h:6
-msgid ""
-"songs\n"
-"MB\n"
-"GB\n"
-"Minutes"
-msgstr ""
-"músicas\n"
-"MB\n"
-"GB\n"
-"Minutos"
+#: ../data/ui/create-playlist.ui.h:9
+msgid "songs"
+msgstr "músicas"
 
-#: ../data/glade/general-prefs.glade.h:1
+#: ../data/ui/general-prefs.ui.h:1
 msgid "A_lbum"
 msgstr "Á_lbum"
 
-#: ../data/glade/general-prefs.glade.h:2
+#: ../data/ui/general-prefs.ui.h:2
 msgid "Browser Views"
 msgstr "Vistas do Navegador"
 
-#: ../data/glade/general-prefs.glade.h:3
+#: ../data/ui/general-prefs.ui.h:3
 msgid "Da_te added"
 msgstr "Da_ta de adição"
 
-#: ../data/glade/general-prefs.glade.h:4
-msgid ""
-"Default\n"
-"-\n"
-"Text below icons\n"
-"Text beside icons\n"
-"Icons only\n"
-"Text only"
-msgstr ""
-"Predefinição\n"
-"-\n"
-"Texto abaixo dos ícones\n"
-"Texto ao lado dos ícones\n"
-"Apenas ícones\n"
-"Apenas texto"
-
-#: ../data/glade/general-prefs.glade.h:10
+#: ../data/ui/general-prefs.ui.h:4
+msgid "Default"
+msgstr "Omissão"
+
+#: ../data/ui/general-prefs.ui.h:5
 msgid "G_enres, artists and albums"
 msgstr "Gén_eros, artistas e álbuns"
 
-#: ../data/glade/general-prefs.glade.h:11
+#: ../data/ui/general-prefs.ui.h:6
+msgid "Icons only"
+msgstr "Apenas ícones"
+
+#: ../data/ui/general-prefs.ui.h:7
 msgid "Lo_cation"
 msgstr "Lo_calização"
 
-#: ../data/glade/general-prefs.glade.h:12
+#: ../data/ui/general-prefs.ui.h:8
+msgid "Text below icons"
+msgstr "Texto abaixo dos ícones"
+
+#: ../data/ui/general-prefs.ui.h:9
+msgid "Text beside icons"
+msgstr "Texto ao lado dos ícones"
+
+#: ../data/ui/general-prefs.ui.h:10
+msgid "Text only"
+msgstr "Apenas texto"
+
+#: ../data/ui/general-prefs.ui.h:11
 msgid "Ti_me"
 msgstr "_Duração"
 
-#: ../data/glade/general-prefs.glade.h:13
+#: ../data/ui/general-prefs.ui.h:12
 msgid "Toolbar Button Labels"
 msgstr "Etiquetas dos Botões da Barra de Ferramentas"
 
-#: ../data/glade/general-prefs.glade.h:14
+#: ../data/ui/general-prefs.ui.h:13
 msgid "Track _number"
 msgstr "_Número da faixa"
 
-#: ../data/glade/general-prefs.glade.h:15
+#: ../data/ui/general-prefs.ui.h:14
 msgid "Visible Columns"
 msgstr "Colunas Visíveis"
 
-#: ../data/glade/general-prefs.glade.h:16
+#: ../data/ui/general-prefs.ui.h:15
 msgid "_Artist"
 msgstr "_Artista"
 
-#: ../data/glade/general-prefs.glade.h:17
+#: ../data/ui/general-prefs.ui.h:16
 msgid "_Artists and albums"
 msgstr "_Artistas e álbuns"
 
-#: ../data/glade/general-prefs.glade.h:18
+#: ../data/ui/general-prefs.ui.h:17
 msgid "_Genre"
 msgstr "_Género"
 
-#: ../data/glade/general-prefs.glade.h:19
+#: ../data/ui/general-prefs.ui.h:18
 msgid "_Genres and artists"
 msgstr "_Géneros e artistas"
 
-#: ../data/glade/general-prefs.glade.h:20
+#: ../data/ui/general-prefs.ui.h:19
 msgid "_Last played"
 msgstr "Ú_ltima reprodução"
 
-#: ../data/glade/general-prefs.glade.h:21
+#: ../data/ui/general-prefs.ui.h:20
 msgid "_Play count"
 msgstr "_Número de reproduções"
 
-#: ../data/glade/general-prefs.glade.h:22
+#: ../data/ui/general-prefs.ui.h:21
 msgid "_Quality"
 msgstr "_Qualidade"
 
-#: ../data/glade/general-prefs.glade.h:23
+#: ../data/ui/general-prefs.ui.h:22
 msgid "_Rating"
 msgstr "_Classificação"
 
-#: ../data/glade/general-prefs.glade.h:24
+#: ../data/ui/general-prefs.ui.h:23
 msgid "_Year"
 msgstr "A_no"
 
-#: ../data/glade/library-prefs.glade.h:1
-#: ../data/glade/playback-prefs.glade.h:1
-msgid "    "
-msgstr "    "
-
-#: ../data/glade/library-prefs.glade.h:2
+#: ../data/ui/library-prefs.ui.h:1
 msgid "Artist/Artist - Album/Artist (Album) - 01 - Title.ogg"
 msgstr "Artista/Artista - Álbum/Artista (Álbum) - 01 - Título.ogg"
 
-#: ../data/glade/library-prefs.glade.h:3
+#: ../data/ui/library-prefs.ui.h:2
 msgid "F_older hierarchy:"
 msgstr "Hie_rarquia de pastas:"
 
-#: ../data/glade/library-prefs.glade.h:4
+#: ../data/ui/library-prefs.ui.h:3
 msgid "Library Location"
 msgstr "Localização da Biblioteca"
 
-#: ../data/glade/library-prefs.glade.h:5
+#: ../data/ui/library-prefs.ui.h:4
 msgid "Library Structure"
 msgstr "Estrutura da Biblioteca"
 
-#: ../data/glade/library-prefs.glade.h:6
+#: ../data/ui/library-prefs.ui.h:5
 msgid "_Browse..."
 msgstr "_Navegar..."
 
-#: ../data/glade/library-prefs.glade.h:7 ../shell/rb-playlist-manager.c:190
+#: ../data/ui/library-prefs.ui.h:6 ../shell/rb-playlist-manager.c:190
 msgid "_Edit..."
 msgstr "_Editar..."
 
-#: ../data/glade/library-prefs.glade.h:8
+#: ../data/ui/library-prefs.ui.h:7
 msgid "_File name:"
 msgstr "Nome do _ficheiro:"
 
-#: ../data/glade/library-prefs.glade.h:9
+#: ../data/ui/library-prefs.ui.h:8
 msgid "_Music files are placed in:"
 msgstr "Ficheiros de _música estão colocados em:"
 
-#: ../data/glade/library-prefs.glade.h:10
+#: ../data/ui/library-prefs.ui.h:9
 msgid "_Preferred format:"
 msgstr "Formato _preferido:"
 
-#: ../data/glade/library-prefs.glade.h:11
+#: ../data/ui/library-prefs.ui.h:10
 msgid "_Watch my library for new files"
 msgstr "_Vigiar a minha biblioteca por ficheiros novos"
 
-#: ../data/glade/playback-prefs.glade.h:2
-msgid "C_rossfade between songs on the same album"
-msgstr "T_ransição gradual entre músicas do mesmo álbum"
-
-#: ../data/glade/playback-prefs.glade.h:3
+#: ../data/ui/playback-prefs.ui.h:1
 msgid "Crossfade Duration (Seconds)"
 msgstr "Duração da Transição Gradual (Segundos)"
 
-#: ../data/glade/playback-prefs.glade.h:4
-msgid "Crossfade Type"
-msgstr "Tipo de Transição"
-
-#: ../data/glade/playback-prefs.glade.h:5
+#: ../data/ui/playback-prefs.ui.h:2
 msgid "Network Buffer Size (kB)"
 msgstr "Tamanho do Buffer de Rede (kB)"
 
-#: ../data/glade/playback-prefs.glade.h:6
+#: ../data/ui/playback-prefs.ui.h:3
 msgid "Player Backend"
 msgstr "Infra-estrutura do Reproductor"
 
-#: ../data/glade/playback-prefs.glade.h:7
+#: ../data/ui/playback-prefs.ui.h:4
 msgid "_Use crossfading backend (requires restart)"
 msgstr ""
 "_Utilizar infra-estrutura para transição gradual (requere reinicialização)"
 
-#: ../data/glade/playlist-save.glade.h:1
+#: ../data/ui/playlist-save.ui.h:1
 msgid "<b>Playlist format</b>"
 msgstr "<b>Formato da lista de reprodução</b>"
 
-#: ../data/glade/playlist-save.glade.h:2
+#: ../data/ui/playlist-save.ui.h:2
 msgid "By extension"
 msgstr "Por extensão"
 
-#: ../data/glade/playlist-save.glade.h:3
+#: ../data/ui/playlist-save.ui.h:3
 msgid "Save Playlist"
 msgstr "Guardar a Lista de Reprodução"
 
-#: ../data/glade/playlist-save.glade.h:4
+#: ../data/ui/playlist-save.ui.h:4
 msgid "Select playlist format:"
 msgstr "Seleccionar o formato da lista de reprodução:"
 
-#: ../data/glade/plugins.glade.h:1
-#: ../data/glade/podcast-feed-properties.glade.h:2
+#: ../data/ui/plugins.ui.h:1 ../data/ui/podcast-feed-properties.ui.h:1
 msgid "Author:"
 msgstr "Autor:"
 
-#: ../data/glade/plugins.glade.h:2
+#: ../data/ui/plugins.ui.h:2
 msgid "C_onfigure..."
 msgstr "C_onfigurar..."
 
-#: ../data/glade/plugins.glade.h:3
-#: ../data/glade/podcast-feed-properties.glade.h:4
+#: ../data/ui/plugins.ui.h:3 ../data/ui/podcast-feed-properties.ui.h:3
 msgid "Copyright:"
 msgstr "Copyright:"
 
-#: ../data/glade/plugins.glade.h:4
-#: ../data/glade/podcast-feed-properties.glade.h:5
-#: ../data/glade/podcast-properties.glade.h:5
+#: ../data/ui/plugins.ui.h:4 ../data/ui/podcast-feed-properties.ui.h:4
+#: ../data/ui/podcast-properties.ui.h:4
 msgid "Description:"
 msgstr "Descrição:"
 
-#: ../data/glade/plugins.glade.h:5
-msgid "Rhythmbox Plugins"
-msgstr "Plugins do Rhythmbox"
-
-#: ../data/glade/plugins.glade.h:6
+#: ../data/ui/plugins.ui.h:5
 msgid "Site:"
 msgstr "Site:"
 
-#: ../data/glade/podcast-feed-properties.glade.h:1
-#: ../data/glade/podcast-properties.glade.h:1
-msgid "-"
-msgstr "-"
-
-#: ../data/glade/podcast-feed-properties.glade.h:3
-#: ../data/glade/podcast-properties.glade.h:2
-#: ../data/glade/song-info.glade.h:1 ../plugins/ipod/ipod-info.glade.h:5
-#: ../plugins/iradio/station-properties.glade.h:1
+#: ../data/ui/podcast-feed-properties.ui.h:2
+#: ../data/ui/podcast-properties.ui.h:1 ../data/ui/song-info.ui.h:1
+#: ../plugins/ipod/ipod-info.ui.h:5
+#: ../plugins/iradio/station-properties.ui.h:1
 msgid "Basic"
 msgstr "Básico"
 
-#: ../data/glade/podcast-feed-properties.glade.h:6
-#: ../data/glade/podcast-properties.glade.h:6
-#: ../data/glade/song-info.glade.h:4
-#: ../plugins/iradio/station-properties.glade.h:3
+#: ../data/ui/podcast-feed-properties.ui.h:5
+#: ../data/ui/podcast-properties.ui.h:5 ../data/ui/song-info.ui.h:4
+#: ../plugins/iradio/station-properties.ui.h:3
 msgid "Details"
 msgstr "Detalhes"
 
-#: ../data/glade/podcast-feed-properties.glade.h:7
+#: ../data/ui/podcast-feed-properties.ui.h:6
 msgid "Language:"
 msgstr "Idioma:"
 
-#: ../data/glade/podcast-feed-properties.glade.h:8
+#: ../data/ui/podcast-feed-properties.ui.h:7
 msgid "Last episode:"
 msgstr "Último episódio:"
 
-#: ../data/glade/podcast-feed-properties.glade.h:9
+#: ../data/ui/podcast-feed-properties.ui.h:8
 msgid "Last updated:"
 msgstr "Última actualização:"
 
-#: ../data/glade/podcast-feed-properties.glade.h:10
-#: ../data/glade/podcast-properties.glade.h:12
+#: ../data/ui/podcast-feed-properties.ui.h:9
+#: ../data/ui/podcast-properties.ui.h:11
 msgid "Source:"
 msgstr "Origem_"
 
-#: ../data/glade/podcast-feed-properties.glade.h:11
-#: ../data/glade/podcast-properties.glade.h:13
+#: ../data/ui/podcast-feed-properties.ui.h:10
+#: ../data/ui/podcast-properties.ui.h:12
 msgid "Title:"
 msgstr "Título:"
 
-#: ../data/glade/podcast-prefs.glade.h:1
+#: ../data/ui/podcast-prefs.ui.h:1
 msgid "<b>Download Manager</b>"
 msgstr "<b>Gestor de Transferências</b>"
 
-#: ../data/glade/podcast-prefs.glade.h:2
+#: ../data/ui/podcast-prefs.ui.h:2
 msgid "Check for _new episodes:"
 msgstr "Procurar por _novos episódios:"
 
-#: ../data/glade/podcast-prefs.glade.h:3
-msgid ""
-"Every hour\n"
-"Every day\n"
-"Every week\n"
-"Manually"
-msgstr ""
-"A cada hora\n"
-"A cada dia\n"
-"A cada semana\n"
-"Manualmente"
+#: ../data/ui/podcast-prefs.ui.h:3
+msgid "Every day"
+msgstr "Todos os dias"
+
+#: ../data/ui/podcast-prefs.ui.h:4
+msgid "Every hour"
+msgstr "Todas as horas"
+
+#: ../data/ui/podcast-prefs.ui.h:5
+msgid "Every week"
+msgstr "Todas as semanas"
 
-#: ../data/glade/podcast-prefs.glade.h:7
+#: ../data/ui/podcast-prefs.ui.h:6
+msgid "Manually"
+msgstr "Manualmente"
+
+#: ../data/ui/podcast-prefs.ui.h:7
 msgid "Select Folder For Podcasts"
 msgstr "Seleccione Pasta Para Podcasts"
 
-#: ../data/glade/podcast-prefs.glade.h:8
+#: ../data/ui/podcast-prefs.ui.h:8
 msgid "_Download location:"
 msgstr "Localização das _transferências:"
 
-#: ../data/glade/podcast-properties.glade.h:3
-#: ../data/glade/song-info.glade.h:2
-#: ../plugins/iradio/station-properties.glade.h:2
+#: ../data/ui/podcast-properties.ui.h:2 ../data/ui/song-info.ui.h:2
+#: ../plugins/iradio/station-properties.ui.h:2
 msgid "Bitrate:"
 msgstr "Taxa de bits:"
 
-#: ../data/glade/podcast-properties.glade.h:4
+#: ../data/ui/podcast-properties.ui.h:3
 msgid "Date:"
 msgstr "Data:"
 
-#: ../data/glade/podcast-properties.glade.h:7
+#: ../data/ui/podcast-properties.ui.h:6
 msgid "Download location:"
 msgstr "Localização do download:"
 
-#: ../data/glade/podcast-properties.glade.h:8
-#: ../data/glade/song-info.glade.h:5
+#: ../data/ui/podcast-properties.ui.h:7 ../data/ui/song-info.ui.h:5
 msgid "Duration:"
 msgstr "Duração:"
 
-#: ../data/glade/podcast-properties.glade.h:9
+#: ../data/ui/podcast-properties.ui.h:8
 msgid "Feed:"
 msgstr "Fonte:"
 
-#: ../data/glade/podcast-properties.glade.h:10
-#: ../data/glade/song-info.glade.h:9
-#: ../plugins/iradio/station-properties.glade.h:6
+#: ../data/ui/podcast-properties.ui.h:9 ../data/ui/song-info.ui.h:9
+#: ../plugins/iradio/station-properties.ui.h:6
 msgid "Last played:"
 msgstr "Última reprodução:"
 
-#: ../data/glade/podcast-properties.glade.h:11
-#: ../data/glade/song-info.glade.h:11
-#: ../plugins/iradio/station-properties.glade.h:7
+#: ../data/ui/podcast-properties.ui.h:10 ../data/ui/song-info.ui.h:11
+#: ../plugins/iradio/station-properties.ui.h:7
 msgid "Play count:"
 msgstr "Número de reproduções:"
 
-#: ../data/glade/podcast-properties.glade.h:14
-#: ../data/glade/song-info-multiple.glade.h:5
-#: ../data/glade/song-info.glade.h:16
-#: ../plugins/iradio/station-properties.glade.h:9
+#: ../data/ui/podcast-properties.ui.h:13 ../data/ui/song-info-multiple.ui.h:5
+#: ../data/ui/song-info.ui.h:16 ../plugins/iradio/station-properties.ui.h:9
 msgid "_Rating:"
 msgstr "_Classificação:"
 
-#: ../data/glade/song-info-multiple.glade.h:1
-#: ../data/glade/song-info.glade.h:12
+#: ../data/ui/song-info-multiple.ui.h:1 ../data/ui/song-info.ui.h:12
 msgid "_Album:"
 msgstr "Álb_um:"
 
-#: ../data/glade/song-info-multiple.glade.h:2
-#: ../data/glade/song-info.glade.h:13
+#: ../data/ui/song-info-multiple.ui.h:2 ../data/ui/song-info.ui.h:13
+#: ../plugins/audiocd/album-info.ui.h:3
 msgid "_Artist:"
 msgstr "_Artista:"
 
-#: ../data/glade/song-info-multiple.glade.h:3
-#: ../data/glade/song-info.glade.h:14
+#: ../data/ui/song-info-multiple.ui.h:3 ../data/ui/song-info.ui.h:14
 msgid "_Disc number:"
 msgstr "_Número do disco:"
 
-#: ../data/glade/song-info-multiple.glade.h:4
-#: ../data/glade/song-info.glade.h:15
-#: ../plugins/iradio/station-properties.glade.h:8
+#: ../data/ui/song-info-multiple.ui.h:4 ../data/ui/song-info.ui.h:15
+#: ../plugins/audiocd/album-info.ui.h:5
+#: ../plugins/iradio/station-properties.ui.h:8
 msgid "_Genre:"
 msgstr "_Género:"
 
-#: ../data/glade/song-info-multiple.glade.h:6
-#: ../data/glade/song-info.glade.h:19
-#: ../plugins/magnatune/magnatune-prefs.glade.h:46
+#: ../data/ui/song-info-multiple.ui.h:6 ../data/ui/song-info.ui.h:19
+#: ../plugins/audiocd/album-info.ui.h:6
+#: ../plugins/magnatune/magnatune-prefs.ui.h:46
 msgid "_Year:"
 msgstr "_Ano:"
 
-#: ../data/glade/song-info.glade.h:3
+#: ../data/ui/song-info.ui.h:3
 msgid "Date added:"
 msgstr "Data de adição:"
 
-#: ../data/glade/song-info.glade.h:6
-#: ../plugins/iradio/station-properties.glade.h:4
+#: ../data/ui/song-info.ui.h:6 ../plugins/iradio/station-properties.ui.h:4
 msgid "Error message"
 msgstr "Mensagem de erro"
 
-#: ../data/glade/song-info.glade.h:7
+#: ../data/ui/song-info.ui.h:7
 msgid "File name:"
 msgstr "Nome do ficheiro:"
 
-#: ../data/glade/song-info.glade.h:8
+#: ../data/ui/song-info.ui.h:8
 msgid "File size:"
 msgstr "Tamanho do ficheiro:"
 
-#: ../data/glade/song-info.glade.h:10
+#: ../data/ui/song-info.ui.h:10
 msgid "Location:"
 msgstr "Localização:"
 
-#: ../data/glade/song-info.glade.h:17
-#: ../plugins/iradio/station-properties.glade.h:10
+#: ../data/ui/song-info.ui.h:17 ../plugins/iradio/station-properties.ui.h:10
 msgid "_Title:"
 msgstr "_Título:"
 
-#: ../data/glade/song-info.glade.h:18
+#: ../data/ui/song-info.ui.h:18
 msgid "_Track number:"
 msgstr "_Número da faixa:"
 
-#: ../data/glade/uri.glade.h:1
-msgid "*"
-msgstr "*"
-
-#: ../data/glade/uri.glade.h:2
-msgid "Enter the _location (URI) of the file you would like to add:"
-msgstr "Introduza a _localização (URI) do ficheiro que deseja adicionar:"
-
-#: ../data/glade/uri.glade.h:3
-msgid "Open from URI"
-msgstr "Abrir a partir de URI"
-
 #: ../data/playlists.xml.in.h:1
 msgid "My Top Rated"
 msgstr "Meus Melhores Classificados"
@@ -523,8 +487,9 @@ msgstr "Tocados Recentemente"
 
 #: ../data/rhythmbox.desktop.in.in.h:1
 #: ../plugins/power-manager/rb-power-manager-plugin.c:207
-#: ../plugins/visualizer/rb-visualizer-plugin.c:1492 ../shell/rb-shell.c:1045
-#: ../shell/rb-shell.c:2183 ../shell/rb-tray-icon.c:49
+#: ../plugins/status-icon/rb-status-icon-plugin.c:60
+#: ../plugins/visualizer/rb-visualizer-plugin.c:1524 ../shell/rb-shell.c:1022
+#: ../shell/rb-shell.c:1989
 msgid "Music Player"
 msgstr "Reprodutor de Música"
 
@@ -536,6 +501,70 @@ msgstr "Reproduza e organize a sua colecção de música"
 msgid "Rhythmbox Music Player"
 msgstr "Reprodutor de Música Rhythmbox"
 
+#: ../lib/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr "O ficheiro não é um ficheiro .desktop válido"
+
+#: ../lib/eggdesktopfile.c:188
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr "Versão '%s' de ficheiro desktop desconhecida"
+
+#: ../lib/eggdesktopfile.c:958
+#, c-format
+msgid "Starting %s"
+msgstr "A iniciar %s"
+
+#: ../lib/eggdesktopfile.c:1100
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr "A aplicação não aceita documentos na linha de comando"
+
+#: ../lib/eggdesktopfile.c:1168
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr "Opção de arranque desconhecida: %d"
+
+#: ../lib/eggdesktopfile.c:1373
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+"Não é possível passar URIs de documentos a uma entrada de desktop 'Type=Link'"
+
+#: ../lib/eggdesktopfile.c:1392
+#, c-format
+msgid "Not a launchable item"
+msgstr "Não é um item iniciável"
+
+#: ../lib/eggsmclient.c:225
+msgid "Disable connection to session manager"
+msgstr "Desactivar a ligação ao gestor de sessões"
+
+#: ../lib/eggsmclient.c:228
+msgid "Specify file containing saved configuration"
+msgstr "Especificar o ficheiro que contém a configuração gravada"
+
+#: ../lib/eggsmclient.c:228
+msgid "FILE"
+msgstr "FICHEIRO"
+
+#: ../lib/eggsmclient.c:231
+msgid "Specify session management ID"
+msgstr "Especificar o ID de gestão de sessão"
+
+#: ../lib/eggsmclient.c:231
+msgid "ID"
+msgstr "ID"
+
+#: ../lib/eggsmclient.c:252
+msgid "Session management options:"
+msgstr "Opções da gestão de sessão:"
+
+#: ../lib/eggsmclient.c:253
+msgid "Show session management options"
+msgstr "Apresentar as opções da gestão de sessão"
+
 #. Translators: "friendly time" string for the current day, strftime format. like "Today 12:34 am"
 #: ../lib/rb-cut-and-paste-code.c:270
 msgid "Today %I:%M %p"
@@ -570,82 +599,71 @@ msgid "%b %d %Y"
 msgstr "%b %d %Y"
 
 #. impossible time or broken locale settings
-#. TODO: Improve to decrease wrong cover downloads, maybe add severity?
-#. Assemble list of search keywords (and thus search queries)
-#. If we still have no definite hit, use first result where artist matches
 #. we really do need to fix this so untagged entries actually have NULL rather than
 #. * a translated string.
 #.
+#. don't search for 'unknown' when we don't have the artist or title information
 #. Translators: unknown track title
 #: ../lib/rb-cut-and-paste-code.c:326 ../lib/rb-util.c:576
 #: ../lib/rb-util.c:816
-#: ../plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py:85
-#: ../plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py:86
-#: ../plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py:88
-#: ../plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py:123
-#: ../plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py:129
-#: ../plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py:248
-#: ../plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py:269
-#: ../plugins/artdisplay/artdisplay/CoverArtDatabase.py:159
-#: ../plugins/artdisplay/artdisplay/CoverArtDatabase.py:160
-#: ../plugins/audiocd/rb-audiocd-source.c:217
-#: ../plugins/audioscrobbler/rb-audioscrobbler-entry.c:95
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:510
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:514
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:534
+#: ../plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py:98
+#: ../plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py:100
+#: ../plugins/artdisplay/artdisplay/CoverArtDatabase.py:181
+#: ../plugins/artdisplay/artdisplay/CoverArtDatabase.py:182
+#: ../plugins/audiocd/rb-audiocd-source.c:436
+#: ../plugins/audioscrobbler/rb-audioscrobbler-entry.c:94
+#: ../plugins/audioscrobbler/rb-audioscrobbler-entry.c:101
+#: ../plugins/audioscrobbler/rb-audioscrobbler.c:493
+#: ../plugins/audioscrobbler/rb-audioscrobbler.c:497
 #: ../plugins/daap/rb-daap-connection.c:698
-#: ../plugins/generic-player/rb-generic-player-source.c:1295
-#: ../plugins/ipod/rb-ipod-source.c:305
-#: ../plugins/jamendo/jamendo/JamendoSource.py:298
-#: ../plugins/iradio/rb-iradio-source.c:530
-#: ../plugins/iradio/rb-iradio-source.c:1094
-#: ../plugins/iradio/rb-station-properties-dialog.c:495
-#: ../plugins/mtpdevice/rb-mtp-source.c:495
-#: ../podcast/rb-feed-podcast-properties-dialog.c:320
+#: ../plugins/generic-player/rb-generic-player-source.c:1063
+#: ../plugins/ipod/rb-ipod-source.c:307
+#: ../plugins/jamendo/jamendo/JamendoSaxHandler.py:67
+#: ../plugins/iradio/rb-iradio-source.c:527
+#: ../plugins/iradio/rb-iradio-source.c:1092
+#: ../plugins/iradio/rb-station-properties-dialog.c:491
+#: ../plugins/lyrics/lyrics/__init__.py:81
+#: ../plugins/lyrics/lyrics/__init__.py:83
+#: ../plugins/mtpdevice/rb-mtp-source.c:536
+#: ../plugins/mtpdevice/rb-mtp-source.c:907
+#: ../plugins/mtpdevice/rb-mtp-source.c:995
+#: ../plugins/status-icon/rb-status-icon-plugin.c:727
+#: ../podcast/rb-feed-podcast-properties-dialog.c:316
 #: ../podcast/rb-podcast-manager.c:1873
-#: ../podcast/rb-podcast-properties-dialog.c:487
-#: ../podcast/rb-podcast-properties-dialog.c:539
-#: ../remote/dbus/rb-client.c:140 ../rhythmdb/rhythmdb-tree.c:1284
-#: ../rhythmdb/rhythmdb-tree.c:1288 ../rhythmdb/rhythmdb-tree.c:1292
-#: ../rhythmdb/rhythmdb-tree.c:1296 ../rhythmdb/rhythmdb.c:1768
-#: ../shell/rb-shell-player.c:1711 ../shell/rb-shell.c:3106
-#: ../sources/rb-podcast-source.c:1668 ../widgets/rb-entry-view.c:1041
-#: ../widgets/rb-entry-view.c:1066 ../widgets/rb-entry-view.c:1469
-#: ../widgets/rb-entry-view.c:1481 ../widgets/rb-entry-view.c:1493
-#: ../widgets/rb-song-info.c:889 ../widgets/rb-song-info.c:1054
-#: ../widgets/rb-song-info.c:1374
+#: ../podcast/rb-podcast-properties-dialog.c:483
+#: ../podcast/rb-podcast-properties-dialog.c:535
+#: ../remote/dbus/rb-client.c:142 ../rhythmdb/rhythmdb-tree.c:1287
+#: ../rhythmdb/rhythmdb-tree.c:1291 ../rhythmdb/rhythmdb-tree.c:1295
+#: ../rhythmdb/rhythmdb-tree.c:1299 ../rhythmdb/rhythmdb.c:1817
+#: ../shell/rb-shell-player.c:1672 ../sources/rb-podcast-source.c:1657
+#: ../widgets/rb-entry-view.c:1044 ../widgets/rb-entry-view.c:1066
+#: ../widgets/rb-entry-view.c:1520 ../widgets/rb-entry-view.c:1532
+#: ../widgets/rb-entry-view.c:1544 ../widgets/rb-song-info.c:882
+#: ../widgets/rb-song-info.c:1048 ../widgets/rb-song-info.c:1372
 msgid "Unknown"
 msgstr "Desconhecido"
 
-#: ../lib/rb-file-helpers.c:217
+#: ../lib/rb-file-helpers.c:211
 #, c-format
 msgid "Unable to move %s to %s: %s"
 msgstr "Incapaz de mover %s para %s: %s"
 
-#: ../lib/rb-file-helpers.c:386
+#: ../lib/rb-file-helpers.c:380
 #, c-format
 msgid "Too many symlinks"
 msgstr "Demasiados symlinks"
 
-#: ../lib/rb-file-helpers.c:994
+#: ../lib/rb-file-helpers.c:988
 #, c-format
 msgid "Cannot get free space at %s: %s"
 msgstr "Incapaz de obter espaço livre em %s: %s"
 
-#: ../lib/rb-proxy-config.c:218
-msgid "HTTP proxy configuration error"
-msgstr "Erro de configuração de proxy HTTP"
-
-#: ../lib/rb-proxy-config.c:219
-msgid "Rhythmbox does not support automatic proxy configuration"
-msgstr "O Rhythmbox não suporta a configuração automática de proxy"
-
-#: ../lib/rb-util.c:578 ../remote/dbus/rb-client.c:142
+#: ../lib/rb-util.c:578 ../remote/dbus/rb-client.c:144
 #, c-format
 msgid "%d:%02d"
 msgstr "%d:%02d"
 
-#: ../lib/rb-util.c:580 ../remote/dbus/rb-client.c:144
+#: ../lib/rb-util.c:580 ../remote/dbus/rb-client.c:146
 #, c-format
 msgid "%d:%02d:%02d"
 msgstr "%d:%02d:%02d"
@@ -670,73 +688,56 @@ msgstr "%d:%02d de %d:%02d"
 msgid "%d:%02d:%02d of %d:%02d:%02d"
 msgstr "%d:%02d:%02d de %d:%02d:%02d"
 
-#: ../metadata/rb-metadata-dbus-client.c:324
+#: ../metadata/rb-metadata-dbus-client.c:381
 #, c-format
 msgid "Internal GStreamer problem; file a bug"
 msgstr "Problema interno do GStreamer; submeta um bug"
 
-#: ../metadata/rb-metadata-dbus-client.c:342
-#: ../metadata/rb-metadata-dbus-client.c:403
-#: ../metadata/rb-metadata-dbus-client.c:408
-#: ../metadata/rb-metadata-dbus-client.c:428
-#: ../metadata/rb-metadata-dbus-client.c:438
-#: ../metadata/rb-metadata-dbus-client.c:448
-#: ../metadata/rb-metadata-dbus-client.c:467
-#: ../metadata/rb-metadata-dbus-client.c:479
-#: ../metadata/rb-metadata-dbus-client.c:710
-#: ../metadata/rb-metadata-dbus-client.c:720
+#: ../metadata/rb-metadata-dbus-client.c:399
+#: ../metadata/rb-metadata-dbus-client.c:435
+#: ../metadata/rb-metadata-dbus-client.c:773
+#: ../metadata/rb-metadata-dbus-client.c:783
 #, c-format
 msgid "D-BUS communication error"
 msgstr "Erro de comunicação D-BUS"
 
-#: ../metadata/rb-metadata-gst.c:645
-#, c-format
-msgid "The GStreamer plugins to decode \"%s\" files cannot be found"
-msgstr ""
-"Os plugins do GStreamer para descodificar ficheiros \"%s\" não foram "
-"encontrados"
-
-#: ../metadata/rb-metadata-gst.c:648
+#: ../metadata/rb-metadata-gst.c:517 ../metadata/rb-metadata-gst.c:1063
+#: ../plugins/cd-recorder/rb-recorder-gst.c:507
 #, c-format
-msgid "The file contains a stream of type %s, which is not decodable"
-msgstr "O ficheiro contém um stream de tipo %s, que não é descodificável"
+msgid "Failed to create %s element; check your installation"
+msgstr "Falha ao criar o elemento %s; verifique a sua instalação"
 
-#: ../metadata/rb-metadata-gst.c:1040
+#: ../metadata/rb-metadata-gst.c:735
 #, c-format
 msgid "Failed to create a source element; check your installation"
 msgstr "Falha ao criar o elemento fonte; verifique a sua instalação"
 
-#: ../metadata/rb-metadata-gst.c:1103
+#: ../metadata/rb-metadata-gst.c:797
 #, c-format
 msgid "GStreamer error: failed to change state"
 msgstr "Erro do GStreamer: falha ao mudar estado"
 
-#: ../metadata/rb-metadata-gst.c:1199
-#, c-format
-msgid "Empty file"
-msgstr "Ficheiro vazio"
-
-#: ../metadata/rb-metadata-gst.c:1207
+#: ../metadata/rb-metadata-gst.c:848
 #, c-format
 msgid "The MIME type of the file could not be identified"
 msgstr "O tipo MIME do ficheiro não pôde ser identificado"
 
-#: ../metadata/rb-metadata-gst.c:1341
+#: ../metadata/rb-metadata-gst.c:991
 #, c-format
 msgid "Unsupported file type: %s"
 msgstr "Tipo de ficheiro não suportado: %s"
 
-#: ../metadata/rb-metadata-gst.c:1350
+#: ../metadata/rb-metadata-gst.c:1000
 #, c-format
 msgid "Unable to create tag-writing elements"
 msgstr "Incapaz de criar elementos de escrita de etiqueta"
 
-#: ../metadata/rb-metadata-gst.c:1365
+#: ../metadata/rb-metadata-gst.c:1015
 #, c-format
 msgid "Timeout while setting pipeline to NULL"
 msgstr "Tempo expirou ao definir a linha de processamento para NULL"
 
-#: ../metadata/rb-metadata-gst.c:1389
+#: ../metadata/rb-metadata-gst.c:1039
 #, c-format
 msgid "File corrupted during write"
 msgstr "Ficheiro corrumpido ao escrever"
@@ -749,11 +750,11 @@ msgstr "Imagem da capa"
 msgid "Fetch album covers from the Internet"
 msgstr "Obter capa de álbuns da Internet"
 
-#: ../plugins/artdisplay/artdisplay/__init__.py:288
+#: ../plugins/artdisplay/artdisplay/__init__.py:308
 msgid "Searching... drop artwork here"
 msgstr "A procurar... largue aqui a arte gráfica"
 
-#: ../plugins/artdisplay/artdisplay/__init__.py:290
+#: ../plugins/artdisplay/artdisplay/__init__.py:310
 msgid "Drop artwork here"
 msgstr "Larque a arte gráfica aqui"
 
@@ -765,11 +766,23 @@ msgstr "Leitor de CD de Audio"
 msgid "Support for playing of audio CDs as music source"
 msgstr "Suporte para reprodução de CDs de audio como fonte de música"
 
-#: ../plugins/audiocd/multiple-album.glade.h:1
+#: ../plugins/audiocd/album-info.ui.h:1
+msgid "A_lbum:"
+msgstr "Á_lbum:"
+
+#: ../plugins/audiocd/album-info.ui.h:2
+msgid "Artist s_ort order:"
+msgstr "Ordem de _ordenação de artistas:"
+
+#: ../plugins/audiocd/album-info.ui.h:4
+msgid "_Disc:"
+msgstr "_Disco:"
+
+#: ../plugins/audiocd/multiple-album.ui.h:1
 msgid "Multiple Albums Found"
 msgstr "Vário Álbuns Encontrados"
 
-#: ../plugins/audiocd/multiple-album.glade.h:2
+#: ../plugins/audiocd/multiple-album.ui.h:2
 msgid ""
 "This CD could be more than one album. Please select which album it is below "
 "and press <i>Continue</i>."
@@ -777,49 +790,74 @@ msgstr ""
 "Este CD pode ser mais do que um álbum. Por favor seleccione que álbum é em "
 "baixo e pressione <i>Continuar</i>."
 
-#: ../plugins/audiocd/multiple-album.glade.h:3
+#: ../plugins/audiocd/multiple-album.ui.h:3
 msgid "_Continue"
 msgstr "_Continuar"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:221
+#: ../plugins/audiocd/rb-audiocd-source.c:138
+msgid "Reload"
+msgstr "Recarregar"
+
+#: ../plugins/audiocd/rb-audiocd-source.c:139
+msgid "Reload Album Information"
+msgstr "Recarregar Informação do Álbum"
+
+#. Info bar for non-Musicbrainz data
+#: ../plugins/audiocd/rb-audiocd-source.c:309
+msgid "S_ubmit Album"
+msgstr "S_ubmeter Álbum"
+
+#: ../plugins/audiocd/rb-audiocd-source.c:310
+msgid "Hide"
+msgstr "Esconder"
+
+#: ../plugins/audiocd/rb-audiocd-source.c:312
+msgid "Could not find this album on MusicBrainz."
+msgstr "Este álbum não pôde ser encontrado no MusicBrainz."
+
+#: ../plugins/audiocd/rb-audiocd-source.c:313
+msgid "You can improve the MusicBrainz database by adding this album."
+msgstr "Pode melhorar a base de dados do MusicBrainz adicionando este álbum."
+
+#: ../plugins/audiocd/rb-audiocd-source.c:440
 msgid "<Invalid unicode>"
 msgstr "<Unicode inválido>"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:267
+#: ../plugins/audiocd/rb-audiocd-source.c:486
 #, c-format
 msgid "Track %u"
 msgstr "Faixa %u"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:327
-#: ../plugins/audiocd/rb-audiocd-source.c:335
-#: ../plugins/audiocd/rb-audiocd-source.c:668
+#: ../plugins/audiocd/rb-audiocd-source.c:546
+#: ../plugins/audiocd/rb-audiocd-source.c:554
+#: ../plugins/audiocd/rb-audiocd-source.c:942
 msgid "Couldn't load Audio CD"
 msgstr "Incapaz de carregar CD de Audio"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:328
+#: ../plugins/audiocd/rb-audiocd-source.c:547
 msgid "Rhythmbox couldn't access the CD."
 msgstr "O Rhythmbox é incapaz de aceder ao CD."
 
-#: ../plugins/audiocd/rb-audiocd-source.c:336
+#: ../plugins/audiocd/rb-audiocd-source.c:555
 msgid "Rhythmbox couldn't read the CD information."
 msgstr "O Rhythmbox é incapaz de ler a informação do CD."
 
-#: ../plugins/audiocd/rb-audiocd-source.c:438
-#: ../sources/rb-library-source.c:150 ../widgets/rb-entry-view.c:1425
+#: ../plugins/audiocd/rb-audiocd-source.c:653
+#: ../sources/rb-library-source.c:150 ../widgets/rb-entry-view.c:1476
 #: ../widgets/rb-query-creator-properties.c:75
 #: ../widgets/rb-query-creator-properties.c:105
 msgid "Title"
 msgstr "Título"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:445
-#: ../sources/rb-library-source.c:141 ../widgets/rb-entry-view.c:1435
+#: ../plugins/audiocd/rb-audiocd-source.c:660
+#: ../sources/rb-library-source.c:141 ../widgets/rb-entry-view.c:1486
 #: ../widgets/rb-library-browser.c:143
 #: ../widgets/rb-query-creator-properties.c:76
 #: ../widgets/rb-query-creator-properties.c:102
 msgid "Artist"
 msgstr "Artista"
 
-#: ../plugins/audiocd/rb-audiocd-source.c:669
+#: ../plugins/audiocd/rb-audiocd-source.c:943
 msgid "Rhythmbox could not get access to the CD device."
 msgstr "O Rhythmbox é incapaz de obter acesso ao dispositivo do CD."
 
@@ -833,23 +871,23 @@ msgstr "Incapaz de criar thread de procura de CD"
 msgid "Cannot access CD"
 msgstr "Incapaz de aceder ao CD"
 
-#: ../plugins/audiocd/sj-metadata-gvfs.c:106
+#: ../plugins/audiocd/sj-metadata-gvfs.c:105
 #: ../plugins/audiocd/sj-metadata-musicbrainz.c:344
 msgid "Unknown Title"
 msgstr "Título desconhecido"
 
-#: ../plugins/audiocd/sj-metadata-gvfs.c:110
-#: ../plugins/audiocd/sj-metadata-gvfs.c:133
+#: ../plugins/audiocd/sj-metadata-gvfs.c:109
+#: ../plugins/audiocd/sj-metadata-gvfs.c:132
 #: ../plugins/audiocd/sj-metadata-musicbrainz.c:328
 msgid "Unknown Artist"
 msgstr "Artista Desconhecido"
 
-#: ../plugins/audiocd/sj-metadata-gvfs.c:130
+#: ../plugins/audiocd/sj-metadata-gvfs.c:129
 #, c-format
 msgid "Track %d"
 msgstr "Faixa %d"
 
-#: ../plugins/audiocd/sj-metadata-gvfs.c:147
+#: ../plugins/audiocd/sj-metadata-gvfs.c:150
 #, c-format
 msgid "Cannot access CD: %s"
 msgstr "Incapaz de aceder ao CD: %s"
@@ -873,12 +911,12 @@ msgstr "Metadados incompletos para este CD"
 msgid "[Untitled]"
 msgstr "[Sem Título]"
 
-#: ../plugins/audiocd/sj-metadata.c:187
+#: ../plugins/audiocd/sj-metadata.c:190
 #, c-format
 msgid "Device '%s' does not contain any media"
 msgstr "Dispositivo '%s' não contém qualquer media"
 
-#: ../plugins/audiocd/sj-metadata.c:190
+#: ../plugins/audiocd/sj-metadata.c:193
 #, c-format
 msgid ""
 "Device '%s' could not be opened. Check the access permissions on the device."
@@ -886,336 +924,321 @@ msgstr ""
 "Dispositivo '%s' não pôde ser aberto. Verifique as permissões de acesso a "
 "este dispostivo."
 
-#: ../plugins/audiocd/sj-metadata.c:193 ../plugins/audiocd/sj-metadata.c:205
+#: ../plugins/audiocd/sj-metadata.c:196 ../plugins/audiocd/sj-metadata.c:208
 #, c-format
 msgid "Cannot read CD: %s"
 msgstr "Incapaz de ler CD: %s"
 
 #: ../plugins/audioscrobbler/audioscrobbler.rb-plugin.in.h:1
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:734
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:711
 msgid "Last.fm"
 msgstr "Last.fm"
 
 #: ../plugins/audioscrobbler/audioscrobbler.rb-plugin.in.h:2
-msgid "Submits song information to last.fm and plays last.fm radio streams"
+msgid "Submits song information to Last.fm and plays Last.fm radio streams"
 msgstr ""
-"Submete informação da música ao last.fm e reproduz transmissões de rádio do "
-"last.fm"
+"Submete informação da música ao Last.fm e reproduz transmissões de rádio do "
+"Last.fm"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:1
-msgid "0"
-msgstr "0"
-
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:2
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:1
 msgid "Account Login"
 msgstr "Utilizador da Conta"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:3
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:2
 msgid "Disabled"
 msgstr "Desactivado"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:4
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:3
 msgid "Join the Rhythmbox group"
 msgstr "Juntar-se ao grupo Rhythmbox"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:5
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:4
 msgid "Last submission time:"
 msgstr "Hora da última submissão:"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:6
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1083
-#: ../plugins/iradio/rb-station-properties-dialog.c:506
-#: ../rhythmdb/rhythmdb.c:3583 ../widgets/rb-entry-view.c:989
-#: ../widgets/rb-entry-view.c:1527 ../widgets/rb-entry-view.c:1540
-#: ../widgets/rb-song-info.c:1347
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:5
+#: ../plugins/audioscrobbler/rb-audioscrobbler.c:980
+#: ../plugins/iradio/rb-station-properties-dialog.c:502
+#: ../rhythmdb/rhythmdb.c:3706 ../widgets/rb-entry-view.c:992
+#: ../widgets/rb-entry-view.c:1579 ../widgets/rb-entry-view.c:1592
+#: ../widgets/rb-song-info.c:1345
 msgid "Never"
 msgstr "Nunca"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:7
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:6
 msgid "New to Last.fm?"
 msgstr "Novo no Last.fm?"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:8
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:7
 msgid "Queued tracks:"
 msgstr "Faixas colocadas em fila de espera:"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:9
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:8
 msgid "Sign up for an account"
 msgstr "Registar uma conta"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:10
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:9
 msgid "Statistics"
 msgstr "Estatísticas"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:11
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:10
 msgid "Status:"
 msgstr "Estado:"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:12
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:11
 msgid "Tracks submitted:"
 msgstr "Faixas Submetidas:"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:13
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:12
 msgid "_Password:"
 msgstr "_Senha:"
 
-#: ../plugins/audioscrobbler/audioscrobbler-prefs.glade.h:14
+#: ../plugins/audioscrobbler/audioscrobbler-prefs.ui.h:13
 msgid "_Username:"
 msgstr "_Utilizador"
 
-#: ../plugins/audioscrobbler/rb-audioscrobbler-plugin.c:216
+#: ../plugins/audioscrobbler/rb-audioscrobbler-plugin.c:211
 msgid "Last.fm Preferences"
 msgstr "Preferências do Last.fm"
 
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1106
+#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1003
 msgid "OK"
 msgstr "OK"
 
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1109
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1816
+#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1006
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1768
 msgid "Logging in"
 msgstr "A Iniciar Sessão"
 
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1112
+#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1009
 msgid "Request failed"
 msgstr "Pedido falhou"
 
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1115
-msgid "Incorrect username"
-msgstr "Nome de utilizador incorrecto"
-
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1118
-msgid "Incorrect password"
-msgstr "Senha incorrecta"
+#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1012
+msgid "Incorrect username or password"
+msgstr "Nome de utilizador ou senha incorrectos"
 
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1121
-msgid "Handshake failed"
-msgstr "Protocolo mal sucedido"
+#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1015
+msgid "Clock is not set correctly"
+msgstr "O relógio não está ajustado correctamente"
 
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1124
-msgid "Client update required"
-msgstr "Necessário actualizar cliente"
-
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1127
-msgid "Track submission failed"
-msgstr "Falha na submissão da faixa"
-
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1130
-msgid "Queue is too long"
-msgstr "A fila é demasiado longa"
+#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1018
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:880
+msgid "This version of Rhythmbox has been banned from Last.fm."
+msgstr "Esta versão do Rhythmbox foi banida do Last.fm."
 
-#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1133
+#: ../plugins/audioscrobbler/rb-audioscrobbler.c:1021
 msgid "Track submission failed too many times"
 msgstr "A submissão de faixa falhou vezes demais"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:194
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:192
 msgid "Similar Artists radio"
 msgstr "Rádio de Artistas Semelhantes"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:194
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1292
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:192
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1267
 #, c-format
 msgid "Artists similar to %s"
 msgstr "Artistas semelhantes a %s"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:195
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:193
 msgid "Tag radio"
 msgstr "Etiquetar rádio"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:195
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:193
 #, c-format
 msgid "Tracks tagged with %s"
 msgstr "Faixas etiquetadas com %s"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:196
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:194
 msgid "Artist Fan radio"
 msgstr "Rádio de Fãs de Artistas"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:196
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1294
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:194
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1269
 #, c-format
 msgid "Artists liked by fans of %s"
 msgstr "Artistas apreciados por fãs de %s"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:197
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:195
 msgid "Group radio"
 msgstr "Rádio de grupo"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:197
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:195
 #, c-format
 msgid "Tracks liked by the %s group"
 msgstr "Faixas apreciadas pelo grupo %s"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:198
-#| msgid "Neighbour Radio"
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:196
 msgid "Neighbour radio"
 msgstr "Rádio vizinha"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:198
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1302
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:196
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1277
 #, c-format
 msgid "%s's Neighbour Radio"
 msgstr "Rádios Vizinhas de %s"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:199
-#| msgid "Personal Radio"
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:197
 msgid "Personal radio"
 msgstr "Rádio pessoal"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:199
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1306
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:197
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1281
 #, c-format
 msgid "%s's Personal Radio"
 msgstr "Rádio Pessoal de %s"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:200
-#| msgid "%s's Loved Tracks"
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:198
 msgid "Loved tracks"
 msgstr "Faixas favoritas"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:200
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1308
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:198
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1283
 #, c-format
 msgid "%s's Loved Tracks"
 msgstr "Faixas Favoritas de %s"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:201
-#| msgid "Queued tracks:"
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:199
 msgid "Recommended tracks"
 msgstr "Faixas recomendadas"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:201
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:199
 #, c-format
-#| msgid "Tracks tagged with %s"
 msgid "Tracks recommended to %s"
 msgstr "Faixas recomendadas a %s"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:287
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:200
+msgid "Playlist"
+msgstr "Lista de Reprodução"
+
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:200
+#, c-format
+msgid "%s's playlist"
+msgstr "Lista de reprodução de %s"
+
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:284
 msgid "Love"
 msgstr "Música Favorita"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:288
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:285
 msgid "Mark this song as loved"
 msgstr "Marcar esta música como favorita"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:290
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:287
 msgid "Ban"
 msgstr "Banir"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:291
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:288
 msgid "Ban the current track from being played again"
 msgstr "Impedir a faixa actual de ser reproduzida novamente"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:293
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:290
 msgid "Delete Station"
 msgstr "Apagar Estação"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:294
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:291
 msgid "Delete the selected station"
 msgstr "Apagar a estação seleccionada"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:296
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:293
 msgid "Download song"
 msgstr "Transferir música"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:297
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:294
 msgid "Download this song"
 msgstr "Transferir esta música"
 
 #. awful
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:517
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:501
 msgid "Enter the item to build a Last.fm station out of:"
 msgstr "Indique o item de onde construir uma estação Last.fm:"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:520
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:504
 msgid "Add"
 msgstr "Adicionar"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:876
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:851
 msgid "Account Settings"
 msgstr "Definições da Conta"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:901
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:876
 msgid ""
 "Account details are needed before you can connect.  Check your settings."
 msgstr ""
 "Detalhes da conta são necessários antes de ligar.  Verifique as definições."
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:905
-msgid "This version of Rhythmbox has been banned from Last.fm."
-msgstr "Esta versão do Rhythmbox foi banida do Last.fm."
-
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:909
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:884
 msgid "Unable to connect"
 msgstr "Incapaz de ligar"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1283
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1258
 #, c-format
 msgid "Global Tag %s"
 msgstr "Etiqueta Global %s"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1304
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1279
 #, c-format
 msgid "%s's Recommended Radio: %s percent"
 msgstr "Rádios Recomendadas por %s: %s porcento"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1310
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1285
 #, c-format
 msgid "%s's Playlist"
 msgstr "Lista de Reprodução de %s"
 
 #. Translators: variables are 1: user name, 2: tag name; for user tag radio
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1316
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1291
 #, c-format
 msgid "%s's %s Radio"
 msgstr "Rádio do %s: %s"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1320
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1295
 #, c-format
 msgid "%s Group Radio"
 msgstr "Rádio do Grupo %s"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1786
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1738
 msgid "Neighbour Radio"
 msgstr "Rádio Vizinha"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1794
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1746
 msgid "Personal Radio"
 msgstr "Rádio Pessoal"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1884
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1836
 msgid "Server did not respond"
 msgstr "O servidor não respondeu"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1952
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1904
 msgid "There is not enough content available to play this station."
 msgstr "Não há conteúdo suficiente disponível para tocar esta estação."
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1957
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1909
 msgid "This station is available to subscribers only."
 msgstr "Esta estação está disponível apenas para assinantes."
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:1964
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1916
 msgid ""
 "The streaming system is offline for maintenance, please try again later."
 msgstr ""
 "O sistema de transmissão está desligado para manutenção, por favor tente "
 "mais tarde."
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:2003
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:1955
 msgid "Changing station"
 msgstr "A mudar de estação"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:2223
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:2233
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:2176
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:2186
 msgid "Retrieving playlist"
 msgstr "A obter lista de reprodução"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:2327
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:2280
 msgid "Banning song"
 msgstr "A banir música"
 
-#: ../plugins/audioscrobbler/rb-lastfm-source.c:2345
+#: ../plugins/audioscrobbler/rb-lastfm-source.c:2298
 msgid "Adding song to your Loved tracks"
 msgstr "A adicionar músicas às suas faixas favoritas"
 
@@ -1310,67 +1333,67 @@ msgstr "Incapaz de duplicar disco"
 msgid "Reason"
 msgstr "Razão"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:420
+#: ../plugins/cd-recorder/rb-recorder-gst.c:419
 #, c-format
 msgid "Failed to create pipeline"
 msgstr "Falha ao criar linha de processamento"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:526
-#: ../plugins/cd-recorder/rb-recorder-gst.c:532
+#: ../plugins/cd-recorder/rb-recorder-gst.c:525
+#: ../plugins/cd-recorder/rb-recorder-gst.c:531
 #, c-format
 msgid "Unable to unlink '%s'"
 msgstr "Falha ao desligar '%s'"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:587
+#: ../plugins/cd-recorder/rb-recorder-gst.c:586
 msgid "Could not retrieve state from processing pipeline"
 msgstr "Incapaz de recuperar o estado a partir da linha de processamento"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:602
+#: ../plugins/cd-recorder/rb-recorder-gst.c:601
 msgid "Could not get current track position"
 msgstr "Incapaz de obter a posição da faixa actual"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:650
+#: ../plugins/cd-recorder/rb-recorder-gst.c:649
 #, c-format
 msgid "Could not start pipeline playing"
 msgstr "Incapaz de iniciar canalização de reprodução"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:661
+#: ../plugins/cd-recorder/rb-recorder-gst.c:660
 #, c-format
 msgid "Could not pause playback"
 msgstr "Incapaz de pausar a reprodução"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:842
+#: ../plugins/cd-recorder/rb-recorder-gst.c:841
 #, c-format
 msgid "Cannot find drive"
 msgstr "Incapaz de encontrar o dispositivo"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:882
+#: ../plugins/cd-recorder/rb-recorder-gst.c:881
 #, c-format
 msgid "Cannot find drive %s"
 msgstr "Incapaz de encontrar o dispositivo %s"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:891
+#: ../plugins/cd-recorder/rb-recorder-gst.c:890
 #, c-format
 msgid "Drive %s is not a recorder"
 msgstr "Dispositivo %s não é um gravador"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:1019
-#: ../plugins/cd-recorder/rb-recorder-gst.c:1204
+#: ../plugins/cd-recorder/rb-recorder-gst.c:1018
+#: ../plugins/cd-recorder/rb-recorder-gst.c:1203
 #, c-format
-msgid "No writable drives found."
-msgstr "Nenhum dispostivo de gravação encontrado."
+msgid "No writable drives found"
+msgstr "Nenhum dispositivo de gravação encontrado"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:1154
+#: ../plugins/cd-recorder/rb-recorder-gst.c:1153
 #, c-format
 msgid "Could not get track time for file: %s"
 msgstr "Não foi possível obter a duração da faixa para o ficheiro: %s"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:1213
+#: ../plugins/cd-recorder/rb-recorder-gst.c:1212
 #, c-format
-msgid "Could not determine audio track durations."
-msgstr "Incapaz de determinar a duração das faixas de áudio."
+msgid "Could not determine audio track durations"
+msgstr "Incapaz de determinar a duração das faixas de áudio"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:1255
+#: ../plugins/cd-recorder/rb-recorder-gst.c:1254
 #, c-format
 msgid ""
 "There was an error writing to the CD:\n"
@@ -1379,34 +1402,34 @@ msgstr ""
 "Ocorreu um erro ao escrever no CD:\n"
 "%s"
 
-#: ../plugins/cd-recorder/rb-recorder-gst.c:1259
+#: ../plugins/cd-recorder/rb-recorder-gst.c:1258
 msgid "There was an error writing to the CD"
 msgstr "Ocorreu um erro ao gravar no CD"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:304
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:279
 msgid "Maximum possible"
 msgstr "Máximo possível"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:371
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:346
 #, c-format
 msgid "Invalid writer device: %s"
 msgstr "Dispositivo de gravação inválido: %s"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:472
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:447
 #, c-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d hora"
 msgstr[1] "%d horas"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:474
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:449
 #, c-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d minuto"
 msgstr[1] "%d minutos"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:477
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:452
 #, c-format
 msgid "%d second"
 msgid_plural "%d seconds"
@@ -1414,42 +1437,42 @@ msgstr[0] "%d segundo"
 msgstr[1] "%d segundos"
 
 #. hour:minutes:seconds
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:482
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:457
 #, c-format
 msgid "%s %s %s"
 msgstr "%s %s %s"
 
 #. minutes:seconds
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:485
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:460
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
 #. seconds
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:488
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:463
 #, c-format
 msgid "%s"
 msgstr "%s"
 
 #. 0 seconds
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:491
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:466
 msgid "0 seconds"
 msgstr "0 segundos"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:510
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:485
 #, c-format
 msgid "About %s left"
 msgstr "Cerca de %s restantes"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:538
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:513
 msgid "Writing audio to CD"
 msgstr "Escrevendo áudio no CD"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:554
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:529
 msgid "Finished creating audio CD."
 msgstr "Criação do CD de áudio concluída."
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:578
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:547
 msgid ""
 "Finished creating audio CD.\n"
 "Create another copy?"
@@ -1457,212 +1480,212 @@ msgstr ""
 "Criação do CD de áudio concluída.\n"
 "Deseja criar outra cópia?"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:580
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:549
 msgid "Writing failed.  Try again?"
 msgstr "A gravação falhou. Deseja tentar novamente?"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:582
-msgid "Writing cancelled.  Try again?"
-msgstr "Gravação cancelada. Deseja tentar novamente?"
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:551
+msgid "Writing canceled.  Try again?"
+msgstr "Gravação cancelada.  Deseja tentar novamente?"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:650
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:619
 msgid "Audio recording error"
 msgstr "Erro na gravação de áudio"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:679
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:648
 msgid "Audio Conversion Error"
 msgstr "Erro de Conversão de Áudio"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:709
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:678
 msgid "Recording error"
 msgstr "Erro de gravação"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:829
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:798
 msgid "Do you wish to interrupt writing this disc?"
 msgstr "Deseja interromper a gravação deste disco?"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:832
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:801
 msgid "This may result in an unusable disc."
 msgstr "Isto pode inutilizar o disco."
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:839
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:808
 msgid "_Cancel"
 msgstr "_Cancelar"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:840
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:809
 msgid "_Interrupt"
 msgstr "_Interromper"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:862
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:831
 msgid "Could not create audio CD"
 msgstr "Incapaz de criar CD de áudio"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:884
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:853
 msgid "Please make sure another application is not using the drive."
 msgstr ""
 "Por favor, certifique-se de que não há outra aplicação a utilizar o "
 "dispositivo."
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:885
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:854
 msgid "Drive is busy"
 msgstr "O dispositivo está ocupado"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:887
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:856
 msgid "Please put a rewritable or blank CD in the drive."
 msgstr "Por favor, insira um CD regravável ou virgem na drive."
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:888
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:857
 msgid "Insert a rewritable or blank CD"
 msgstr "Insira um CD regravável ou virgem"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:890
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:859
 msgid "Please put a blank CD in the drive."
 msgstr "Por favor, insira um CD virgem na drive."
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:891
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:860
 msgid "Insert a blank CD"
 msgstr "Inserir um CD virgem"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:893
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:862
 msgid "Please replace the disc in the drive with a rewritable or blank CD."
 msgstr "Por favor, substitua o disco na drive por um CD regravável ou virgem."
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:894
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:863
 msgid "Reload a rewritable or blank CD"
 msgstr "Recarregar um CD regravável ou virgem"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:896
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:865
 msgid "Please replace the disc in the drive with a blank CD."
 msgstr "Por favor, substitua o disco na drive por um CD virgem."
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:897
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:866
 msgid "Reload a blank CD"
 msgstr "Recarregar um CD virgem"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:948
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:917
 msgid "Converting audio tracks"
 msgstr "A converter faixas de áudio"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:951
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:920
 msgid "Preparing to write CD"
 msgstr "A preparar para gravar CD"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:954
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:923
 msgid "Writing CD"
 msgstr "A gravar CD"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:957
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:926
 msgid "Finishing write"
 msgstr "A acabar a gravação"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:960
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:929
 msgid "Erasing CD"
 msgstr "A apagar CD"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:963
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:932
 msgid "Unhandled action in burn_action_changed_cb"
 msgstr "Acção não tratada em burn_action_changed_cb"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:987
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:956
 #, c-format
 msgid "This %s appears to have information already recorded on it."
 msgstr "Este %s parece já ter informação gravada nele."
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:994
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:963
 msgid "Erase information on this disc?"
 msgstr "Apagar informação deste disco?"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1003
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:972
 msgid "_Try Another"
 msgstr "_Tentar Outro"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1010
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:979
 msgid "_Erase Disc"
 msgstr "_Apagar Disco"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1169
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1144
 msgid "C_reate"
 msgstr "C_riar"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1236
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1221
 #, c-format
 msgid "Failed to create the recorder: %s"
 msgstr "Falha ao criar o gravador: %s"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1360
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1345
 #, c-format
 msgid "Could not remove temporary directory '%s': %s"
 msgstr "Incapaz de remover o diretório temporário '%s': %s"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1380
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1365
 msgid "Create Audio CD"
 msgstr "Criar CD de Áudio"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1398
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1383
 #, c-format
 msgid "Create audio CD from '%s'?"
 msgstr "Criar CD de áudio a partir de '%s'?"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1444
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1462
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1429
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1447
 #, c-format
 msgid "Unable to build an audio track list."
 msgstr "Incapaz de construir uma lista de faixas de áudio."
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1472
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1457
 #, c-format
 msgid "This playlist is too long to write to an audio CD."
 msgstr "Esta lista de reprodução é demasido longa para num CD de áudio."
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1608
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1593
 #, c-format
 msgid ""
 "This playlist is %s minutes long.  This exceeds the length of a standard "
-"audio CD.  If the destination media is larger than a standard audio CD "
+"audio CD.  If the destination medium is larger than a standard audio CD "
 "please insert it in the drive and try again."
 msgstr ""
-"Esta lista de reprodução tem %s minutos de duração. Isso excede o tamanho de "
-"um CD de áudio padrão. Se a media de destino for maior do que um CD de áudio "
-"padrão, por favor insira-a na drive e tente novamente."
+"Esta lista de reprodução tem %s minutos de duração.  Isso excede o tamanho "
+"de um CD de áudio padrão. Se o suporte de destino for maior do que um CD de "
+"áudio padrão, por favor insira-a na drive e tente novamente."
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1619
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1604
 msgid "Playlist too long"
 msgstr "Lista de reprodução demasiado longa"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1659
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1644
 msgid "Could not find temporary space!"
 msgstr "Incapaz de encontrar espaço temporário!"
 
-#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1660
+#: ../plugins/cd-recorder/rb-playlist-source-recorder.c:1645
 #, c-format
 msgid ""
-"Could not find enough temporary space to convert audio tracks.  %s MiB "
+"Could not find enough temporary space to convert audio tracks.  %s MB "
 "required."
 msgstr ""
 "Incapaz de encontrar espaço temporário suficiente para converter as faixas "
-"de áudio. É necessário %s MiB."
+"de áudio.  São necessários %s MiB."
 
-#: ../plugins/cd-recorder/recorder.glade.h:1
+#: ../plugins/cd-recorder/recorder.ui.h:1
 msgid "Create audio CD from playlist?"
 msgstr "Criar um CD de áudio a partir da lista de reprodução"
 
-#: ../plugins/cd-recorder/recorder.glade.h:2
+#: ../plugins/cd-recorder/recorder.ui.h:2
 msgid "Options"
 msgstr "Opções"
 
-#: ../plugins/cd-recorder/recorder.glade.h:3
+#: ../plugins/cd-recorder/recorder.ui.h:3
 msgid "Progress"
 msgstr "Progresso"
 
-#: ../plugins/cd-recorder/recorder.glade.h:4
+#: ../plugins/cd-recorder/recorder.ui.h:4
 msgid "Write _speed:"
 msgstr "_Velocidade de gravação:"
 
-#: ../plugins/cd-recorder/recorder.glade.h:5
+#: ../plugins/cd-recorder/recorder.ui.h:5
 msgid "Write disc _to:"
 msgstr "Gravar disco _em:"
 
-#: ../plugins/cd-recorder/recorder.glade.h:6
+#: ../plugins/cd-recorder/recorder.ui.h:6
 msgid "_Make multiple copies"
 msgstr "Fazer cópias _múltiplas"
 
@@ -1687,19 +1710,19 @@ msgstr "Partilha de Músicas DAAP"
 msgid "Share music and play shared music on your local network"
 msgstr "Partilhe e reproduza música na sua rede local"
 
-#: ../plugins/daap/daap-prefs.glade.h:1
+#: ../plugins/daap/daap-prefs.ui.h:1
 msgid "<b>Sharing</b>"
 msgstr "<b>Partilha</b>"
 
-#: ../plugins/daap/daap-prefs.glade.h:2
+#: ../plugins/daap/daap-prefs.ui.h:2
 msgid "Require _password:"
 msgstr "Requer _senha:"
 
-#: ../plugins/daap/daap-prefs.glade.h:3 ../plugins/daap/rb-daap-dialog.c:82
+#: ../plugins/daap/daap-prefs.ui.h:3 ../plugins/daap/rb-daap-dialog.c:82
 msgid "Shared music _name:"
 msgstr "_Nome da partilha de música:"
 
-#: ../plugins/daap/daap-prefs.glade.h:4
+#: ../plugins/daap/daap-prefs.ui.h:4
 msgid "_Share my music"
 msgstr "_Partilha de música"
 
@@ -1719,8 +1742,8 @@ msgstr ""
 
 #: ../plugins/daap/rb-daap-mdns-browser-avahi.c:237
 #: ../plugins/daap/rb-daap-mdns-browser-avahi.c:280
-msgid "MDNS service is not running"
-msgstr "O serviço MDNS não está a correr"
+msgid "mDNS service is not running"
+msgstr "O serviço mDNS não está a correr"
 
 #: ../plugins/daap/rb-daap-mdns-browser-avahi.c:245
 msgid "Browser already active"
@@ -1748,12 +1771,12 @@ msgstr "Incapaz de atualizar o serviço"
 
 #: ../plugins/daap/rb-daap-mdns-publisher-avahi.c:281
 #: ../plugins/daap/rb-daap-mdns-publisher-avahi.c:301
-msgid "The avahi MDNS service is not running"
-msgstr "O serviço MDNS avahi não está a correr"
+msgid "The avahi mDNS service is not running"
+msgstr "O serviço mDNS avahi não está a correr"
 
 #: ../plugins/daap/rb-daap-mdns-publisher-avahi.c:310
-msgid "The MDNS service is not published"
-msgstr "O serviço MDNS avahi não está publicado"
+msgid "The mDNS service is not published"
+msgstr "O serviço mDNS não está publicado"
 
 #: ../plugins/daap/rb-daap-plugin.c:125
 msgid "_Disconnect"
@@ -1771,24 +1794,15 @@ msgstr "Ligar a uma partilha _DAAP..."
 msgid "Connect to a new DAAP share"
 msgstr "Ligar a uma nova partilha DAAP"
 
-#: ../plugins/daap/rb-daap-plugin.c:647 ../plugins/daap/rb-daap-source.c:525
-msgid "Could not connect to shared music"
-msgstr "Incapaz de se ligar à partilha de música"
-
-#: ../plugins/daap/rb-daap-plugin.c:648
-#, c-format
-msgid "Unable to resolve hostname %s"
-msgstr "Incapaz de resolver nome do servidor %s"
-
-#: ../plugins/daap/rb-daap-plugin.c:699
+#: ../plugins/daap/rb-daap-plugin.c:660
 msgid "New DAAP share"
 msgstr "Nova partilha DAAP"
 
-#: ../plugins/daap/rb-daap-plugin.c:699
+#: ../plugins/daap/rb-daap-plugin.c:660
 msgid "Host:port of DAAP share:"
 msgstr "Máquina:porta da partilha DAAP:"
 
-#: ../plugins/daap/rb-daap-plugin.c:924
+#: ../plugins/daap/rb-daap-plugin.c:882
 msgid "DAAP Music Sharing Preferences"
 msgstr "Preferências d Partilha de Música DAAP"
 
@@ -1797,36 +1811,32 @@ msgstr "Preferências d Partilha de Música DAAP"
 msgid "%s's Music"
 msgstr "Música de %s"
 
-#: ../plugins/daap/rb-daap-source.c:357
+#: ../plugins/daap/rb-daap-source.c:360 ../plugins/daap/rb-daap-source.c:414
 #, c-format
 msgid "The music share '%s' requires a password to connect"
 msgstr "A partilha de música '%s' requer uma senha para conectar"
 
-#: ../plugins/daap/rb-daap-source.c:359
+#: ../plugins/daap/rb-daap-source.c:416
 msgid "Password Required"
 msgstr "Senha Necessária"
 
-#: ../plugins/daap/rb-daap-source.c:431
+#: ../plugins/daap/rb-daap-source.c:528
 msgid "Connecting to music share"
 msgstr "A ligar à partilha de música"
 
-#: ../plugins/daap/rb-daap-source.c:438
+#: ../plugins/daap/rb-daap-source.c:535
 msgid "Retrieving songs from music share"
 msgstr "A obter músicas da partilha de música"
 
-#: ../plugins/daap/rb-daap-src.c:480
+#: ../plugins/daap/rb-daap-source.c:622
+msgid "Could not connect to shared music"
+msgstr "Incapaz de se ligar à partilha de música"
+
+#: ../plugins/daap/rb-daap-src.c:495
 #, c-format
 msgid "Connection to %s:%d refused."
 msgstr "Ligação a %s:%d recusada."
 
-#: ../plugins/dontreallyclose/dontreallyclose.rb-plugin.in.h:1
-msgid "Minimize to the tray when closing the main window"
-msgstr "Minimizar para a bandeja ao fechar a janela principal"
-
-#: ../plugins/dontreallyclose/dontreallyclose.rb-plugin.in.h:2
-msgid "Minimize to tray"
-msgstr "Minimizar para a bandeja"
-
 #: ../plugins/fmradio/fmradio.rb-plugin.in.h:1
 #: ../plugins/fmradio/rb-fm-radio-source.c:203
 msgid "FM Radio"
@@ -1861,28 +1871,73 @@ msgid "Support for generic audio player devices (plus PSP and Nokia 770)"
 msgstr ""
 "Suporte para dispositivos de áudio genéricos (incluindo PSP e Nokia 770)"
 
-#: ../plugins/generic-player/rb-generic-player-plugin.c:98
+#: ../plugins/generic-player/rb-generic-player-plugin.c:96
 #: ../shell/rb-playlist-manager.c:1150 ../shell/rb-playlist-manager.c:1193
 msgid "New Playlist"
 msgstr "Nova Lista de Reprodução"
 
-#: ../plugins/generic-player/rb-generic-player-plugin.c:99
+#: ../plugins/generic-player/rb-generic-player-plugin.c:97
 msgid "Create a new playlist on this device"
 msgstr "Criar uma nova lista de reprodução neste dispositivo"
 
-#: ../plugins/generic-player/rb-generic-player-plugin.c:101
+#: ../plugins/generic-player/rb-generic-player-plugin.c:99
 msgid "Delete Playlist"
 msgstr "Apagar Lista de Reprodução"
 
-#: ../plugins/generic-player/rb-generic-player-plugin.c:102
+#: ../plugins/generic-player/rb-generic-player-plugin.c:100
 msgid "Delete this playlist"
 msgstr "Apagar esta Lista de Reprodução"
 
-#: ../plugins/generic-player/rb-generic-player-source.c:964
+#: ../plugins/generic-player/rb-generic-player-source.c:627
 #, c-format
 msgid "Importing (%d/%d)"
 msgstr "A importar (%d/%d)"
 
+#: ../plugins/im-status/im-status.rb-plugin.in.h:1
+msgid "IM Status"
+msgstr "Estado MI"
+
+#: ../plugins/im-status/im-status.rb-plugin.in.h:2
+msgid ""
+"Updates IM status according to the current song (works with Empathy & Gossip)"
+msgstr ""
+"Actualiza o estado de MI de acordo com a música actual (funciona com Empathy "
+"& Gossip)"
+
+#. Translators: do not translate %(artist)s or %(title)s, they are
+#. string substitution markers (like %s) for the artist and title of
+#. the current playing song.  They can be reordered if necessary.
+#: ../plugins/im-status/im-status/__init__.py:153
+#, python-format
+msgid "♫ %(artist)s - %(title)s ♫"
+msgstr "♫ %(artist)s - %(title)s ♫"
+
+#. Translators: do not translate %(artist)s or %(album)s, they are
+#. string substitution markers (like %s) for the artist and album name
+#. of the current playing song.  They can be reordered if necessary.
+#: ../plugins/im-status/im-status/__init__.py:158
+#, python-format
+msgid "♫ %(artist)s - %(album)s ♫"
+msgstr "♫ %(artist)s - %(album)s ♫"
+
+#. Translators: do not translate %(album)s, it is a string substitution
+#. marker (like %s) for the album name of the current playing song.
+#: ../plugins/im-status/im-status/__init__.py:162
+#, python-format
+msgid "♫ %(album)s ♫"
+msgstr "♫ %(album)s ♫"
+
+#. Translators: do not translate %(title)s, it is a string substitution
+#. marker (like %s) for the title of the current playing song.
+#: ../plugins/im-status/im-status/__init__.py:166
+#, python-format
+msgid "♫ %(title)s ♫"
+msgstr "♫ %(title)s ♫"
+
+#: ../plugins/im-status/im-status/__init__.py:168
+msgid "♫ Listening to music... ♫"
+msgstr "♫ A ouvir música... ♫"
+
 #: ../plugins/ipod/ipod.rb-plugin.in.h:1
 msgid "Portable Players - iPod"
 msgstr "Reprodutores de música portáteis - iPod"
@@ -1893,163 +1948,160 @@ msgstr ""
 "Suporte para dispositivos iPod da Apple (mostra o conteúdo, e reproduz a "
 "partir do dispositivo)"
 
-#: ../plugins/ipod/ipod-info.glade.h:1
+#: ../plugins/ipod/ipod-info.ui.h:1
 msgid "<b>Content</b>"
 msgstr "<b>Conteúdo</b>"
 
-#: ../plugins/ipod/ipod-info.glade.h:2
+#: ../plugins/ipod/ipod-info.ui.h:2
 msgid "<b>Information</b>"
 msgstr "<b>Informação</b>"
 
-#: ../plugins/ipod/ipod-info.glade.h:3
+#: ../plugins/ipod/ipod-info.ui.h:3
 msgid "<b>System</b>"
 msgstr "<b>Sistema</b>"
 
-#: ../plugins/ipod/ipod-info.glade.h:4
+#: ../plugins/ipod/ipod-info.ui.h:4
 msgid "Advanced"
 msgstr "Avançado"
 
-#: ../plugins/ipod/ipod-info.glade.h:6
+#: ../plugins/ipod/ipod-info.ui.h:6
 msgid "Database Version:"
 msgstr "Versão da Base de Dados:"
 
-#: ../plugins/ipod/ipod-info.glade.h:7
+#: ../plugins/ipod/ipod-info.ui.h:7
 msgid "Device Node:"
 msgstr "Nó do Dispositivo:"
 
-#: ../plugins/ipod/ipod-info.glade.h:8
+#: ../plugins/ipod/ipod-info.ui.h:8
 msgid "Firmware Version:"
 msgstr "Versão do Firmware:"
 
-#: ../plugins/ipod/ipod-info.glade.h:9
+#: ../plugins/ipod/ipod-info.ui.h:9
 msgid "Model:"
 msgstr "Modelo:"
 
-#: ../plugins/ipod/ipod-info.glade.h:10
+#: ../plugins/ipod/ipod-info.ui.h:10
 msgid "Mount Point:"
 msgstr "Ponto de Montagem:"
 
-#: ../plugins/ipod/ipod-info.glade.h:11
+#: ../plugins/ipod/ipod-info.ui.h:11
 msgid "Number of Playlists:"
 msgstr "Número de Listas de Reprodução:"
 
-#: ../plugins/ipod/ipod-info.glade.h:12
+#: ../plugins/ipod/ipod-info.ui.h:12
 msgid "Number of Tracks:"
 msgstr "Número de Faixas:"
 
-#: ../plugins/ipod/ipod-info.glade.h:13
+#: ../plugins/ipod/ipod-info.ui.h:13
 msgid "Serial Number:"
 msgstr "Número de Série:"
 
-#: ../plugins/ipod/ipod-info.glade.h:14
+#. amount of disk space used on the iPod
+#: ../plugins/ipod/ipod-info.ui.h:15
 msgid "Volume Usage:"
 msgstr "Utilização do Volume:"
 
-#: ../plugins/ipod/ipod-info.glade.h:15
-msgid "Your Name:"
-msgstr "O seu Nome:"
-
-#: ../plugins/ipod/ipod-info.glade.h:16
+#: ../plugins/ipod/ipod-info.ui.h:16
 msgid "iPod Name:"
 msgstr "Nome do iPod:"
 
-#: ../plugins/ipod/ipod-info.glade.h:17
+#: ../plugins/ipod/ipod-info.ui.h:17
 msgid "iPod Properties"
 msgstr "Propriedades do iPod"
 
-#: ../plugins/ipod/ipod-init.glade.h:1
+#: ../plugins/ipod/ipod-init.ui.h:1
 msgid ""
 "<span size=\"x-large\" weight=\"bold\">Do you want to initialize your iPod?</"
 "span>"
 msgstr ""
 "<span size=\"x-large\" weight=\"bold\">Deseja inicializar o seu iPod?</span>"
 
-#: ../plugins/ipod/ipod-init.glade.h:2
+#: ../plugins/ipod/ipod-init.ui.h:2
 msgid ""
-"Rhythmbox has detected a device that is probably an uninitialised or "
-"corrupted iPod. It must be initialised before Rhythmbox can use it, but this "
+"Rhythmbox has detected a device that is probably an uninitialized or "
+"corrupted iPod. It must be initialized before Rhythmbox can use it, but this "
 "will destroy any song metadata already present. If you wish Rhythmbox to "
-"initialise the iPod, please fill in the information below. If the device is "
-"not an iPod, or you do not wish to initialise it, please click cancel."
+"initialize the iPod, please fill in the information below. If the device is "
+"not an iPod, or you do not wish to initialize it, please click cancel."
 msgstr ""
 "O Rhythmbox detectou um dispositivo que será provavelmente um iPod não "
-"inicializado ou corrumpido. Deve ser inicializado para o Rhythmbox utilizá-"
-"lo, mas isso destruirá quaisquer metadados de música presentes. Se deseja "
+"inicializado ou corrompido. Deve ser inicializado para o Rhythmbox utilizá-"
+"lo, mas isso destruirá quaisquer meta-dados de música presentes. Se deseja "
 "que o Rhythmbox inicialize o iPod, por favor preencha a informação a seguir. "
 "Se o dispositivo não é um iPod, ou não deseja inicializá-lo, clique em "
 "cancelar."
 
-#: ../plugins/ipod/ipod-init.glade.h:3
-msgid "_Initialise"
+#: ../plugins/ipod/ipod-init.ui.h:3
+msgid "_Initialize"
 msgstr "_Inicializar"
 
-#: ../plugins/ipod/ipod-init.glade.h:4
+#: ../plugins/ipod/ipod-init.ui.h:4
 msgid "_Model:"
 msgstr "_Modelo:"
 
-#: ../plugins/ipod/ipod-init.glade.h:5
-#: ../plugins/magnatune/magnatune-prefs.glade.h:45
+#: ../plugins/ipod/ipod-init.ui.h:5
+#: ../plugins/magnatune/magnatune-prefs.ui.h:45
 msgid "_Name:"
 msgstr "_Nome:"
 
-#: ../plugins/ipod/ipod-init.glade.h:6
+#: ../plugins/ipod/ipod-init.ui.h:6
 msgid "iPod detected"
 msgstr "iPod detectado"
 
-#: ../plugins/ipod/rb-ipod-helpers.c:297
-msgid "Unable to initialise new iPod"
+#: ../plugins/ipod/rb-ipod-helpers.c:304
+msgid "Unable to initialize new iPod"
 msgstr "Incapaz de inicializar novo iPod"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:104 ../plugins/ipod/rb-ipod-plugin.c:113
-#: ../plugins/mtpdevice/rb-mtp-plugin.c:106 ../shell/rb-playlist-manager.c:184
+#: ../plugins/ipod/rb-ipod-plugin.c:107 ../plugins/ipod/rb-ipod-plugin.c:116
+#: ../plugins/mtpdevice/rb-mtp-plugin.c:123 ../shell/rb-playlist-manager.c:184
 msgid "_Rename"
 msgstr "_Renomear"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:105
+#: ../plugins/ipod/rb-ipod-plugin.c:108
 msgid "Rename iPod"
 msgstr "Renomear iPod"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:107 ../shell/rb-shell-clipboard.c:188
-#: ../sources/rb-podcast-source.c:323
+#: ../plugins/ipod/rb-ipod-plugin.c:110 ../shell/rb-shell-clipboard.c:188
+#: ../sources/rb-podcast-source.c:317
 msgid "_Properties"
 msgstr "_Propriedades"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:108
+#: ../plugins/ipod/rb-ipod-plugin.c:111
 msgid "Display iPod properties"
 msgstr "Apresentar propriedades do iPod"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:110 ../shell/rb-shell-clipboard.c:175
+#: ../plugins/ipod/rb-ipod-plugin.c:113 ../shell/rb-shell-clipboard.c:175
 msgid "_New Playlist"
 msgstr "_Nova Lista de Reprodução"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:111
+#: ../plugins/ipod/rb-ipod-plugin.c:114
 msgid "Add new playlist to iPod"
 msgstr "Adicionar nova lista de reprodução ao iPod"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:114 ../shell/rb-playlist-manager.c:185
+#: ../plugins/ipod/rb-ipod-plugin.c:117 ../shell/rb-playlist-manager.c:185
 msgid "Rename playlist"
 msgstr "Renomear a lista de reprodução"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:116 ../shell/rb-playlist-manager.c:187
+#: ../plugins/ipod/rb-ipod-plugin.c:119 ../shell/rb-playlist-manager.c:187
 msgid "_Delete"
 msgstr "_Apagar"
 
-#: ../plugins/ipod/rb-ipod-plugin.c:117 ../shell/rb-playlist-manager.c:188
+#: ../plugins/ipod/rb-ipod-plugin.c:120 ../shell/rb-playlist-manager.c:188
 msgid "Delete playlist"
 msgstr "Apagar a lista de reprodução"
 
-#: ../plugins/ipod/rb-ipod-source.c:1196 ../sources/rb-podcast-source.c:854
+#: ../plugins/ipod/rb-ipod-source.c:1212 ../sources/rb-podcast-source.c:843
 msgid "Podcasts"
 msgstr "Podcasts"
 
-#: ../plugins/ipod/rb-ipod-source.c:1542
+#: ../plugins/ipod/rb-ipod-source.c:1583
 msgid "New playlist"
 msgstr "Nova lista de reprodução"
 
 #. Translators: this is used to display the amount of storage space
 #. * used and the total storage space on an iPod.
 #.
-#: ../plugins/ipod/rb-ipod-source.c:1652
+#: ../plugins/ipod/rb-ipod-source.c:1693
 #, c-format
 msgid "%s of %s"
 msgstr "%s em %s"
@@ -2062,36 +2114,36 @@ msgstr "Rádio na Internet"
 msgid "Support for broadcasting services transmitted via the Internet"
 msgstr "Suporte para serviços de difusão via Internet"
 
-#: ../plugins/jamendo/jamendo-prefs.glade.h:1
+#: ../plugins/jamendo/jamendo-prefs.ui.h:1
 msgid "<b>Download</b>"
 msgstr "<b>Transferências</b>"
 
-#: ../plugins/jamendo/jamendo-prefs.glade.h:2
+#: ../plugins/jamendo/jamendo-prefs.ui.h:2
 msgid "Jamendo Preferences"
 msgstr "Preferências do Jamendo"
 
-#: ../plugins/jamendo/jamendo-prefs.glade.h:3
-msgid ""
-"Ogg Vorbis (300Kbps)\n"
-"MP3 (200Kbps)"
-msgstr ""
-"Ogg Vorbis (300Kbps)\n"
-"MP3 (200Kbps)"
+#: ../plugins/jamendo/jamendo-prefs.ui.h:3
+msgid "MP3 (200Kbps)"
+msgstr "MP3 (200Kbps)"
+
+#: ../plugins/jamendo/jamendo-prefs.ui.h:4
+msgid "Ogg Vorbis (300Kbps)"
+msgstr "Ogg Vorbis (300Kbps)"
 
-#: ../plugins/jamendo/jamendo-prefs.glade.h:5
+#: ../plugins/jamendo/jamendo-prefs.ui.h:5
 msgid "Visit Jamendo at "
 msgstr "Visite o Jamendo em "
 
-#: ../plugins/jamendo/jamendo-prefs.glade.h:6
+#: ../plugins/jamendo/jamendo-prefs.ui.h:6
 msgid "_Format:"
 msgstr "_Formato:"
 
-#: ../plugins/jamendo/jamendo-prefs.glade.h:7
+#: ../plugins/jamendo/jamendo-prefs.ui.h:7
 msgid "http://www.jamendo.com/"
 msgstr "http://www.jamendo.com/"
 
 #. This text comes from http://www.jamendo.com/en/static/concept/ and was already translated in many languages. You should take a look on this site and check if you can't reuse it.
-#: ../plugins/jamendo/jamendo-loading.glade.h:2
+#: ../plugins/jamendo/jamendo-loading.ui.h:2
 msgid ""
 "     * A legal framework protecting the artists (thanks to the Creative "
 "Commons licenses)."
@@ -2099,7 +2151,7 @@ msgstr ""
 "     * Uma plataforma legal que protege os direitos dos artistas (graças às "
 "licenças Creative Commons)."
 
-#: ../plugins/jamendo/jamendo-loading.glade.h:3
+#: ../plugins/jamendo/jamendo-loading.ui.h:3
 msgid ""
 "     * An adaptive music recommendation system based on iRATE to help "
 "listeners discover new artists based on their tastes\n"
@@ -2109,77 +2161,78 @@ msgstr ""
 "os ouvintes a descobrir novos artistas baseado nas suas preferências "
 "pessoais e outros critérios como a localização."
 
-#: ../plugins/jamendo/jamendo-loading.glade.h:5
+#: ../plugins/jamendo/jamendo-loading.ui.h:5
 msgid "     * Free, simple and quick access to the music, for everyone."
 msgstr "     * Grátis, simples e acesso rápido à música, para todos."
 
-#: ../plugins/jamendo/jamendo-loading.glade.h:6
+#: ../plugins/jamendo/jamendo-loading.ui.h:6
 msgid "     * The possibility of making direct donations to the artists."
 msgstr "     * A possibilidade de fazer doações directas aos artistas."
 
-#: ../plugins/jamendo/jamendo-loading.glade.h:7
+#: ../plugins/jamendo/jamendo-loading.ui.h:7
 msgid "     * The use of the latest Peer-to-Peer technologies"
 msgstr "     * Uso das mais recentres tecnologias Peer-to-Peer"
 
-#: ../plugins/jamendo/jamendo-loading.glade.h:8
+#: ../plugins/jamendo/jamendo-loading.ui.h:8
 msgid "<b>Jamendo</b>"
 msgstr "<b>Jamendo</b>"
 
-#: ../plugins/jamendo/jamendo-loading.glade.h:9
+#: ../plugins/jamendo/jamendo-loading.ui.h:9
 msgid ""
-"On jamendo, the artists distribute their music under Creative Commons "
+"Jamendo is a new model for artists to promote, publish, and be paid for "
+"their music."
+msgstr ""
+"Jamendo é um novo modelo para os artistas promoverem, publicarem, e serem "
+"pagos pelas suas músicas."
+
+#: ../plugins/jamendo/jamendo-loading.ui.h:10
+msgid "Jamendo is the only platform that joins together :"
+msgstr "Jamendo é a única plataforma que combina :"
+
+#: ../plugins/jamendo/jamendo-loading.ui.h:11
+msgid ""
+"Jamendo users can discover and share albums, but also review them or start a "
+"discussion on the forums.\n"
+"Albums are democratically rated based on the visitors&#x2019; reviews.\n"
+"If they fancy an artist they can support him by making a donation."
+msgstr ""
+"Os utilizadores do Jamendo podem descobrir e partilhar álbuns, mas também "
+"comentá-los ou iniciar uma discussão nos fóruns.\n"
+"Os álbuns são democraticamente avaliados com base na opinião dos "
+"visitantes.\n"
+"Se gostarem de um artista podem ajudá-lo fazendo doações."
+
+#: ../plugins/jamendo/jamendo-loading.ui.h:14
+msgid ""
+"On Jamendo, the artists distribute their music under Creative Commons "
 "licenses.\n"
 "In a nutshell, they allow you to download, remix and share their music "
 "freely.\n"
 "It's a \"Some rights reserved\" agreement, perfectly suited for the new "
 "century."
 msgstr ""
-"No jamendo, os artistas distribuem as suas músicas sob licenças Creative "
+"No Jamendo, os artistas distribuem as suas músicas sob licenças Creative "
 "Commons.\n"
 "Em resumo, eles permitem-lhe transferir, remisturar e partilhar a sua música "
 "livremente.\n"
 "É um acordo de \"Alguns direitos reservados\", perfeitamente adequado para o "
 "novo século."
 
-#: ../plugins/jamendo/jamendo-loading.glade.h:12
+#: ../plugins/jamendo/jamendo-loading.ui.h:17
 msgid ""
-"These new rules make jamendo able to use the new powerful means of digital "
+"These new rules make Jamendo able to use the new powerful means of digital "
 "distribution like\n"
 "Peer-to-Peer networks such as BitTorrent or eMule to legally distribute "
 "albums at near-zero cost."
 msgstr ""
-"Estas novas regras tornam o jamendo capaz de utilizar os mais poderosos "
-"meios de distribuição digital como redes Peer-to-Peer tais como BitTorrent "
+"Estas novas regras tornam o Jamendo capaz de utilizar os mais poderosos "
+"meios de distribuição digital como redes Ponto-a-Ponto tais como BitTorrent "
 "ou eMule para distribuir legalmente os álbuns a um custo quase-zero."
 
-#: ../plugins/jamendo/jamendo-loading.glade.h:14
+#: ../plugins/jamendo/jamendo-loading.ui.h:19
 msgid "You can find more information at http://www.jamendo.com/"
 msgstr "Pode encontrar mais informação em http://www.jamendo.com/"
 
-#: ../plugins/jamendo/jamendo-loading.glade.h:15
-msgid ""
-"jamendo is a new model for artists to promote, publish, and be paid for "
-"their music."
-msgstr ""
-"jamendo é um modelo novo para os artistas promoverem, publicarem, e serem "
-"pagos pelas suas músicas."
-
-#: ../plugins/jamendo/jamendo-loading.glade.h:16
-msgid "jamendo is the only platform that joins together :"
-msgstr "jamendo é a única plataforma que combina :"
-
-#: ../plugins/jamendo/jamendo-loading.glade.h:17
-msgid ""
-"jamendo users can discover and share albums, but also review them or start a "
-"discussion on the forums.\n"
-"Albums are democratically rated based on the visitors’ reviews.\n"
-"If they fancy an artist they can support him by making a donation."
-msgstr ""
-"os utilizadores do jamendo podem descobrir e partilhar álbuns, mas também "
-"comentá-los ou iniciar uma discussão nos fóruns.\n"
-"Os álbuns são democraticamente avaliados com base na opinião dos ouvintes.\n"
-"Se gostarem de um artista podem ajudá-lo fazendo doações."
-
 #: ../plugins/jamendo/jamendo.rb-plugin.in.h:1
 msgid ""
 "Adds support to Rhythmbox for playing and downloading albums from Jamendo"
@@ -2188,7 +2241,7 @@ msgstr ""
 "do Jamendo"
 
 #: ../plugins/jamendo/jamendo.rb-plugin.in.h:2
-#: ../plugins/jamendo/jamendo/JamendoSource.py:65
+#: ../plugins/jamendo/jamendo/JamendoSource.py:62
 msgid "Jamendo"
 msgstr "Jamendo"
 
@@ -2214,87 +2267,87 @@ msgstr "_Doação ao Artista"
 msgid "Donate Money to this Artist"
 msgstr "Doar Dinheiro a este Artista"
 
-#: ../plugins/jamendo/jamendo/JamendoSource.py:121
-msgid "Loading Jamendo catalogue"
+#: ../plugins/jamendo/jamendo/JamendoSource.py:120
+msgid "Loading Jamendo catalog"
 msgstr "A carregar o catálogo do Jamendo"
 
-#: ../plugins/jamendo/jamendo/JamendoSource.py:359
+#: ../plugins/jamendo/jamendo/JamendoSource.py:303
 #, python-format
 msgid "Error looking up p2plink for album %s on jamendo.com"
 msgstr "Erro ao procurar p2plink para álbum %s no jamendo.com"
 
-#: ../plugins/jamendo/jamendo/JamendoSource.py:383
+#: ../plugins/jamendo/jamendo/JamendoSource.py:327
 #, python-format
 msgid "Error looking up artist %s on jamendo.com"
 msgstr "Erro ao procurar artista %s no jamendo.com"
 
-#: ../plugins/iradio/rb-iradio-source.c:175
+#: ../plugins/iradio/rb-iradio-source.c:173
 msgid "New Internet _Radio Station..."
 msgstr "Nova Estação de _Rádio na Internet..."
 
-#: ../plugins/iradio/rb-iradio-source.c:176
+#: ../plugins/iradio/rb-iradio-source.c:174
 msgid "Create a new Internet Radio station"
 msgstr "Criar uma nova estação de Rádio na Internet"
 
 #. Translators: this is the toolbar button label for
-#. New Interner Radio Station action.
-#. Don't include the prefix "radio|" in the translation.
-#: ../plugins/iradio/rb-iradio-source.c:317
-msgid "radio|New"
-msgstr "Nova"
+#. New Internet Radio Station action.
+#: ../plugins/iradio/rb-iradio-source.c:314
+msgctxt "Radio"
+msgid "New"
+msgstr "Novo"
 
-#: ../plugins/iradio/rb-iradio-source.c:359 ../widgets/rb-entry-view.c:1455
+#: ../plugins/iradio/rb-iradio-source.c:356 ../widgets/rb-entry-view.c:1506
 #: ../widgets/rb-library-browser.c:142
 #: ../widgets/rb-query-creator-properties.c:78
 #: ../widgets/rb-query-creator-properties.c:104
 msgid "Genre"
 msgstr "Género"
 
-#: ../plugins/iradio/rb-iradio-source.c:455
+#: ../plugins/iradio/rb-iradio-source.c:452
 msgid "Radio"
 msgstr "Rádio"
 
-#: ../plugins/iradio/rb-iradio-source.c:594
+#: ../plugins/iradio/rb-iradio-source.c:591
 #, c-format
 msgid "%d station"
 msgid_plural "%d stations"
 msgstr[0] "%d estação"
 msgstr[1] "%d estações"
 
-#: ../plugins/iradio/rb-iradio-source.c:1006
-#: ../plugins/iradio/rb-station-properties-dialog.c:409
+#: ../plugins/iradio/rb-iradio-source.c:1004
+#: ../plugins/iradio/rb-station-properties-dialog.c:405
 msgid "New Internet Radio Station"
 msgstr "Nova Estação de Rádio na Internet"
 
-#: ../plugins/iradio/rb-iradio-source.c:1006
+#: ../plugins/iradio/rb-iradio-source.c:1004
 msgid "URL of internet radio station:"
 msgstr "URL da estação de rádio na internet:"
 
-#: ../plugins/iradio/rb-station-properties-dialog.c:405
-#: ../podcast/rb-feed-podcast-properties-dialog.c:216
-#: ../podcast/rb-podcast-properties-dialog.c:372 ../widgets/rb-song-info.c:993
+#: ../plugins/iradio/rb-station-properties-dialog.c:401
+#: ../podcast/rb-feed-podcast-properties-dialog.c:212
+#: ../podcast/rb-podcast-properties-dialog.c:368 ../widgets/rb-song-info.c:986
 #, c-format
 msgid "%s Properties"
 msgstr "Propriedades de %s"
 
-#: ../plugins/iradio/rb-station-properties-dialog.c:497
-#: ../podcast/rb-podcast-properties-dialog.c:485
-#: ../widgets/rb-song-info.c:1052
+#: ../plugins/iradio/rb-station-properties-dialog.c:493
+#: ../podcast/rb-podcast-properties-dialog.c:481
+#: ../widgets/rb-entry-view.c:1070 ../widgets/rb-song-info.c:1050
 #, c-format
 msgid "%lu kbps"
 msgstr "%lu kbps"
 
-#: ../plugins/iradio/rb-station-properties-dialog.c:588
+#: ../plugins/iradio/rb-station-properties-dialog.c:584
 msgid "Unable to change station property"
 msgstr "Incapaz de alterar propriedade da estação"
 
-#: ../plugins/iradio/rb-station-properties-dialog.c:588
+#: ../plugins/iradio/rb-station-properties-dialog.c:584
 #, c-format
 msgid "Unable to change station URI to %s, as that station already exists"
 msgstr ""
 "Incapaz de alterar o URI da estação para %s, porque essa estação já existe"
 
-#: ../plugins/iradio/station-properties.glade.h:5
+#: ../plugins/iradio/station-properties.ui.h:5
 msgid "L_ocation:"
 msgstr "L_ocalização:"
 
@@ -2306,42 +2359,43 @@ msgstr "Controlar o Rhythmbox com um controlo remoto por infravermelho"
 msgid "LIRC "
 msgstr "LIRC "
 
-#: ../plugins/lyrics/lyrics/__init__.py:134
-#: ../plugins/lyrics/lyrics/__init__.py:143
+#: ../plugins/lyrics/lyrics/__init__.py:166
+#: ../plugins/lyrics/lyrics/__init__.py:168
+#: ../plugins/lyrics/lyrics/__init__.py:177
 msgid "No lyrics found"
 msgstr "Letra não encontrada"
 
-#: ../plugins/lyrics/lyrics/__init__.py:177
+#: ../plugins/lyrics/lyrics/__init__.py:211
 msgid "_Save"
 msgstr "_Gravar"
 
-#: ../plugins/lyrics/lyrics/__init__.py:182
-#: ../plugins/lyrics/lyrics/__init__.py:195 ../shell/rb-shell.c:420
+#: ../plugins/lyrics/lyrics/__init__.py:216
+#: ../plugins/lyrics/lyrics/__init__.py:229 ../shell/rb-shell.c:390
 msgid "_Edit"
 msgstr "_Editar"
 
-#: ../plugins/lyrics/lyrics/__init__.py:197
+#: ../plugins/lyrics/lyrics/__init__.py:231
 msgid "_Search again"
 msgstr "_Procurar novamente"
 
-#: ../plugins/lyrics/lyrics/__init__.py:215
-#: ../plugins/lyrics/lyrics/__init__.py:281
+#: ../plugins/lyrics/lyrics/__init__.py:249
+#: ../plugins/lyrics/lyrics/__init__.py:315
 msgid "Lyrics"
 msgstr "Letra"
 
-#: ../plugins/lyrics/lyrics/__init__.py:255
+#: ../plugins/lyrics/lyrics/__init__.py:289
 msgid "Searching for lyrics..."
 msgstr "Procurando as letras..."
 
-#: ../plugins/lyrics/lyrics/__init__.py:291
+#: ../plugins/lyrics/lyrics/__init__.py:325
 msgid "Song L_yrics"
 msgstr "L_etras da Música"
 
-#: ../plugins/lyrics/lyrics/__init__.py:292
+#: ../plugins/lyrics/lyrics/__init__.py:326
 msgid "Display lyrics for the playing song"
 msgstr "Apresentar letras da música actual"
 
-#: ../plugins/lyrics/lyrics/LyricsConfigureDialog.py:104
+#: ../plugins/lyrics/lyrics/LyricsConfigureDialog.py:106
 msgid "Choose lyrics folder..."
 msgstr "Seleccione pasta das letras..."
 
@@ -2353,27 +2407,27 @@ msgstr "Obter letra da música da Internet"
 msgid "Song Lyrics"
 msgstr "Letra da Música"
 
-#: ../plugins/lyrics/lyrics-prefs.glade.h:1
+#: ../plugins/lyrics/lyrics-prefs.ui.h:1
 msgid "<b>Lyrics Folder</b>"
 msgstr "<b>Pasta das Letras</b>"
 
-#: ../plugins/lyrics/lyrics-prefs.glade.h:2
+#: ../plugins/lyrics/lyrics-prefs.ui.h:2
 msgid "<b>Search engines</b>"
 msgstr "<b>Motores de busca</b>"
 
-#: ../plugins/lyrics/lyrics-prefs.glade.h:3
+#: ../plugins/lyrics/lyrics-prefs.ui.h:3
 msgid "Browse..."
 msgstr "Navegar..."
 
-#: ../plugins/lyrics/lyrics-prefs.glade.h:4
+#: ../plugins/lyrics/lyrics-prefs.ui.h:4
 msgid "Lyrics Plugin Preferences"
 msgstr "Preferências do Plugin Letras"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:1
+#: ../plugins/magnatune/magnatune-loading.ui.h:1
 msgid "     * Founder/owner runs it -- support a small business"
 msgstr "     * Dirigido pelo fundador/dono -- suporte uma pequena empresa"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:3
+#: ../plugins/magnatune/magnatune-loading.ui.h:3
 #, no-c-format
 msgid ""
 "    * 50% of payment goes to artist (makes buyer feel good: they're helping "
@@ -2382,11 +2436,11 @@ msgstr ""
 "    * 50% do pagamento vai para o artista (que faz o comprador sentir-se "
 "bem: está a ajudar o mundo)"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:4
+#: ../plugins/magnatune/magnatune-loading.ui.h:4
 msgid "    * All albums and artists hand-picked"
 msgstr "    * Todos os álbuns e artistas escolhidos a dedo"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:5
+#: ../plugins/magnatune/magnatune-loading.ui.h:5
 msgid ""
 "    * Downloads and CDs are both available (no other site on the internet "
 "sells both)"
@@ -2394,7 +2448,7 @@ msgstr ""
 "    * Transferências e CD's estão ambos disponíveis (nenhum outro site na "
 "internet vende ambos)"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:6
+#: ../plugins/magnatune/magnatune-loading.ui.h:6
 msgid ""
 "    * Extensive biographical info about each musician, and artist photo -- "
 "feel a strong connection to the artist"
@@ -2402,11 +2456,11 @@ msgstr ""
 "    * Informação biográfica extensiva sobre cada músico, e fotografia do "
 "artista -- sinta uma ligação forte com o artista"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:7
+#: ../plugins/magnatune/magnatune-loading.ui.h:7
 msgid "    * Free listening of all songs"
 msgstr "    * Escuta gratuita de todas as músicas"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:8
+#: ../plugins/magnatune/magnatune-loading.ui.h:8
 msgid ""
 "    * Full color, high quality cover art PDF available for most albums - "
 "easy to print"
@@ -2414,7 +2468,7 @@ msgstr ""
 "    * PDF da arte de capa com cor completa, alta qualidade disponível para a "
 "maioria dos álbuns - fácil de imprimir"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:9
+#: ../plugins/magnatune/magnatune-loading.ui.h:9
 msgid ""
 "    * Low pressure environment - nothing flashing, no audio ads while "
 "listening to albums"
@@ -2422,7 +2476,7 @@ msgstr ""
 "    * Ambiente de baixa pressão - nada a piscar, sem publicidade áudio "
 "enquanto ouve os álbuns"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:10
+#: ../plugins/magnatune/magnatune-loading.ui.h:10
 msgid ""
 "    * Music selection is unique to Magnatune, unlike most on-line stores "
 "that have more-or-less the same (gigantic) selection\n"
@@ -2430,7 +2484,7 @@ msgstr ""
 "    * Selecção musical unica no Magnatune, ao contrário da maioria das lojas "
 "on-line que têm mais ou menos a mesma (enorme) selecção\n"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:12
+#: ../plugins/magnatune/magnatune-loading.ui.h:12
 msgid ""
 "    * No copy protection on the music (DRM) which allows playing music on "
 "any device (unlike iTunes/MSN/etc)"
@@ -2438,11 +2492,11 @@ msgstr ""
 "    * Sem protecção de cópia na música (DRM) que permite que a música seja "
 "reproduzida em qualquer dispositivo (ao contrário do iTunes/MSN/etc)"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:13
+#: ../plugins/magnatune/magnatune-loading.ui.h:13
 msgid "    * No need to \"register\" to listen or buy"
 msgstr "    * Não precisa de se \"registar\" para ouvir ou comprar"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:14
+#: ../plugins/magnatune/magnatune-loading.ui.h:14
 msgid ""
 "    * Not part of the \"evil\" major label machine - for those that hate the "
 "music biz and want to help topple it"
@@ -2450,11 +2504,11 @@ msgstr ""
 "    * Sem vínculos com as editoras do \"mal\" - para aqueles que odeiam o "
 "mundo de negócios da música e desejam ajudar a derrubá-lo"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:15
+#: ../plugins/magnatune/magnatune-loading.ui.h:15
 msgid "    * Not venture-capital backed big business"
 msgstr "    * Não é apoiada por nenhuma grande empresa"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:16
+#: ../plugins/magnatune/magnatune-loading.ui.h:16
 msgid ""
 "    * Our genres are hard to find in record stores and not on radio (though "
 "do appear on college radio)"
@@ -2462,7 +2516,7 @@ msgstr ""
 "    * Os nossos géneros são difíceis de encontrar em lojas e na rádio "
 "(apesar de que algumas aparecem nas rádios universitárias)"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:17
+#: ../plugins/magnatune/magnatune-loading.ui.h:17
 msgid ""
 "    * Perfect quality downloads (CD copy) are available when you download "
 "(not inferior quality sound)"
@@ -2470,7 +2524,7 @@ msgstr ""
 "    * Transferências com qualidade perfeita (cópia de CD) estão disponíveis"
 "(não áudio de qualidade inferior)"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:18
+#: ../plugins/magnatune/magnatune-loading.ui.h:18
 msgid ""
 "    * Radio stations and \"genre mix\" playlists allow background listening "
 "- can do work while listening to our music"
@@ -2478,12 +2532,12 @@ msgstr ""
 "    * Estações de rádio e listas de reprodução mistas criam um ambiente "
 "musical de fundo - faça seu trabalho enquanto escuta a nossa música"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:19
+#: ../plugins/magnatune/magnatune-loading.ui.h:19
 msgid "    * Smaller selection means easier to find good music"
 msgstr ""
 "    * Pequenas seleções significam que é mais fácil encontrar boa música"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:20
+#: ../plugins/magnatune/magnatune-loading.ui.h:20
 msgid ""
 "    * Variable pricing scheme means you can pay as little as $5 for an album "
 "if you choose"
@@ -2491,19 +2545,19 @@ msgstr ""
 "    * Esquema variável de preços significa que pode pagar até $5 por um "
 "álbum se assim escolher"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:21
+#: ../plugins/magnatune/magnatune-loading.ui.h:21
 msgid "    * Very simple user interface, quick to play music"
 msgstr "    * Interface simples, rápida para escutar música"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:22
+#: ../plugins/magnatune/magnatune-loading.ui.h:22
 msgid "    * Wide variety of genres, can fit any mood"
 msgstr "    * Ampla variedade de géneros, para todos os gostos"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:23
+#: ../plugins/magnatune/magnatune-loading.ui.h:23
 msgid "<b>Magnatune online music store</b>"
 msgstr "<b>Loja de música online Magnatune</b>"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:24
+#: ../plugins/magnatune/magnatune-loading.ui.h:24
 msgid ""
 "Magnatune is an online record label that is not evil. Some of their key "
 "attributes are:\n"
@@ -2511,71 +2565,86 @@ msgstr ""
 "A Magnatune é uma editora discográfica on-line que não é diabólica. Alguns "
 "dos seus atributos são:\n"
 
-#: ../plugins/magnatune/magnatune-loading.glade.h:26
+#: ../plugins/magnatune/magnatune-loading.ui.h:26
 msgid "You can find more information at http://www.magnatune.com/"
 msgstr "Pode encontrar mais informação em http://www.magnatune.com/"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:1
-msgid ""
-"$5 US\n"
-"$6 US\n"
-"$7 US\n"
-"$8 US (typical)\n"
-"$9 US\n"
-"$10 US (better than average)\n"
-"$11 US\n"
-"$12 US (generous)\n"
-"$13 US\n"
-"$14 US\n"
-"$15 US (very generous)\n"
-"$16 US\n"
-"$17 US\n"
-"$18 US (we love you)"
-msgstr ""
-"$5 US\n"
-"$6 US\n"
-"$7 US\n"
-"$8 US (típico)\n"
-"$9 US\n"
-"$10 US (melhor que a média)\n"
-"$11 US\n"
-"$12 US (generoso)\n"
-"$13 US\n"
-"$14 US\n"
-"$15 US (muito generoso)\n"
-"$16 US\n"
-"$17 US\n"
-"$18 US (adoramo-vos)"
-
-#: ../plugins/magnatune/magnatune-prefs.glade.h:15
-msgid ""
-"01\n"
-"02\n"
-"03\n"
-"04\n"
-"05\n"
-"06\n"
-"07\n"
-"08\n"
-"09\n"
-"10\n"
-"11\n"
-"12"
-msgstr ""
-"01\n"
-"02\n"
-"03\n"
-"04\n"
-"05\n"
-"06\n"
-"07\n"
-"08\n"
-"09\n"
-"10\n"
-"11\n"
-"12"
-
-#: ../plugins/magnatune/magnatune-prefs.glade.h:27
+#: ../plugins/magnatune/magnatune-prefs.ui.h:1
+#: ../plugins/magnatune/magnatune-purchase.ui.h:1
+msgid "$10 US (better than average)"
+msgstr "$10 EUA (melhor do que a média)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:2
+#: ../plugins/magnatune/magnatune-purchase.ui.h:2
+msgid "$11 US"
+msgstr "$11 EUA"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:3
+#: ../plugins/magnatune/magnatune-purchase.ui.h:3
+msgid "$12 US (generous)"
+msgstr "$12 EUA (generoso)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:4
+#: ../plugins/magnatune/magnatune-purchase.ui.h:4
+msgid "$13 US"
+msgstr "$13 EUA"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:5
+#: ../plugins/magnatune/magnatune-purchase.ui.h:5
+msgid "$14 US"
+msgstr "$14 EUA"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:6
+#: ../plugins/magnatune/magnatune-purchase.ui.h:6
+msgid "$15 US (VERY generous!)"
+msgstr "$15 EUA (MUITO generoso!)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:7
+#: ../plugins/magnatune/magnatune-purchase.ui.h:7
+msgid "$16 US"
+msgstr "$16 EUA"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:8
+#: ../plugins/magnatune/magnatune-purchase.ui.h:8
+msgid "$17 US"
+msgstr "$17 EUA"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:9
+#: ../plugins/magnatune/magnatune-purchase.ui.h:9
+msgid "$18 US (We love you!)"
+msgstr "$18 EUA (Nós adoramos-te!)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:10
+#: ../plugins/magnatune/magnatune-purchase.ui.h:10
+msgid "$5 US"
+msgstr "$5 EUA"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:11
+#: ../plugins/magnatune/magnatune-purchase.ui.h:11
+msgid "$6 US"
+msgstr "$6 EUA"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:12
+#: ../plugins/magnatune/magnatune-purchase.ui.h:12
+msgid "$7 US"
+msgstr "$7 EUA"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:13
+#: ../plugins/magnatune/magnatune-purchase.ui.h:13
+msgid "$8 US (typical)"
+msgstr "$8 EUA (habitual)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:14
+#: ../plugins/magnatune/magnatune-purchase.ui.h:14
+msgid "$9 US"
+msgstr "$9 EUA"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:15
+#: ../plugins/magnatune/magnatune-purchase.ui.h:15
+msgid "128K MP3"
+msgstr "128K MP3"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:16
 msgid ""
 "<span weight=\"bold\" foreground=\"red\">Your credit card is past the "
 "expiration date listed.</span>"
@@ -2583,190 +2652,195 @@ msgstr ""
 "<span weight=\"bold\" foreground=\"red\">O seu cartão de crédito passou a "
 "data de expiração listada.</span>"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:28
+#: ../plugins/magnatune/magnatune-prefs.ui.h:17
+#: ../plugins/magnatune/magnatune-purchase.ui.h:16
+msgid "April (04)"
+msgstr "Abril (04)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:18
+#: ../plugins/magnatune/magnatune-purchase.ui.h:18
+msgid "August (08)"
+msgstr "Agosto (08)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:19
 msgid "C_redit Card:"
 msgstr "Ca_rtão de Crédito:"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:29
+#: ../plugins/magnatune/magnatune-prefs.ui.h:20
+#: ../plugins/magnatune/magnatune-purchase.ui.h:21
+msgid "December (12)"
+msgstr "Dezembro (12)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:21
 msgid "Default _amount to pay:"
 msgstr "Qu_antia por defeito a pagar:"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:30
+#: ../plugins/magnatune/magnatune-prefs.ui.h:22
 msgid "Expiry:"
 msgstr "Expiração:"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:31
+#: ../plugins/magnatune/magnatune-prefs.ui.h:23
+#: ../plugins/magnatune/magnatune-purchase.ui.h:24
+msgid "FLAC"
+msgstr "FLAC"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:24
+#: ../plugins/magnatune/magnatune-purchase.ui.h:25
+msgid "February (02)"
+msgstr "Fevereiro (02)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:25
 msgid "Find out about Magnatune at "
 msgstr "Conhece o Magnatune em "
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:32
+#: ../plugins/magnatune/magnatune-prefs.ui.h:26
+#: ../plugins/magnatune/magnatune-purchase.ui.h:28
+msgid "January (01)"
+msgstr "Janeiro (01)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:27
+#: ../plugins/magnatune/magnatune-purchase.ui.h:29
+msgid "July (07)"
+msgstr "Julho (07)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:28
+#: ../plugins/magnatune/magnatune-purchase.ui.h:30
+msgid "June (06)"
+msgstr "Junho (06)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:29
 msgid "Magnatune Information"
 msgstr "Informação do Magnatune"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:33
+#: ../plugins/magnatune/magnatune-prefs.ui.h:30
 msgid "Magnatune Preferences"
 msgstr "Preferências do Magnatune"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:34
-#: ../plugins/magnatune/magnatune-purchase.glade.h:34
-msgid ""
-"Ogg Vorbis\n"
-"FLAC\n"
-"WAV\n"
-"VBR MP3\n"
-"128K MP3"
-msgstr ""
-"Ogg Vorbis\n"
-"FLAC\n"
-"WAV\n"
-"VBR MP3\n"
-"128K MP3"
+#: ../plugins/magnatune/magnatune-prefs.ui.h:31
+#: ../plugins/magnatune/magnatune-purchase.ui.h:31
+msgid "March (03)"
+msgstr "Março (03)"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:39
+#: ../plugins/magnatune/magnatune-prefs.ui.h:32
+#: ../plugins/magnatune/magnatune-purchase.ui.h:32
+msgid "May (05)"
+msgstr "Maio (05)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:33
+#: ../plugins/magnatune/magnatune-purchase.ui.h:33
+msgid "November (11)"
+msgstr "Novembro (11)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:34
+#: ../plugins/magnatune/magnatune-purchase.ui.h:34
+msgid "October (10)"
+msgstr "Outubro (10)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:35
+#: ../plugins/magnatune/magnatune-purchase.ui.h:35
+msgid "Ogg Vorbis"
+msgstr "Ogg Vorbis"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:36
 msgid "Preferred audio _format:"
 msgstr "_Formato de áudio preferido:"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:40
+#: ../plugins/magnatune/magnatune-prefs.ui.h:37
 msgid "Redownload purchased music at "
 msgstr "Voltar a transferir música comprada em "
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:41
+#: ../plugins/magnatune/magnatune-prefs.ui.h:38
 msgid "Remember my credit card details"
 msgstr "Recordar os detalhes do meu cartão de crédito"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:42
+#: ../plugins/magnatune/magnatune-prefs.ui.h:39
+#: ../plugins/magnatune/magnatune-purchase.ui.h:37
+msgid "September (09)"
+msgstr "Setembro (09)"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:40
+#: ../plugins/magnatune/magnatune-purchase.ui.h:38
+msgid "VBR MP3"
+msgstr "VBR MP3"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:41
 msgid "Visit Magnatune at "
 msgstr "Visite o Magnatune em "
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:43
+#: ../plugins/magnatune/magnatune-prefs.ui.h:42
+#: ../plugins/magnatune/magnatune-purchase.ui.h:39
+msgid "WAV"
+msgstr "WAV"
+
+#: ../plugins/magnatune/magnatune-prefs.ui.h:43
 msgid "_Email:"
 msgstr "Correio _Electrónico:"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:44
+#: ../plugins/magnatune/magnatune-prefs.ui.h:44
 msgid "_Month:"
 msgstr "_Mês:"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:47
+#: ../plugins/magnatune/magnatune-prefs.ui.h:47
 msgid "http://www.magnatune.com/"
 msgstr "http://www.magnatune.com/"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:48
+#: ../plugins/magnatune/magnatune-prefs.ui.h:48
 msgid "http://www.magnatune.com/info/"
 msgstr "http://www.magnatune.com/info/"
 
-#: ../plugins/magnatune/magnatune-prefs.glade.h:49
+#: ../plugins/magnatune/magnatune-prefs.ui.h:49
 msgid "http://www.magnatune.com/info/redownload"
 msgstr "http://www.magnatune.com/info/redownload"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:1
-msgid ""
-"$5\n"
-"$6\n"
-"$7\n"
-"$8 (typical)\n"
-"$9\n"
-"$10 (better than average)\n"
-"$11\n"
-"$12 (generous)\n"
-"$13\n"
-"$14\n"
-"$15 (VERY generous!)\n"
-"$16\n"
-"$17\n"
-"$18 (We love you!)"
-msgstr ""
-"$5\n"
-"$6\n"
-"$7\n"
-"$8 (típico)\n"
-"$9\n"
-"$10 (melhor que a média)\n"
-"$11\n"
-"$12 (generoso)\n"
-"$13\n"
-"$14\n"
-"$15 (MUITO generoso)\n"
-"$16\n"
-"$17\n"
-"$18 (adoramo-vos)"
-
-#: ../plugins/magnatune/magnatune-purchase.glade.h:15
+#: ../plugins/magnatune/magnatune-purchase.ui.h:17
 msgid "Audio _format:"
 msgstr "_Formato de Áudio:"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:16
+#: ../plugins/magnatune/magnatune-purchase.ui.h:19
 msgid "C_redit Card number:"
 msgstr "Número do Cartão de C_rédito:"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:17
+#: ../plugins/magnatune/magnatune-purchase.ui.h:20
 msgid "Credit Card"
 msgstr "Cartão de Crédito"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:18
+#: ../plugins/magnatune/magnatune-purchase.ui.h:22
 msgid "Expiry _month:"
 msgstr "_Mês de Expiração:"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:19
+#: ../plugins/magnatune/magnatune-purchase.ui.h:23
 msgid "Expiry _year (last two digits):"
 msgstr "_Ano de expiração (últimos 2 digitos):"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:20
+#: ../plugins/magnatune/magnatune-purchase.ui.h:26
 msgid "Gift Card"
 msgstr "Cheque Oferta"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:21
+#: ../plugins/magnatune/magnatune-purchase.ui.h:27
 msgid "Gift card number:"
 msgstr "Número do cheque oferta:"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:22
-msgid ""
-"January (01)\n"
-"February (02)\n"
-"March (03)\n"
-"April (04)\n"
-"May (05)\n"
-"June (06)\n"
-"July (07)\n"
-"August (08)\n"
-"September (09)\n"
-"October (10)\n"
-"November (11)\n"
-"December (12)"
-msgstr ""
-"Janeiro (01)\n"
-"Fevereiro (02)\n"
-"Março (03)\n"
-"Abril (04)\n"
-"Maio (05)\n"
-"Junho (06)\n"
-"Julho (07)\n"
-"Agosto (08)\n"
-"Setembro (09)\n"
-"Outubro (10)\n"
-"Novembtro (11)\n"
-"Dezembro (12)"
-
-#: ../plugins/magnatune/magnatune-purchase.glade.h:39
+#: ../plugins/magnatune/magnatune-purchase.ui.h:36
 msgid "Purchase Magnatune Tracks"
 msgstr "Comprar Faixas do Magnatune"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:40
+#: ../plugins/magnatune/magnatune-purchase.ui.h:40
 msgid "_Amount to pay (US Dollars):"
 msgstr "Qu_antia a pagar (Dollars Americanos USD):"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:41
+#: ../plugins/magnatune/magnatune-purchase.ui.h:41
 msgid "_Email address:"
 msgstr "_Endereço de correio electrónico:"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:42
+#: ../plugins/magnatune/magnatune-purchase.ui.h:42
 msgid "_Name (as printed on card):"
 msgstr "_Nome (como impresso no cartão):"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:43
+#: ../plugins/magnatune/magnatune-purchase.ui.h:43
 msgid "_Purchase"
 msgstr "Com_prar"
 
-#: ../plugins/magnatune/magnatune-purchase.glade.h:44
+#: ../plugins/magnatune/magnatune-purchase.ui.h:44
 msgid "_Remember my credit card details"
 msgstr "_Recordar os detalhes do meu cartão de crédito"
 
@@ -2787,7 +2861,7 @@ msgid "Magnatune"
 msgstr "Magnatune"
 
 #: ../plugins/magnatune/magnatune/MagnatuneSource.py:121
-msgid "Loading Magnatune catalogue"
+msgid "Loading Magnatune catalog"
 msgstr "A Carregar Catálogo do Magnatune"
 
 #: ../plugins/magnatune/magnatune/MagnatuneSource.py:124
@@ -2803,34 +2877,34 @@ msgid "You must have a library location set to purchase an album."
 msgstr ""
 "Tem de ter uma localização da biblioteca definida para comprar um álbum."
 
-#: ../plugins/magnatune/magnatune/MagnatuneSource.py:253
+#: ../plugins/magnatune/magnatune/MagnatuneSource.py:255
 #, python-format
 msgid "Would you like to purchase the album <i>%(album)s</i> by '%(artist)s'?"
 msgstr "Deseja comprar o álbum <i>%(album)s</i> de '%(artist)s'?"
 
-#: ../plugins/magnatune/magnatune/MagnatuneSource.py:357
-msgid "Unable to load catalogue"
+#: ../plugins/magnatune/magnatune/MagnatuneSource.py:372
+msgid "Unable to load catalog"
 msgstr "Incapaz de carregar o catálogo"
 
-#: ../plugins/magnatune/magnatune/MagnatuneSource.py:358
+#: ../plugins/magnatune/magnatune/MagnatuneSource.py:373
 msgid ""
-"Rhythmbox could not understand the Magnatune catalogue, please file a bug."
+"Rhythmbox could not understand the Magnatune catalog, please file a bug."
 msgstr ""
 "O Rhythmbox não entendeu o catálogo da Magnatune, por favor submeta um bug."
 
-#: ../plugins/magnatune/magnatune/MagnatuneSource.py:443
+#: ../plugins/magnatune/magnatune/MagnatuneSource.py:459
 msgid "Authorizing Purchase"
 msgstr "A Autorizar Compra"
 
-#: ../plugins/magnatune/magnatune/MagnatuneSource.py:444
+#: ../plugins/magnatune/magnatune/MagnatuneSource.py:460
 msgid "Authorizing purchase with the Magnatune server. Please wait..."
 msgstr "A autorizar compra com o servidor do Magnatune. Por favor espere..."
 
-#: ../plugins/magnatune/magnatune/MagnatuneSource.py:490
+#: ../plugins/magnatune/magnatune/MagnatuneSource.py:506
 msgid "Purchase Error"
 msgstr "Erro na Compra"
 
-#: ../plugins/magnatune/magnatune/MagnatuneSource.py:491
+#: ../plugins/magnatune/magnatune/MagnatuneSource.py:507
 #, python-format
 msgid ""
 "An error occurred while trying to purchase the album.\n"
@@ -2841,12 +2915,12 @@ msgstr ""
 "O servidor do Magnatune devolveu:\n"
 "%s"
 
-#: ../plugins/magnatune/magnatune/MagnatuneSource.py:494
-#: ../widgets/rb-entry-view.c:1578
+#: ../plugins/magnatune/magnatune/MagnatuneSource.py:510
+#: ../widgets/rb-entry-view.c:1630
 msgid "Error"
 msgstr "Erro"
 
-#: ../plugins/magnatune/magnatune/MagnatuneSource.py:495
+#: ../plugins/magnatune/magnatune/MagnatuneSource.py:511
 #, python-format
 msgid ""
 "An error occurred while trying to purchase the album.\n"
@@ -2908,24 +2982,40 @@ msgstr ""
 "Suporte para dispositivos MTP (mostra o conteúdo, transfere, reproduz a "
 "partir do dispositivo)"
 
-#: ../plugins/mtpdevice/rb-mtp-plugin.c:103
-#: ../shell/rb-removable-media-manager.c:152
+#: ../plugins/mtpdevice/rb-mtp-gst-src.c:174
+#: ../plugins/mtpdevice/rb-mtp-gst-src.c:216
+#, c-format
+msgid "Unable to copy file from MTP device: %s"
+msgstr "Incapaz de copiar ficheiro de dispositivo MTP: %s"
+
+#: ../plugins/mtpdevice/rb-mtp-gst-src.c:190
+#, c-format
+msgid "Not enough space in %s"
+msgstr "Não há espaço suficiente em %s"
+
+#: ../plugins/mtpdevice/rb-mtp-gst-src.c:202
+#, c-format
+msgid "Unable to open temporary file: %s"
+msgstr "Incapaz de abrir ficheiro temporário: %s"
+
+#: ../plugins/mtpdevice/rb-mtp-plugin.c:120
+#: ../shell/rb-removable-media-manager.c:165
 msgid "_Eject"
 msgstr "_Ejectar"
 
-#: ../plugins/mtpdevice/rb-mtp-plugin.c:104
+#: ../plugins/mtpdevice/rb-mtp-plugin.c:121
 msgid "Eject MTP-device"
 msgstr "Ejectar dispositivo MTP"
 
-#: ../plugins/mtpdevice/rb-mtp-plugin.c:107
+#: ../plugins/mtpdevice/rb-mtp-plugin.c:124
 msgid "Rename MTP-device"
 msgstr "Renomear Dispositivo MTP"
 
-#: ../plugins/mtpdevice/rb-mtp-source.c:161
+#: ../plugins/mtpdevice/rb-mtp-source.c:145
 msgid "Media player device error"
 msgstr "Erro do dispositivo de reprodução de media"
 
-#: ../plugins/mtpdevice/rb-mtp-source.c:643
+#: ../plugins/mtpdevice/rb-mtp-source.c:733
 msgid "Digital Audio Player"
 msgstr "Leitor de Áudio Digital"
 
@@ -2980,23 +3070,6 @@ msgstr "consola python interactiva"
 msgid "Python Console"
 msgstr "Consola Python"
 
-#: ../plugins/rb-plugin-manager.c:55
-msgid "Plugin"
-msgstr "Plugin"
-
-#: ../plugins/rb-plugin-manager.c:56
-msgid "Enabled"
-msgstr "Activo"
-
-#: ../plugins/rb-plugins-engine.c:556
-msgid "Plugin Error"
-msgstr "Erro do Plugin"
-
-#: ../plugins/rb-plugins-engine.c:556
-#, c-format
-msgid "Unable to activate plugin %s"
-msgstr "Incapaz de activar o plugin %s"
-
 #: ../plugins/sample-python/sample-python.py:14
 msgid "Python Source"
 msgstr "Código Fonte Python "
@@ -3027,65 +3100,184 @@ msgstr "Um plugin de exemplo em Vala sem funcionalidades"
 msgid "Vala Sample Plugin"
 msgstr "Plugin de Exemplo em Vala"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:230
+#: ../plugins/status-icon/eggtrayicon.c:133
+msgid "Orientation"
+msgstr "Orientação"
+
+#: ../plugins/status-icon/eggtrayicon.c:134
+msgid "The orientation of the tray."
+msgstr "A orientação do ícone de painel."
+
+#: ../plugins/status-icon/rb-status-icon-plugin.c:142
+msgid "_Close"
+msgstr "_Fechar"
+
+#: ../plugins/status-icon/rb-status-icon-plugin.c:143
+msgid "Hide the music player window"
+msgstr "Esconder a janela do reprodutor de música"
+
+#: ../plugins/status-icon/rb-status-icon-plugin.c:149
+msgid "_Show Music Player"
+msgstr "_Mostrar Reprodutor de Música"
+
+#: ../plugins/status-icon/rb-status-icon-plugin.c:150
+msgid "Choose music to play"
+msgstr "Escolher música a reproduzir"
+
+#: ../plugins/status-icon/rb-status-icon-plugin.c:152
+msgid "Show N_otifications"
+msgstr "Mostrar N_otificações"
+
+#: ../plugins/status-icon/rb-status-icon-plugin.c:153
+msgid "Show notifications of song changes and other events"
+msgstr "Mostrar notificações de mudança de músicas e outros eventos"
+
+#: ../plugins/status-icon/rb-status-icon-plugin.c:427
+msgid "Next"
+msgstr "Seguinte"
+
+#: ../plugins/status-icon/rb-status-icon-plugin.c:578
+#: ../remote/dbus/rb-client.c:454 ../remote/dbus/rb-client.c:480
+msgid "Not playing"
+msgstr "Parado"
+
+#. Translators: the %s is the elapsed and total time
+#: ../plugins/status-icon/rb-status-icon-plugin.c:581
+#, c-format
+msgid "Paused, %s"
+msgstr "Pausado, %s"
+
+#. Translators: by Artist
+#: ../plugins/status-icon/rb-status-icon-plugin.c:670
+#, c-format
+msgid "by <i>%s</i>"
+msgstr "por <i>%s</i>"
+
+#. Translators: from Album
+#: ../plugins/status-icon/rb-status-icon-plugin.c:691
+#, c-format
+msgid "from <i>%s</i>"
+msgstr "de <i>%s</i>"
+
+#: ../plugins/status-icon/status-icon.rb-plugin.in.h:1
+msgid "Status Icon"
+msgstr "Ícone de Estado"
+
+#: ../plugins/status-icon/status-icon.rb-plugin.in.h:2
+msgid "Status icon and notification popups"
+msgstr "Ícone de estado e popups de notificação"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:1
+msgid "Always shown"
+msgstr "Apresentado sempre"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:2
+msgid "Always visible"
+msgstr "Sempre visível"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:3
+msgid "Change song"
+msgstr "Alterar música"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:4
+msgid "Change volume"
+msgstr "Alterar volume"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:5
+msgid "Never shown"
+msgstr "Nunca apresentado"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:6
+msgid "Never visible"
+msgstr "Nunca visível"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:7
+msgid "Owns the main window"
+msgstr "Possui a janela principal"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:8
+msgid "Shown when the main window is hidden"
+msgstr "Apresentado se a janela principal está oculta"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:9
+msgid "Status icon preferences"
+msgstr "Preferências do ícone de estado"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:10
+msgid "Visible with notifications"
+msgstr "Visível com notificações"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:11
+msgid "_Mouse wheel:"
+msgstr "Ro_da do rato:"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:12
+msgid "_Notifications:"
+msgstr "_Notificações:"
+
+#: ../plugins/status-icon/status-icon-preferences.ui.h:13
+msgid "_Status icon:"
+msgstr "Ícone de e_stado:"
+
+#: ../plugins/visualizer/rb-visualizer-plugin.c:229
 msgid "_Visualization"
 msgstr "_Visualização"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:231
+#: ../plugins/visualizer/rb-visualizer-plugin.c:230
 msgid "Start or stop visualization"
 msgstr "Iniciar ou parar a visualização"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:237
+#: ../plugins/visualizer/rb-visualizer-plugin.c:236
 msgid "Small"
 msgstr "Pequeno"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:238
+#: ../plugins/visualizer/rb-visualizer-plugin.c:237
 msgid "Normal"
 msgstr "Normal"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:239
+#: ../plugins/visualizer/rb-visualizer-plugin.c:238
 msgid "Large"
 msgstr "Grande"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:240
+#: ../plugins/visualizer/rb-visualizer-plugin.c:239
 msgid "Extra Large"
 msgstr "Muito Grande"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:251
+#: ../plugins/visualizer/rb-visualizer-plugin.c:243
 msgid "Embedded"
 msgstr "Embutido"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:252
+#: ../plugins/visualizer/rb-visualizer-plugin.c:244
 msgid "Fullscreen"
 msgstr "Ecrã Completo"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:253
+#: ../plugins/visualizer/rb-visualizer-plugin.c:245
 msgid "Desktop"
 msgstr "Ambiente de Trabalho"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:254
+#: ../plugins/visualizer/rb-visualizer-plugin.c:246
 msgid "Window"
 msgstr "Janela"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:712
+#: ../plugins/visualizer/rb-visualizer-plugin.c:726
 #, c-format
 msgid "Unable to start video output"
 msgstr "Incapaz de iniciar saída de vídeo"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:747
+#: ../plugins/visualizer/rb-visualizer-plugin.c:761
 #, c-format
 msgid "Failed to link new visual effect into the GStreamer pipeline"
 msgstr "Falha ao ligar novo efeito visual no pipeline do GStreamer"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:795
+#: ../plugins/visualizer/rb-visualizer-plugin.c:809
 msgid "Unable to start visualization"
 msgstr "Incapaz de iniciar visualização"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:1358
+#: ../plugins/visualizer/rb-visualizer-plugin.c:1390
 msgid "Enable visual effects?"
 msgstr "Activar efeitos visuais?"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:1360
+#: ../plugins/visualizer/rb-visualizer-plugin.c:1392
 msgid ""
 "It seems you are running Rhythmbox remotely.\n"
 "Are you sure you want to enable the visual effects?"
@@ -3093,27 +3285,27 @@ msgstr ""
 "Parece que está a exectutar o Rhytmbox remotamente.\n"
 "Tem a certeza de que quer activar os efeito visuais?"
 
-#: ../plugins/visualizer/rb-visualizer-plugin.c:1692
+#: ../plugins/visualizer/rb-visualizer-plugin.c:1722
 msgid "Music Player Visualization"
 msgstr "Visualização do Reproductor de Música"
 
-#: ../plugins/visualizer/visualizer-controls.glade.h:1
+#: ../plugins/visualizer/visualizer-controls.ui.h:1
 msgid "Disable"
 msgstr "Desactivar"
 
-#: ../plugins/visualizer/visualizer-controls.glade.h:2
+#: ../plugins/visualizer/visualizer-controls.ui.h:2
 msgid "Mode:"
 msgstr "Modo:"
 
-#: ../plugins/visualizer/visualizer-controls.glade.h:3
+#: ../plugins/visualizer/visualizer-controls.ui.h:3
 msgid "Quality:"
 msgstr "Qualidade:"
 
-#: ../plugins/visualizer/visualizer-controls.glade.h:4
+#: ../plugins/visualizer/visualizer-controls.ui.h:4
 msgid "Screen:"
 msgstr "Ecrã:"
 
-#: ../plugins/visualizer/visualizer-controls.glade.h:5
+#: ../plugins/visualizer/visualizer-controls.ui.h:5
 msgid "Visualization:"
 msgstr "Visualização:"
 
@@ -3178,137 +3370,136 @@ msgstr ""
 "Ocorreu um problema ao adicionar este podcast: %s.  Por favor verifique o "
 "URL: %s"
 
-#: ../podcast/rb-podcast-parse.c:168
+#: ../podcast/rb-podcast-parse.c:183
 #, c-format
 msgid "Unable to check file type: %s"
 msgstr "Incapaz de verificar tipo de ficheiro: %s"
 
-#: ../podcast/rb-podcast-parse.c:187
+#: ../podcast/rb-podcast-parse.c:202
 #, c-format
 msgid "Unexpected file type: %s"
 msgstr "Tipo de ficheiro inesperado: %s"
 
-#: ../podcast/rb-podcast-parse.c:210
+#: ../podcast/rb-podcast-parse.c:225
 #, c-format
 msgid "Unable to parse the feed contents"
 msgstr "Incapaz de processar os conteúdos da fonte"
 
-#: ../podcast/rb-podcast-parse.c:224
+#: ../podcast/rb-podcast-parse.c:239
 #, c-format
 msgid "The feed does not contain any downloadable items"
 msgstr "A fonte não contém nenhum item para transferir"
 
-#: ../podcast/rb-podcast-properties-dialog.c:435
+#: ../podcast/rb-podcast-properties-dialog.c:431
 msgid "Not Downloaded"
 msgstr "Não Transferido"
 
-#: ../remote/dbus/rb-client.c:81
+#: ../remote/dbus/rb-client.c:82
 msgid "Don't start a new instance of Rhythmbox"
 msgstr "Não iniciar outra instância  do Rhythmbox"
 
-#: ../remote/dbus/rb-client.c:82 ../shell/main.c:121
+#: ../remote/dbus/rb-client.c:83 ../shell/main.c:118
 msgid "Quit Rhythmbox"
 msgstr "Sair do Rhythmbox"
 
-#: ../remote/dbus/rb-client.c:84
+#: ../remote/dbus/rb-client.c:85
 msgid "Don't present an existing Rhythmbox window"
 msgstr "Não apresentar uma janela existente do Rhythmbox"
 
-#: ../remote/dbus/rb-client.c:85
+#: ../remote/dbus/rb-client.c:86
 msgid "Hide the Rhythmbox window"
 msgstr "Esconder a janela do Rhythmbox"
 
-#: ../remote/dbus/rb-client.c:87
+#: ../remote/dbus/rb-client.c:88
 msgid "Jump to next song"
 msgstr "Ir para a música seguinte"
 
-#: ../remote/dbus/rb-client.c:88
+#: ../remote/dbus/rb-client.c:89
 msgid "Jump to previous song"
 msgstr "Ir para a música anterior"
 
-#: ../remote/dbus/rb-client.c:90
+#: ../remote/dbus/rb-client.c:91
 msgid "Show notification of the playing song"
 msgstr "Apresentar informação sobre a música reproduzida"
 
-#: ../remote/dbus/rb-client.c:92
+#: ../remote/dbus/rb-client.c:93
 msgid "Resume playback if currently paused"
 msgstr "Continuar reprodução se actualmente em pausa"
 
-#: ../remote/dbus/rb-client.c:93
+#: ../remote/dbus/rb-client.c:94
 msgid "Pause playback if currently playing"
 msgstr "Pausar reprodução se actualmente em reprodução"
 
-#: ../remote/dbus/rb-client.c:94
+#: ../remote/dbus/rb-client.c:95
 msgid "Toggle play/pause mode"
 msgstr "Alternar o modo reprodução/pausa"
 
 #. { "stop", 0, 0, G_OPTION_ARG_NONE, &stop, N_("Stop playback"), NULL },
-#: ../remote/dbus/rb-client.c:97
+#: ../remote/dbus/rb-client.c:98
 msgid "Play a specified URI, importing it if necessary"
 msgstr "Reproduzir um URI especificado, imporanto-o se necessário"
 
-#: ../remote/dbus/rb-client.c:97
+#: ../remote/dbus/rb-client.c:98
 msgid "URI to play"
 msgstr "URI a reproduzir"
 
-#: ../remote/dbus/rb-client.c:98
+#: ../remote/dbus/rb-client.c:99
 msgid "Add specified tracks to the play queue"
 msgstr "Adicionar faixas especificadas à fila de reprodução"
 
-#: ../remote/dbus/rb-client.c:99
+#: ../remote/dbus/rb-client.c:100
 msgid "Empty the play queue before adding new tracks"
 msgstr "Esvaziar a fila de reprodução antes de adicionar novas faixas"
 
-#: ../remote/dbus/rb-client.c:101
+#: ../remote/dbus/rb-client.c:102
 msgid "Print the title and artist of the playing song"
 msgstr "Imprimir o título e o artista da música em reprodução"
 
-#: ../remote/dbus/rb-client.c:102
+#: ../remote/dbus/rb-client.c:103
 msgid "Print formatted details of the song"
 msgstr "Imprimir detalhes formatados da música"
 
-#: ../remote/dbus/rb-client.c:104
+#: ../remote/dbus/rb-client.c:105
 msgid "Set the playback volume"
 msgstr "Alterar volume de reprodução"
 
-#: ../remote/dbus/rb-client.c:105
+#: ../remote/dbus/rb-client.c:106
 msgid "Increase the playback volume"
 msgstr "Aumentar volume de reprodução"
 
-#: ../remote/dbus/rb-client.c:106
+#: ../remote/dbus/rb-client.c:107
 msgid "Decrease the playback volume"
 msgstr "Diminuir volume de reprodução"
 
-#: ../remote/dbus/rb-client.c:107
+#: ../remote/dbus/rb-client.c:108
 msgid "Print the current playback volume"
 msgstr "Apresentar volume de reprodução actual"
 
-#: ../remote/dbus/rb-client.c:108
+#: ../remote/dbus/rb-client.c:109
 msgid "Mute playback"
 msgstr "Silenciar reprodução"
 
-#: ../remote/dbus/rb-client.c:109
+#: ../remote/dbus/rb-client.c:110
 msgid "Unmute playback"
 msgstr "Sonorizar a reprodução"
 
-#: ../remote/dbus/rb-client.c:452 ../remote/dbus/rb-client.c:478
-#: ../shell/rb-shell.c:2158
-msgid "Not playing"
-msgstr "Parado"
+#: ../remote/dbus/rb-client.c:111
+msgid "Set the rating of the current song"
+msgstr "Definir a avaliação da música actual"
 
-#: ../remote/dbus/rb-client.c:706
+#: ../remote/dbus/rb-client.c:736
 #, c-format
 msgid "Playback is muted.\n"
 msgstr "Reprodução está silenciada.\n"
 
-#: ../remote/dbus/rb-client.c:707
+#: ../remote/dbus/rb-client.c:737
 #, c-format
 msgid "Playback volume is %f.\n"
 msgstr "Volume da reprodução é %f.\n"
 
 #: ../rhythmdb/rhythmdb-property-model.c:473
-#: ../sources/rb-auto-playlist-source.c:105 ../sources/rb-browser-source.c:175
-#: ../sources/rb-podcast-source.c:339
+#: ../sources/rb-auto-playlist-source.c:105 ../sources/rb-browser-source.c:173
+#: ../sources/rb-podcast-source.c:333
 #: ../sources/rb-static-playlist-source.c:110
 msgid "All"
 msgstr "Todos"
@@ -3316,13 +3507,13 @@ msgstr "Todos"
 #: ../rhythmdb/rhythmdb-tree.c:407
 #, c-format
 msgid ""
-"The database was created by a later version of rhythmbox.  This version of "
-"rhythmbox cannot read the database."
+"The database was created by a later version of Rhythmbox.  This version of "
+"Rhythmbox cannot read the database."
 msgstr ""
-"A base de dados foi criada por uma versão posterior do rhythmbox. Esta "
-"versão do rhythmbox é incapaz de ler a base de dados."
+"A base de dados foi criada por uma versão posterior do Rhythmbox.  Esta "
+"versão do Rhythmbox é incapaz de ler a base de dados."
 
-#: ../rhythmdb/rhythmdb.c:721
+#: ../rhythmdb/rhythmdb.c:751
 #, c-format
 msgid "Couldn't access %s: %s"
 msgstr "Incapaz de aceder a %s: %s"
@@ -3332,7 +3523,7 @@ msgstr "Incapaz de aceder a %s: %s"
 #. * a local artist name if desired.  Ensure the album name
 #. * and song title are also replaced in this case.
 #.
-#: ../rhythmdb/rhythmdb.c:1650
+#: ../rhythmdb/rhythmdb.c:1698
 msgid "The Beatles"
 msgstr "Xutos & Pontapés"
 
@@ -3340,7 +3531,7 @@ msgstr "Xutos & Pontapés"
 #. * example artist name is localised, this should be replaced
 #. * with the name of an album by that artist.
 #.
-#: ../rhythmdb/rhythmdb.c:1656
+#: ../rhythmdb/rhythmdb.c:1704
 msgid "Help!"
 msgstr "Circo de Feras"
 
@@ -3348,33 +3539,48 @@ msgstr "Circo de Feras"
 #. * artist and album names are localised, this should be replaced
 #. * with the name of the seventh song from the localised album.
 #.
-#: ../rhythmdb/rhythmdb.c:1662
+#: ../rhythmdb/rhythmdb.c:1710
 msgid "Ticket To Ride"
 msgstr "Não Sou o Único"
 
-#: ../rhythmdb/rhythmdb.c:2207
+#: ../rhythmdb/rhythmdb.c:2259
 msgid "invalid unicode in error message"
 msgstr "unicode inválido na mensagem de erro"
 
-#: ../rhythmdb/rhythmdb.c:3072
+#: ../rhythmdb/rhythmdb.c:2320
+#, c-format
+msgid "Empty file"
+msgstr "Ficheiro vazio"
+
+#. Translators: the parameter here is a list of GStreamer plugins.
+#. * The plugin names are already translated.
+#.
+#: ../rhythmdb/rhythmdb.c:2431
+#, c-format
+msgid "Additional GStreamer plugins are required to play this file: %s"
+msgstr ""
+"Plugins adicionais do GStreamer são necessários para reproduzir este "
+"ficheiro: %s"
+
+#: ../rhythmdb/rhythmdb.c:3191
 msgid "Could not load the music database:"
 msgstr "Incapaz de carregar base de dados de música:"
 
-#: ../rhythmdb/rhythmdb.c:4435
+#: ../rhythmdb/rhythmdb.c:4559
 #, c-format
 msgid "%ld minute"
 msgid_plural "%ld minutes"
 msgstr[0] "%ld minuto"
 msgstr[1] "%ld minutos"
 
-#: ../rhythmdb/rhythmdb.c:4436
+#: ../rhythmdb/rhythmdb.c:4560
 #, c-format
 msgid "%ld hour"
 msgid_plural "%ld hours"
 msgstr[0] "%ld hora"
 msgstr[1] "%ld horas"
 
-#: ../rhythmdb/rhythmdb.c:4437
+#: ../rhythmdb/rhythmdb.c:4561
 #, c-format
 msgid "%ld day"
 msgid_plural "%ld days"
@@ -3382,7 +3588,7 @@ msgstr[0] "%ld dia"
 msgstr[1] "%ld dias"
 
 #. Translators: the format is "X days, X hours and X minutes"
-#: ../rhythmdb/rhythmdb.c:4443
+#: ../rhythmdb/rhythmdb.c:4567
 #, c-format
 msgid "%s, %s and %s"
 msgstr "%s, %s e %s"
@@ -3390,48 +3596,54 @@ msgstr "%s, %s e %s"
 #. Translators: the format is "X days and X hours"
 #. Translators: the format is "X days and X minutes"
 #. Translators: the format is "X hours and X minutes"
-#: ../rhythmdb/rhythmdb.c:4449 ../rhythmdb/rhythmdb.c:4457
-#: ../rhythmdb/rhythmdb.c:4468
+#: ../rhythmdb/rhythmdb.c:4573 ../rhythmdb/rhythmdb.c:4581
+#: ../rhythmdb/rhythmdb.c:4592
 #, c-format
 msgid "%s and %s"
 msgstr "%s e %s"
 
-#: ../shell/main.c:114
+#: ../shell/main.c:111
 msgid "Enable debug output"
 msgstr "Activar a depuração do resultado"
 
-#: ../shell/main.c:115
+#: ../shell/main.c:112
 msgid "Enable debug output matching a specified string"
 msgstr ""
 "Activar a depuração do resultado correspondendo a uma determinada expressão"
 
-#: ../shell/main.c:116
+#: ../shell/main.c:113
 msgid "Do not update the library with file changes"
 msgstr "Não actualizar a biblioteca com alteração de ficheiros"
 
-#: ../shell/main.c:117
+#: ../shell/main.c:114
 msgid "Do not register the shell"
 msgstr "Não registar a consola"
 
-#: ../shell/main.c:118
+#: ../shell/main.c:115
 msgid "Don't save any data permanently (implies --no-registration)"
 msgstr "Não gravar permanentemente quaisquer dados (implica --no-registration)"
 
-#: ../shell/main.c:119
+#: ../shell/main.c:116
 msgid "Path for database file to use"
 msgstr "Caminho para o ficheiro de base de dados a utilizar"
 
-#: ../shell/main.c:120
+#: ../shell/main.c:117
 msgid "Path for playlists file to use"
 msgstr "Caminho para o ficheiro de listas de reprodução a utilizar"
 
-#: ../shell/main.c:122
+#: ../shell/main.c:119
 msgid "[URI...]"
 msgstr "[URI...]"
 
-#: ../shell/main.c:147 ../shell/main.c:153 ../shell/main.c:162
-msgid "Rhythmbox"
-msgstr "Rhythmbox"
+#: ../shell/main.c:149
+#, c-format
+msgid ""
+"%s\n"
+"Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"%s\n"
+"Corra '%s --help' para ver uma lista completa das opções de linha de "
+"comandos disponíveis.\n"
 
 #: ../shell/rb-playlist-manager.c:161
 msgid "MPEG Version 3.0 URL"
@@ -3536,7 +3748,7 @@ msgstr "Todos os Ficheiros"
 msgid "Load Playlist"
 msgstr "Carregar a Lista de Reprodução"
 
-#: ../shell/rb-playlist-manager.c:1463 ../sources/rb-playlist-source.c:630
+#: ../shell/rb-playlist-manager.c:1463 ../sources/rb-playlist-source.c:631
 msgid "Couldn't save playlist"
 msgstr "Incapaz de gravar a lista de reprodução"
 
@@ -3560,41 +3772,58 @@ msgstr "Lista de reprodução desconhecida: %s"
 msgid "Playlist %s is an automatic playlist"
 msgstr "Lista de reprodução %s é uma lista de reprodução automática"
 
-#: ../shell/rb-removable-media-manager.c:153
+#: ../shell/rb-plugin-manager.c:54
+msgid "Plugin"
+msgstr "Plugin"
+
+#: ../shell/rb-plugin-manager.c:55
+msgid "Enabled"
+msgstr "Activo"
+
+#: ../shell/rb-plugins-engine.c:556
+msgid "Plugin Error"
+msgstr "Erro do Plugin"
+
+#: ../shell/rb-plugins-engine.c:556
+#, c-format
+msgid "Unable to activate plugin %s"
+msgstr "Incapaz de activar o plugin %s"
+
+#: ../shell/rb-removable-media-manager.c:166
 msgid "Eject this medium"
 msgstr "Ejectar este media"
 
-#: ../shell/rb-removable-media-manager.c:155
+#: ../shell/rb-removable-media-manager.c:168
 msgid "_Extract to Library"
 msgstr "_Extrair para Biblioteca"
 
-#: ../shell/rb-removable-media-manager.c:156
+#: ../shell/rb-removable-media-manager.c:169
 msgid "Copy all tracks to the library"
 msgstr "Copiar todas as faixas para a biblioteca"
 
-#: ../shell/rb-removable-media-manager.c:158
+#: ../shell/rb-removable-media-manager.c:171
 msgid "_Scan Removable Media"
 msgstr "Pe_squisar Media Removível"
 
-#: ../shell/rb-removable-media-manager.c:159
+#: ../shell/rb-removable-media-manager.c:172
 msgid "Scan for new Removable Media"
 msgstr "Procurar por novos Media Removíveis"
 
 #. Translators: this is the toolbar button label
 #. for Copy to Library action.
-#: ../shell/rb-removable-media-manager.c:725
+#: ../shell/rb-removable-media-manager.c:837
 msgid "Extract"
 msgstr "Extrair"
 
-#: ../shell/rb-removable-media-manager.c:756
+#: ../shell/rb-removable-media-manager.c:868
 msgid "Unable to eject"
 msgstr "Incapaz de ejectar"
 
-#: ../shell/rb-removable-media-manager.c:777
+#: ../shell/rb-removable-media-manager.c:889
 msgid "Unable to unmount"
 msgstr "Incapaz de desmontar"
 
-#: ../shell/rb-removable-media-manager.c:978
+#: ../shell/rb-removable-media-manager.c:1100
 msgid "Error transferring track"
 msgstr "Erro ao transferir faixa"
 
@@ -3682,364 +3911,350 @@ msgstr "Pr_opriedades"
 msgid "Show information on the selected song"
 msgstr "Apresentar informação sobre a música seleccionada"
 
-#: ../shell/rb-shell-player.c:318
+#: ../shell/rb-shell-player.c:309
 msgid "Pre_vious"
 msgstr "An_terior"
 
-#: ../shell/rb-shell-player.c:319
+#: ../shell/rb-shell-player.c:310
 msgid "Start playing the previous song"
 msgstr "Iniciar a reprodução da música anterior"
 
-#: ../shell/rb-shell-player.c:321
+#: ../shell/rb-shell-player.c:312
 msgid "_Next"
 msgstr "_Seguinte"
 
-#: ../shell/rb-shell-player.c:322
+#: ../shell/rb-shell-player.c:313
 msgid "Start playing the next song"
 msgstr "Iniciar a reprodução da música seguinte"
 
-#: ../shell/rb-shell-player.c:324
+#: ../shell/rb-shell-player.c:315
 msgid "_Increase Volume"
 msgstr "_Aumentar Volume"
 
-#: ../shell/rb-shell-player.c:325
+#: ../shell/rb-shell-player.c:316
 msgid "Increase playback volume"
 msgstr "Aumentar volume de reprodução"
 
-#: ../shell/rb-shell-player.c:327
+#: ../shell/rb-shell-player.c:318
 msgid "_Decrease Volume"
 msgstr "_Diminuir Volume"
 
-#: ../shell/rb-shell-player.c:328
+#: ../shell/rb-shell-player.c:319
 msgid "Decrease playback volume"
 msgstr "Diminuir volume de reprodução"
 
-#: ../shell/rb-shell-player.c:335
+#: ../shell/rb-shell-player.c:326
 msgid "_Play"
 msgstr "_Reproduzir"
 
-#: ../shell/rb-shell-player.c:336 ../shell/rb-shell-player.c:3807
+#: ../shell/rb-shell-player.c:327 ../shell/rb-shell-player.c:3732
 msgid "Start playback"
 msgstr "Iniciar a reprodução"
 
-#: ../shell/rb-shell-player.c:338
+#: ../shell/rb-shell-player.c:329
 msgid "Sh_uffle"
 msgstr "Baral_har"
 
-#: ../shell/rb-shell-player.c:339
+#: ../shell/rb-shell-player.c:330
 msgid "Play songs in a random order"
 msgstr "Reproduzir as músicas aleatoriamente"
 
-#: ../shell/rb-shell-player.c:341
+#: ../shell/rb-shell-player.c:332
 msgid "_Repeat"
 msgstr "_Repetir"
 
-#: ../shell/rb-shell-player.c:342
+#: ../shell/rb-shell-player.c:333
 msgid "Play first song again after all songs are played"
 msgstr "Reproduzir novamente a primeira música após ter reproduzido todas"
 
-#: ../shell/rb-shell-player.c:344
+#: ../shell/rb-shell-player.c:335
 msgid "_Song Position Slider"
 msgstr "Barra Deslizante de Posição da Mú_sica"
 
-#: ../shell/rb-shell-player.c:345
+#: ../shell/rb-shell-player.c:336
 msgid "Change the visibility of the song position slider"
 msgstr "Alterar a visibilidade da barra deslizante da posição da música"
 
-#: ../shell/rb-shell-player.c:814
+#: ../shell/rb-shell-player.c:788
 msgid "Stream error"
 msgstr "Erro de fluxo"
 
-#: ../shell/rb-shell-player.c:815
+#: ../shell/rb-shell-player.c:789
 msgid "Unexpected end of stream!"
 msgstr "Fim inesperado do fluxo!"
 
-#: ../shell/rb-shell-player.c:945
+#: ../shell/rb-shell-player.c:921
 msgid "Linear"
 msgstr "Linear"
 
-#: ../shell/rb-shell-player.c:947
+#: ../shell/rb-shell-player.c:923
 msgid "Linear looping"
 msgstr "Ciclo linear"
 
-#: ../shell/rb-shell-player.c:949
+#: ../shell/rb-shell-player.c:925
 msgid "Shuffle"
 msgstr "Baralhar"
 
-#: ../shell/rb-shell-player.c:951
+#: ../shell/rb-shell-player.c:927
 msgid "Random with equal weights"
 msgstr "Aleatório com pesos iguais"
 
-#: ../shell/rb-shell-player.c:953
+#: ../shell/rb-shell-player.c:929
 msgid "Random by time since last play"
 msgstr "Aleatório por tempo decorrido desde a última reprodução"
 
-#: ../shell/rb-shell-player.c:955
+#: ../shell/rb-shell-player.c:931
 msgid "Random by rating"
 msgstr "Aleatório por classificação"
 
-#: ../shell/rb-shell-player.c:957
+#: ../shell/rb-shell-player.c:933
 msgid "Random by time since last play and rating"
 msgstr ""
 "Aleatório por tempo decorrido desde a última reprodução e classificação"
 
-#: ../shell/rb-shell-player.c:959
+#: ../shell/rb-shell-player.c:935
 msgid "Linear, removing entries once played"
 msgstr "Linear, removendo registos assim que tocados"
 
-#: ../shell/rb-shell-player.c:969
+#: ../shell/rb-shell-player.c:945
 #, c-format
 msgid "Failed to create the player: %s"
 msgstr "Falha ao criar o reprodutor: %s"
 
-#: ../shell/rb-shell-player.c:1526
+#: ../shell/rb-shell-player.c:1491
 #, c-format
 msgid "Playlist was empty"
 msgstr "Lista de Reprodução vazia"
 
-#: ../shell/rb-shell-player.c:2033
+#: ../shell/rb-shell-player.c:1980
 #, c-format
 msgid "Not currently playing"
 msgstr "Parado de momento"
 
-#: ../shell/rb-shell-player.c:2091
+#: ../shell/rb-shell-player.c:2038
 #, c-format
 msgid "No previous song"
 msgstr "Sem música anterior"
 
-#: ../shell/rb-shell-player.c:2191
+#: ../shell/rb-shell-player.c:2138
 #, c-format
 msgid "No next song"
 msgstr "Sem música seguinte"
 
-#: ../shell/rb-shell-player.c:2312 ../shell/rb-shell-player.c:3438
+#: ../shell/rb-shell-player.c:2259 ../shell/rb-shell-player.c:3383
 msgid "Couldn't start playback"
 msgstr "Incapaz de iniciar a reprodução"
 
-#: ../shell/rb-shell-player.c:3194
+#: ../shell/rb-shell-player.c:3145
 msgid "Couldn't stop playback"
 msgstr "Incapaz de parar a reprodução"
 
-#: ../shell/rb-shell-player.c:3310
+#: ../shell/rb-shell-player.c:3255
 #, c-format
 msgid "Playback position not available"
 msgstr "Posição da reprodução não disponível"
 
-#: ../shell/rb-shell-player.c:3342
+#: ../shell/rb-shell-player.c:3287
 #, c-format
 msgid "Current song is not seekable"
 msgstr "Incapaz de procurar a música actual"
 
-#: ../shell/rb-shell-player.c:3805
+#: ../shell/rb-shell-player.c:3730
 msgid "Stop playback"
 msgstr "Parar a reprodução"
 
-#: ../shell/rb-shell-preferences.c:171 ../shell/rb-shell.c:2394
+#: ../shell/rb-shell-preferences.c:167 ../shell/rb-shell.c:2193
 msgid "Couldn't display help"
 msgstr "Incapaz de apresentar a ajuda"
 
-#: ../shell/rb-shell-preferences.c:206
+#: ../shell/rb-shell-preferences.c:202
 msgid "Music Player Preferences"
 msgstr "Preferências de Reprodução Musical"
 
-#: ../shell/rb-shell-preferences.c:261
+#: ../shell/rb-shell-preferences.c:255
 msgid "General"
 msgstr "Genérico"
 
-#: ../shell/rb-shell-preferences.c:320
+#: ../shell/rb-shell-preferences.c:304
 msgid "Playback"
 msgstr "Reprodução"
 
-#: ../shell/rb-shell.c:419
+#: ../shell/rb-shell.c:389
 msgid "_Music"
 msgstr "_Música"
 
-#: ../shell/rb-shell.c:421
+#: ../shell/rb-shell.c:391
 msgid "_View"
 msgstr "_Ver"
 
-#: ../shell/rb-shell.c:422
+#: ../shell/rb-shell.c:392
 msgid "_Control"
 msgstr "_Controlo"
 
-#: ../shell/rb-shell.c:423
+#: ../shell/rb-shell.c:393
 msgid "_Tools"
 msgstr "_Ferramentas"
 
-#: ../shell/rb-shell.c:424
+#: ../shell/rb-shell.c:394
 msgid "_Help"
 msgstr "_Ajuda"
 
-#: ../shell/rb-shell.c:426
+#: ../shell/rb-shell.c:396
 msgid "_Import Folder..."
 msgstr "_Importar uma Pasta..."
 
-#: ../shell/rb-shell.c:427
+#: ../shell/rb-shell.c:397
 msgid "Choose folder to be added to the Library"
 msgstr "Seleccione a pasta a ser adicionada à Biblioteca"
 
-#: ../shell/rb-shell.c:429
+#: ../shell/rb-shell.c:399
 msgid "Import _File..."
 msgstr "Importar um _Ficheiro..."
 
-#: ../shell/rb-shell.c:430
+#: ../shell/rb-shell.c:400
 msgid "Choose file to be added to the Library"
 msgstr "Seleccione o ficheiro a ser adicionado à Biblioteca"
 
-#: ../shell/rb-shell.c:432
+#: ../shell/rb-shell.c:402
 msgid "_About"
 msgstr "_Sobre"
 
-#: ../shell/rb-shell.c:433
+#: ../shell/rb-shell.c:403
 msgid "Show information about the music player"
 msgstr "Apresentar informação sobre o reprodutor de música"
 
-#: ../shell/rb-shell.c:435
+#: ../shell/rb-shell.c:405
 msgid "_Contents"
 msgstr "_Conteúdo"
 
-#: ../shell/rb-shell.c:436
+#: ../shell/rb-shell.c:406
 msgid "Display music player help"
 msgstr "Apresentar a ajuda do reprodutor de música"
 
-#: ../shell/rb-shell.c:438
-msgid "_Close"
-msgstr "_Fechar"
-
-#: ../shell/rb-shell.c:439
-msgid "Hide the music player window"
-msgstr "Esconder a janela do reprodutor de música"
-
-#: ../shell/rb-shell.c:441
+#: ../shell/rb-shell.c:408
 msgid "_Quit"
 msgstr "_Sair"
 
-#: ../shell/rb-shell.c:442
+#: ../shell/rb-shell.c:409
 msgid "Quit the music player"
 msgstr "Sair do reprodutor de música"
 
-#: ../shell/rb-shell.c:444
+#: ../shell/rb-shell.c:411
 msgid "Prefere_nces"
 msgstr "Preferê_ncias"
 
-#: ../shell/rb-shell.c:445
+#: ../shell/rb-shell.c:412
 msgid "Edit music player preferences"
 msgstr "Editar as preferências da reprodução musical"
 
-#: ../shell/rb-shell.c:447
+#: ../shell/rb-shell.c:414
 msgid "Plu_gins"
 msgstr "Plu_gins"
 
-#: ../shell/rb-shell.c:448
+#: ../shell/rb-shell.c:415
 msgid "Change and configure plugins"
 msgstr "Alterar e configurar plugins"
 
-#: ../shell/rb-shell.c:450
+#: ../shell/rb-shell.c:417
 msgid "Show _All Tracks"
 msgstr "Apresentar _Todas as Faixas"
 
-#: ../shell/rb-shell.c:451
+#: ../shell/rb-shell.c:418
 msgid "Show all tracks in this music source"
 msgstr "Apresentar todos as faixas nesta origem de música"
 
-#: ../shell/rb-shell.c:453
+#: ../shell/rb-shell.c:420
 msgid "_Jump to Playing Song"
 msgstr "_Ir Para Música em Reprodução"
 
-#: ../shell/rb-shell.c:454
+#: ../shell/rb-shell.c:421
 msgid "Scroll the view to the currently playing song"
 msgstr "Rolar a vista para a canção actualmente em reprodução"
 
-#: ../shell/rb-shell.c:461
+#: ../shell/rb-shell.c:428
 msgid "Side _Pane"
 msgstr "_Painel Lateral"
 
-#: ../shell/rb-shell.c:462
+#: ../shell/rb-shell.c:429
 msgid "Change the visibility of the side pane"
 msgstr "Alterar a visibilidade do painel lateral"
 
-#: ../shell/rb-shell.c:464
+#: ../shell/rb-shell.c:431
 msgid "T_oolbar"
 msgstr "Barra de Ferra_mentas"
 
-#: ../shell/rb-shell.c:465
+#: ../shell/rb-shell.c:432
 msgid "Change the visibility of the toolbar"
 msgstr "Alterar a visibilidade da barra de ferramentas"
 
-#: ../shell/rb-shell.c:467
+#: ../shell/rb-shell.c:434
 msgid "_Small Display"
 msgstr "Apresentação _Reduzida"
 
-#: ../shell/rb-shell.c:468
+#: ../shell/rb-shell.c:435
 msgid "Make the main window smaller"
 msgstr "Tornar a janela principal mais pequena"
 
-#: ../shell/rb-shell.c:470
+#: ../shell/rb-shell.c:437
 msgid "Party _Mode"
 msgstr "_Modo de Festa"
 
-#: ../shell/rb-shell.c:471
+#: ../shell/rb-shell.c:438
 msgid "Change the status of the party mode"
 msgstr "Alterar o estado do modo de festa"
 
-#: ../shell/rb-shell.c:473
+#: ../shell/rb-shell.c:440
 msgid "Play _Queue as Side Pane"
 msgstr "_Fila de Reprodução como Painel Lateral"
 
-#: ../shell/rb-shell.c:474
+#: ../shell/rb-shell.c:441
 msgid "Change whether the queue is visible as a source or a sidebar"
 msgstr ""
 "Alterar a visibilidade da fila como uma fonte ou como uma barra lateral"
 
-#: ../shell/rb-shell.c:476
+#: ../shell/rb-shell.c:443
 msgid "S_tatusbar"
 msgstr "Barra de Es_tado"
 
-#: ../shell/rb-shell.c:477
+#: ../shell/rb-shell.c:444
 msgid "Change the visibility of the statusbar"
 msgstr "Alterar a visibilidade da barra de estado"
 
-#: ../shell/rb-shell.c:1008 ../shell/rb-shell.c:1225
+#: ../shell/rb-shell.c:985 ../shell/rb-shell.c:1208
 msgid "Unable to move user data files"
 msgstr "Incapaz de mover ficheiros de dados do utilizador"
 
-#: ../shell/rb-shell.c:1311
+#: ../shell/rb-shell.c:1294
 msgid "Change the music volume"
 msgstr "Alterar o volume da música"
 
-#: ../shell/rb-shell.c:1783
+#: ../shell/rb-shell.c:1701
 msgid "Error while saving song information"
 msgstr "Erro ao gravar informação da música"
 
-#: ../shell/rb-shell.c:1932
+#: ../shell/rb-shell.c:1806
 #, c-format
 msgid "Transferring track %d out of %d (%.0f%%)"
 msgstr "Transferindo faixa %d de %d (%.0f%%)"
 
-#: ../shell/rb-shell.c:1935
+#: ../shell/rb-shell.c:1809
 #, c-format
 msgid "Transferring track %d out of %d"
 msgstr "Transferindo faixa %d de %d"
 
-#. Translators: the %s is the elapsed and total time
-#: ../shell/rb-shell.c:2161
-#, c-format
-msgid "Paused, %s"
-msgstr "Pausado, %s"
-
 #. Translators: %s is the song name
-#: ../shell/rb-shell.c:2203
+#: ../shell/rb-shell.c:2009
 #, c-format
 msgid "%s (Paused)"
 msgstr "%s (Pausado)"
 
-#: ../shell/rb-shell.c:2307
+#: ../shell/rb-shell.c:2113
 msgid "translator-credits"
 msgstr ""
 "Filipe Gomes <filipefgomes@gmail.com>\n"
 "Duarte Loreto <happyguy_pt@hotmail.com>"
 
-#: ../shell/rb-shell.c:2310
+#: ../shell/rb-shell.c:2116
 msgid ""
 "Rhythmbox is free software; you can redistribute it and/or modify\n"
 "it under the terms of the GNU General Public License as published by\n"
@@ -4051,7 +4266,7 @@ msgstr ""
 "Free Software Foundation; tanto a versão 2 da licensa, ou (à sua\n"
 "opção) qualquer outra versão posterior.\n"
 
-#: ../shell/rb-shell.c:2314
+#: ../shell/rb-shell.c:2120
 msgid ""
 "Rhythmbox is distributed in the hope that it will be useful,\n"
 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
@@ -4063,7 +4278,7 @@ msgstr ""
 "NEGOCIABILIDADE ou APTIDÃO PARA UM  PROPÓSITO ESPECIFICO. Consulte\n"
 "a GNU General Public License para mais detalhes.\n"
 
-#: ../shell/rb-shell.c:2318
+#: ../shell/rb-shell.c:2124
 msgid ""
 "You should have received a copy of the GNU General Public License\n"
 "along with Rhythmbox; if not, write to the Free Software Foundation, Inc.,\n"
@@ -4074,66 +4289,54 @@ msgstr ""
 "Inc.,\n"
 "51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA\n"
 
-#: ../shell/rb-shell.c:2325
+#: ../shell/rb-shell.c:2131
 msgid "Maintainers:"
 msgstr "Coordenadores:"
 
-#: ../shell/rb-shell.c:2328
+#: ../shell/rb-shell.c:2134
 msgid "Former Maintainers:"
 msgstr "Coordenadores Anteriores:"
 
-#: ../shell/rb-shell.c:2331
+#: ../shell/rb-shell.c:2137
 msgid "Contributors:"
 msgstr "Contribuintes:"
 
-#: ../shell/rb-shell.c:2333
+#: ../shell/rb-shell.c:2139
 msgid "Music management and playback software for GNOME."
 msgstr "Aplicação de gestão de músicas e reprodução para o GNOME."
 
-#: ../shell/rb-shell.c:2342
+#: ../shell/rb-shell.c:2148
 msgid "Rhythmbox Website"
 msgstr "Página Web Rhythmbox"
 
-#: ../shell/rb-shell.c:2441
+#: ../shell/rb-shell.c:2240
 msgid "Configure Plugins"
 msgstr "Configurar Plugins"
 
-#: ../shell/rb-shell.c:2512
+#: ../shell/rb-shell.c:2311
 msgid "Import Folder into Library"
 msgstr "Importar Pasta para a Biblioteca"
 
-#: ../shell/rb-shell.c:2534
+#: ../shell/rb-shell.c:2333
 msgid "Import File into Library"
 msgstr "Importar Ficheiro para a Biblioteca"
 
-#. Translators: by Artist
-#: ../shell/rb-shell.c:3049
-#, c-format
-msgid "by <i>%s</i>"
-msgstr "por <i>%s</i>"
-
-#. Translators: from Album
-#: ../shell/rb-shell.c:3070
-#, c-format
-msgid "from <i>%s</i>"
-msgstr "de <i>%s</i>"
-
-#: ../shell/rb-shell.c:3278
+#: ../shell/rb-shell.c:2873
 #, c-format
 msgid "No registered source can handle URI %s"
 msgstr "Nenhuma fonte registada consegue manipular o URI %s"
 
-#: ../shell/rb-shell.c:3547 ../shell/rb-shell.c:3576
+#: ../shell/rb-shell.c:3143 ../shell/rb-shell.c:3172
 #, c-format
 msgid "Unknown song URI: %s"
 msgstr "URI da música desconhecido: %s"
 
-#: ../shell/rb-shell.c:3585
+#: ../shell/rb-shell.c:3181
 #, c-format
 msgid "Unknown property %s"
 msgstr "Propriedade desconhecida %s"
 
-#: ../shell/rb-shell.c:3595
+#: ../shell/rb-shell.c:3191
 #, c-format
 msgid "Invalid property type %s for property %s"
 msgstr "Tipo de propriedade inválido %s para propriedade %s"
@@ -4154,79 +4357,63 @@ msgstr "Filtrar a apresentação de músicas por género, artista, álbum ou tí
 msgid "Loading..."
 msgstr "A ler..."
 
-#: ../shell/rb-tray-icon.c:160
-msgid "_Show Music Player"
-msgstr "_Mostrar Reprodutor de Música"
-
-#: ../shell/rb-tray-icon.c:161
-msgid "Choose music to play"
-msgstr "Escolher música a reproduzir"
-
-#: ../shell/rb-tray-icon.c:163
-msgid "Show N_otifications"
-msgstr "Mostrar N_otificações"
-
-#: ../shell/rb-tray-icon.c:164
-msgid "Show notifications of song changes and other events"
-msgstr "Mostrar notificações de mudança de músicas e outros eventos"
-
-#: ../sources/rb-auto-playlist-source.c:105 ../sources/rb-browser-source.c:175
-#: ../sources/rb-podcast-source.c:339
+#: ../sources/rb-auto-playlist-source.c:105 ../sources/rb-browser-source.c:173
+#: ../sources/rb-podcast-source.c:333
 #: ../sources/rb-static-playlist-source.c:110
 msgid "Search all fields"
 msgstr "Procurar todos os campos"
 
-#: ../sources/rb-auto-playlist-source.c:106 ../sources/rb-browser-source.c:176
+#: ../sources/rb-auto-playlist-source.c:106 ../sources/rb-browser-source.c:174
 #: ../sources/rb-static-playlist-source.c:111
 msgid "Artists"
 msgstr "Artistas"
 
-#: ../sources/rb-auto-playlist-source.c:106 ../sources/rb-browser-source.c:176
+#: ../sources/rb-auto-playlist-source.c:106 ../sources/rb-browser-source.c:174
 #: ../sources/rb-static-playlist-source.c:111
 msgid "Search artists"
 msgstr "Procurar artistas"
 
-#: ../sources/rb-auto-playlist-source.c:107 ../sources/rb-browser-source.c:177
+#: ../sources/rb-auto-playlist-source.c:107 ../sources/rb-browser-source.c:175
 #: ../sources/rb-static-playlist-source.c:112
 msgid "Albums"
 msgstr "Álbuns"
 
-#: ../sources/rb-auto-playlist-source.c:107 ../sources/rb-browser-source.c:177
+#: ../sources/rb-auto-playlist-source.c:107 ../sources/rb-browser-source.c:175
 #: ../sources/rb-static-playlist-source.c:112
 msgid "Search albums"
 msgstr "Procurar álbuns"
 
-#: ../sources/rb-auto-playlist-source.c:108 ../sources/rb-browser-source.c:178
+#: ../sources/rb-auto-playlist-source.c:108 ../sources/rb-browser-source.c:176
 #: ../sources/rb-static-playlist-source.c:113
 msgid "Titles"
 msgstr "Títulos"
 
-#: ../sources/rb-auto-playlist-source.c:108 ../sources/rb-browser-source.c:178
+#: ../sources/rb-auto-playlist-source.c:108 ../sources/rb-browser-source.c:176
 #: ../sources/rb-static-playlist-source.c:113
 msgid "Search titles"
 msgstr "Procurar títulos"
 
-#: ../sources/rb-browser-source.c:162
+#: ../sources/rb-browser-source.c:160
 msgid "Browse This _Genre"
 msgstr "Navegar neste _Género"
 
-#: ../sources/rb-browser-source.c:163
+#: ../sources/rb-browser-source.c:161
 msgid "Set the browser to view only this genre"
 msgstr "Definir o navegador para apresentar apenas este género"
 
-#: ../sources/rb-browser-source.c:165
+#: ../sources/rb-browser-source.c:163
 msgid "Browse This _Artist"
 msgstr "Navegar neste _Artista"
 
-#: ../sources/rb-browser-source.c:166
+#: ../sources/rb-browser-source.c:164
 msgid "Set the browser to view only this artist"
 msgstr "Definir o navegador para apresentar apenas este artista"
 
-#: ../sources/rb-browser-source.c:168
+#: ../sources/rb-browser-source.c:166
 msgid "Browse This A_lbum"
 msgstr "Navegar neste Ál_bum"
 
-#: ../sources/rb-browser-source.c:169
+#: ../sources/rb-browser-source.c:167
 msgid "Set the browser to view only this album"
 msgstr "Definir o navegador para apresentar apenas este álbum"
 
@@ -4253,7 +4440,7 @@ msgstr "Artista/Álbum"
 msgid "Artist - Album"
 msgstr "Artista - Álbum"
 
-#: ../sources/rb-library-source.c:140 ../widgets/rb-entry-view.c:1445
+#: ../sources/rb-library-source.c:140 ../widgets/rb-entry-view.c:1496
 #: ../widgets/rb-library-browser.c:144
 #: ../widgets/rb-query-creator-properties.c:77
 #: ../widgets/rb-query-creator-properties.c:103
@@ -4288,11 +4475,11 @@ msgstr "Música"
 msgid "Choose Library Location"
 msgstr "Escolher Localização da Biblioteca"
 
-#: ../sources/rb-library-source.c:601
+#: ../sources/rb-library-source.c:599
 msgid "Multiple locations set"
 msgstr "Localizações Múltiplas definidas"
 
-#: ../sources/rb-library-source.c:996
+#: ../sources/rb-library-source.c:1008
 msgid "Example Path:"
 msgstr "Caminho de Exemplo:"
 
@@ -4341,117 +4528,117 @@ msgstr "de"
 msgid "by"
 msgstr "por"
 
-#: ../sources/rb-podcast-source.c:313
+#: ../sources/rb-podcast-source.c:307
 msgid "_New Podcast Feed..."
 msgstr "_Nova Fonte de Podcast..."
 
-#: ../sources/rb-podcast-source.c:314
+#: ../sources/rb-podcast-source.c:308
 msgid "Subscribe to a new Podcast Feed"
 msgstr "Subscrever uma nova Fonte de Podcast"
 
-#: ../sources/rb-podcast-source.c:317
+#: ../sources/rb-podcast-source.c:311
 msgid "Download _Episode"
 msgstr "Transferir _Episódio"
 
-#: ../sources/rb-podcast-source.c:318
+#: ../sources/rb-podcast-source.c:312
 msgid "Download Podcast Episode"
 msgstr "Transferir Episódio do Podcast"
 
-#: ../sources/rb-podcast-source.c:320
+#: ../sources/rb-podcast-source.c:314
 msgid "_Cancel Download"
 msgstr "_Cancelar Transferência"
 
-#: ../sources/rb-podcast-source.c:321
+#: ../sources/rb-podcast-source.c:315
 msgid "Cancel Episode Download"
 msgstr "Cancelar Transferência do Episódio"
 
-#: ../sources/rb-podcast-source.c:324
+#: ../sources/rb-podcast-source.c:318
 msgid "Episode Properties"
 msgstr "Propriedades do Episódio"
 
-#: ../sources/rb-podcast-source.c:326
+#: ../sources/rb-podcast-source.c:320
 msgid "_Update Podcast Feed"
 msgstr "_Actualizar Fonte do Podcast"
 
-#: ../sources/rb-podcast-source.c:327
+#: ../sources/rb-podcast-source.c:321
 msgid "Update Feed"
 msgstr "Actualizar Fonte"
 
-#: ../sources/rb-podcast-source.c:329
+#: ../sources/rb-podcast-source.c:323
 msgid "_Delete Podcast Feed"
 msgstr "_Apagar Fonte do Podcast"
 
-#: ../sources/rb-podcast-source.c:330
+#: ../sources/rb-podcast-source.c:324
 msgid "Delete Feed"
 msgstr "Apagar Fonte"
 
-#: ../sources/rb-podcast-source.c:332
+#: ../sources/rb-podcast-source.c:326
 msgid "_Update All Feeds"
 msgstr "_Actualizar Todas as Fontes"
 
-#: ../sources/rb-podcast-source.c:333
+#: ../sources/rb-podcast-source.c:327
 msgid "Update all feeds"
 msgstr "Actualizar todas as fontes"
 
-#: ../sources/rb-podcast-source.c:340
+#: ../sources/rb-podcast-source.c:334
 msgid "Feeds"
 msgstr "Fontes"
 
-#: ../sources/rb-podcast-source.c:340
+#: ../sources/rb-podcast-source.c:334
 msgid "Search podcast feeds"
 msgstr "Procurar fontes de podcast"
 
-#: ../sources/rb-podcast-source.c:341
+#: ../sources/rb-podcast-source.c:335
 msgid "Episodes"
 msgstr "Episódios"
 
-#: ../sources/rb-podcast-source.c:341
+#: ../sources/rb-podcast-source.c:335
 msgid "Search podcast episodes"
 msgstr "Procurar episódios de podcast"
 
 #. Translators: this is the toolbar button label
 #. for New Podcast Feed action.
-#. Don't include the prefix "podcast|" in the translation.
-#: ../sources/rb-podcast-source.c:539
-msgid "podcast|New"
+#: ../sources/rb-podcast-source.c:528
+msgctxt "Podcast"
+msgid "New"
 msgstr "Novo"
 
 #. Translators: this is the toolbar button label
 #. for Update All Feeds action.
-#: ../sources/rb-podcast-source.c:545
+#: ../sources/rb-podcast-source.c:534
 msgid "Update"
 msgstr "Actualizar"
 
-#: ../sources/rb-podcast-source.c:589 ../sources/rb-podcast-source.c:600
+#: ../sources/rb-podcast-source.c:578 ../sources/rb-podcast-source.c:589
 msgid "Date"
 msgstr "Data"
 
-#: ../sources/rb-podcast-source.c:621 ../sources/rb-podcast-source.c:689
-#: ../sources/rb-podcast-source.c:743
+#: ../sources/rb-podcast-source.c:610 ../sources/rb-podcast-source.c:678
+#: ../sources/rb-podcast-source.c:732
 msgid "Feed"
 msgstr "Fonte"
 
-#: ../sources/rb-podcast-source.c:640 ../sources/rb-podcast-source.c:658
+#: ../sources/rb-podcast-source.c:629 ../sources/rb-podcast-source.c:647
 msgid "Status"
 msgstr "Estado"
 
-#: ../sources/rb-podcast-source.c:641 ../sources/rb-podcast-source.c:1493
+#: ../sources/rb-podcast-source.c:630 ../sources/rb-podcast-source.c:1482
 msgid "Downloaded"
 msgstr "Transferido"
 
-#: ../sources/rb-podcast-source.c:642 ../sources/rb-podcast-source.c:1501
+#: ../sources/rb-podcast-source.c:631 ../sources/rb-podcast-source.c:1490
 msgid "Waiting"
 msgstr "Em Espera"
 
-#: ../sources/rb-podcast-source.c:643 ../sources/rb-podcast-source.c:1497
+#: ../sources/rb-podcast-source.c:632 ../sources/rb-podcast-source.c:1486
 msgid "Failed"
 msgstr "Falhou"
 
-#: ../sources/rb-podcast-source.c:930
+#: ../sources/rb-podcast-source.c:919
 msgid "Delete the podcast episode and downloaded file?"
 msgstr "Apagar o episódio do podcast e o ficheiro transferido?"
 
-#: ../sources/rb-podcast-source.c:933
+#: ../sources/rb-podcast-source.c:922
 msgid ""
 "If you choose to delete the episode and file, they will be permanently "
 "lost.  Please note that you can delete the episode but keep the downloaded "
@@ -4461,19 +4648,19 @@ msgstr ""
 "perdidos. Saiba que pode apagar o episódio mas manter o ficheiro transferido "
 "ao escolher apagar o episódio unicamente."
 
-#: ../sources/rb-podcast-source.c:941
+#: ../sources/rb-podcast-source.c:930
 msgid "Delete _Episode Only"
 msgstr "Apagar _Episódio Unicamente"
 
-#: ../sources/rb-podcast-source.c:947
+#: ../sources/rb-podcast-source.c:936
 msgid "_Delete Episode And File"
 msgstr "_Apagar Episódio e Ficheiro"
 
-#: ../sources/rb-podcast-source.c:1386
+#: ../sources/rb-podcast-source.c:1375
 msgid "Delete the podcast feed and downloaded files?"
 msgstr "Apagar a fonte do podcast e os ficheiros transferidos?"
 
-#: ../sources/rb-podcast-source.c:1389
+#: ../sources/rb-podcast-source.c:1378
 msgid ""
 "If you choose to delete the feed and files, they will be permanently lost.  "
 "Please note that you can delete the feed but keep the downloaded files by "
@@ -4483,58 +4670,58 @@ msgstr ""
 "perdidos. Saiba que pode apagar a fonte mas manter os ficheiros transferidos "
 "ao escolher apagar a fonte unicamente."
 
-#: ../sources/rb-podcast-source.c:1397
+#: ../sources/rb-podcast-source.c:1386
 msgid "Delete _Feed Only"
 msgstr "Apagar _Fonte Unicamente"
 
-#: ../sources/rb-podcast-source.c:1404
+#: ../sources/rb-podcast-source.c:1393
 msgid "_Delete Feed And Files"
 msgstr "_Apagar Fonte e Ficheiros"
 
-#: ../sources/rb-podcast-source.c:1612
+#: ../sources/rb-podcast-source.c:1601
 #, c-format
 msgid "%d feed"
 msgid_plural "All %d feeds"
 msgstr[0] "%d fonte"
 msgstr[1] "Todas as %d fontes"
 
-#: ../sources/rb-podcast-source.c:1749
+#: ../sources/rb-podcast-source.c:1738
 msgid "Downloading podcast"
 msgstr "A transferir podcast"
 
-#: ../sources/rb-podcast-source.c:1762
+#: ../sources/rb-podcast-source.c:1753
 msgid "Finished downloading podcast"
 msgstr "Transferência do podcast terminada"
 
-#: ../sources/rb-podcast-source.c:1775
+#: ../sources/rb-podcast-source.c:1768
 msgid "New updates available from"
 msgstr "Novas actualizações disponíveis de"
 
-#: ../sources/rb-podcast-source.c:1891
+#: ../sources/rb-podcast-source.c:1886
 msgid "Error in podcast"
 msgstr "Erro no podcast"
 
-#: ../sources/rb-podcast-source.c:1898
+#: ../sources/rb-podcast-source.c:1893
 #, c-format
 msgid "%s. Would you like to add the podcast feed anyway?"
 msgstr "%s. Deseja adicionar a fonte de podcast ainda assim?"
 
-#: ../sources/rb-podcast-source.c:2025
+#: ../sources/rb-podcast-source.c:2020
 msgid "New Podcast Feed"
 msgstr "Nova Fonte de Podcast"
 
-#: ../sources/rb-podcast-source.c:2025
+#: ../sources/rb-podcast-source.c:2020
 msgid "URL of podcast feed:"
 msgstr "URL da fonte do podcast:"
 
-#: ../sources/rb-podcast-source.c:2041
+#: ../sources/rb-podcast-source.c:2036
 #, c-format
 msgid "%d episode"
 msgid_plural "%d episodes"
 msgstr[0] "%d episódio"
 msgstr[1] "%d episódios"
 
-#: ../sources/rb-podcast-source.c:2149
+#: ../sources/rb-podcast-source.c:2144
 msgid "Podcast Error"
 msgstr "Erro no Podcast"
 
@@ -4569,18 +4756,6 @@ msgstr "A ligar"
 msgid "Buffering"
 msgstr "A criar buffer"
 
-#: ../widgets/eggtrayicon.c:147
-msgid "Orientation"
-msgstr "Orientação"
-
-#: ../widgets/eggtrayicon.c:148
-msgid "The orientation of the tray."
-msgstr "A orientação do ícone de painel."
-
-#: ../widgets/eggtrayicon.c:521
-msgid "Notification"
-msgstr "Notificação"
-
 #: ../widgets/rb-cell-renderer-pixbuf.c:118
 msgid "Pixbuf Object"
 msgstr "Objecto de Imagem"
@@ -4589,69 +4764,69 @@ msgstr "Objecto de Imagem"
 msgid "The pixbuf to render."
 msgstr "A imagem a renderizar."
 
-#: ../widgets/rb-entry-view.c:1062
-#, c-format
-msgid "%u kbps"
-msgstr "%u kbps"
+#: ../widgets/rb-entry-view.c:1064 ../widgets/rb-entry-view.c:1545
+#: ../widgets/rb-song-info.c:1046
+msgid "Lossless"
+msgstr "Sem perdas"
 
-#: ../widgets/rb-entry-view.c:1414
+#: ../widgets/rb-entry-view.c:1465
 msgid "Track"
 msgstr "Faixa"
 
-#: ../widgets/rb-entry-view.c:1465
+#: ../widgets/rb-entry-view.c:1516
 msgid "Time"
 msgstr "Duração"
 
-#: ../widgets/rb-entry-view.c:1477 ../widgets/rb-query-creator-properties.c:79
+#: ../widgets/rb-entry-view.c:1528 ../widgets/rb-query-creator-properties.c:79
 #: ../widgets/rb-query-creator-properties.c:108
 msgid "Year"
 msgstr "Ano"
 
-#: ../widgets/rb-entry-view.c:1489
+#: ../widgets/rb-entry-view.c:1540
 msgid "Quality"
 msgstr "Qualidade"
 
-#: ../widgets/rb-entry-view.c:1492
+#: ../widgets/rb-entry-view.c:1543
 msgid "000 kbps"
 msgstr "000 kbps"
 
-#: ../widgets/rb-entry-view.c:1502 ../widgets/rb-query-creator-properties.c:80
+#: ../widgets/rb-entry-view.c:1554 ../widgets/rb-query-creator-properties.c:80
 #: ../widgets/rb-query-creator-properties.c:106
 msgid "Rating"
 msgstr "Classificação"
 
-#: ../widgets/rb-entry-view.c:1524 ../widgets/rb-query-creator-properties.c:83
+#: ../widgets/rb-entry-view.c:1576 ../widgets/rb-query-creator-properties.c:83
 #: ../widgets/rb-query-creator-properties.c:107
 msgid "Play Count"
 msgstr "Nº de Reproduções"
 
-#: ../widgets/rb-entry-view.c:1536
+#: ../widgets/rb-entry-view.c:1588
 #: ../widgets/rb-query-creator-properties.c:111
 msgid "Last Played"
 msgstr "Última Reprodução"
 
-#: ../widgets/rb-entry-view.c:1548
+#: ../widgets/rb-entry-view.c:1600
 #: ../widgets/rb-query-creator-properties.c:112
 msgid "Date Added"
 msgstr "Data de Adição"
 
-#: ../widgets/rb-entry-view.c:1559
+#: ../widgets/rb-entry-view.c:1611
 msgid "Last Seen"
 msgstr "Última Vez Visto"
 
-#: ../widgets/rb-entry-view.c:1570
+#: ../widgets/rb-entry-view.c:1622
 msgid "Location"
 msgstr "Localização"
 
-#: ../widgets/rb-entry-view.c:1824
+#: ../widgets/rb-entry-view.c:1881
 msgid "Now Playing"
 msgstr "A Reproduzir"
 
-#: ../widgets/rb-entry-view.c:1887
+#: ../widgets/rb-entry-view.c:1944
 msgid "Playback Error"
 msgstr "Erro de Reprodução"
 
-#: ../widgets/rb-header.c:537
+#: ../widgets/rb-header.c:511
 msgid "Not Playing"
 msgstr "Parado"
 
@@ -4783,17 +4958,18 @@ msgstr "pelo menos"
 msgid "at most"
 msgstr "no máximo"
 
-#: ../widgets/rb-query-creator-properties.c:167
+#. Translators: this matches songs within 1-Jan-YEAR to 31-Dec-YEAR
+#: ../widgets/rb-query-creator-properties.c:168
 msgid "in"
 msgstr "em"
 
-#. matches if within 1-JAN-YEAR to 31-DEC-YEAR
-#: ../widgets/rb-query-creator-properties.c:169
+#. Translators: this matches songs after 31-Dec-YEAR
+#: ../widgets/rb-query-creator-properties.c:170
 msgid "after"
 msgstr "depois"
 
-#. matches if >= 31-DEC-YEAR
-#: ../widgets/rb-query-creator-properties.c:171
+#. Translators: this matches songs before 1-Jan-YEAR
+#: ../widgets/rb-query-creator-properties.c:172
 msgid "before"
 msgstr "antes"
 
@@ -4853,41 +5029,282 @@ msgstr[0] "%d Estrela"
 msgstr[1] "%d Estrelas"
 
 #. this string can only be so long, or there wont be a search entry :)
-#: ../widgets/rb-search-entry.c:156
+#: ../widgets/rb-search-entry.c:165
 msgid "_Search:"
 msgstr "_Procurar:"
 
-#: ../widgets/rb-song-info.c:371
+#: ../widgets/rb-search-entry.c:176
+msgid "Clear the search text"
+msgstr "Limpar o texto da pesquisa"
+
+#: ../widgets/rb-song-info.c:369
 msgid "Song Properties"
 msgstr "Propriedades da Música"
 
-#: ../widgets/rb-song-info.c:420
+#: ../widgets/rb-song-info.c:417
 msgid "Multiple Song Properties"
 msgstr "Propriedades de Múltiplas Músicas"
 
-#: ../widgets/rb-song-info.c:1110
+#: ../widgets/rb-song-info.c:1108
 msgid "Unknown file name"
 msgstr "Nome do ficheiro desconhecido"
 
-#: ../widgets/rb-song-info.c:1132
+#: ../widgets/rb-song-info.c:1130
 msgid "On the desktop"
 msgstr "Na área de trabalho"
 
-#: ../widgets/rb-song-info.c:1141
+#: ../widgets/rb-song-info.c:1139
 msgid "Unknown location"
 msgstr "Localização desconhecido"
 
-#~ msgid "GB"
-#~ msgstr "GB"
+#~ msgid "Unknown playback error"
+#~ msgstr "Erro de reprodução desconhecido"
+
+#~ msgid ""
+#~ "songs\n"
+#~ "MB\n"
+#~ "GB\n"
+#~ "Minutes"
+#~ msgstr ""
+#~ "músicas\n"
+#~ "MB\n"
+#~ "GB\n"
+#~ "Minutos"
+
+#~ msgid ""
+#~ "Default\n"
+#~ "-\n"
+#~ "Text below icons\n"
+#~ "Text beside icons\n"
+#~ "Icons only\n"
+#~ "Text only"
+#~ msgstr ""
+#~ "Predefinição\n"
+#~ "-\n"
+#~ "Texto abaixo dos ícones\n"
+#~ "Texto ao lado dos ícones\n"
+#~ "Apenas ícones\n"
+#~ "Apenas texto"
+
+#~ msgid "    "
+#~ msgstr "    "
+
+#~ msgid "C_rossfade between songs on the same album"
+#~ msgstr "T_ransição gradual entre músicas do mesmo álbum"
+
+#~ msgid "Crossfade Type"
+#~ msgstr "Tipo de Transição"
+
+#~ msgid "Rhythmbox Plugins"
+#~ msgstr "Plugins do Rhythmbox"
+
+#~ msgid "-"
+#~ msgstr "-"
+
+#~ msgid ""
+#~ "Every hour\n"
+#~ "Every day\n"
+#~ "Every week\n"
+#~ "Manually"
+#~ msgstr ""
+#~ "A cada hora\n"
+#~ "A cada dia\n"
+#~ "A cada semana\n"
+#~ "Manualmente"
+
+#~ msgid "*"
+#~ msgstr "*"
+
+#~ msgid "Enter the _location (URI) of the file you would like to add:"
+#~ msgstr "Introduza a _localização (URI) do ficheiro que deseja adicionar:"
+
+#~ msgid "Open from URI"
+#~ msgstr "Abrir a partir de URI"
+
+#~ msgid "HTTP proxy configuration error"
+#~ msgstr "Erro de configuração de proxy HTTP"
+
+#~ msgid "Rhythmbox does not support automatic proxy configuration"
+#~ msgstr "O Rhythmbox não suporta a configuração automática de proxy"
+
+#~ msgid "The GStreamer plugins to decode \"%s\" files cannot be found"
+#~ msgstr ""
+#~ "Os plugins do GStreamer para descodificar ficheiros \"%s\" não foram "
+#~ "encontrados"
+
+#~ msgid "The file contains a stream of type %s, which is not decodable"
+#~ msgstr "O ficheiro contém um stream de tipo %s, que não é descodificável"
+
+#~ msgid "0"
+#~ msgstr "0"
+
+#~ msgid "Incorrect password"
+#~ msgstr "Senha incorrecta"
+
+#~ msgid "Handshake failed"
+#~ msgstr "Protocolo mal sucedido"
+
+#~ msgid "Client update required"
+#~ msgstr "Necessário actualizar cliente"
+
+#~ msgid "Track submission failed"
+#~ msgstr "Falha na submissão da faixa"
+
+#~ msgid "Queue is too long"
+#~ msgstr "A fila é demasiado longa"
+
+#~ msgid "Unable to resolve hostname %s"
+#~ msgstr "Incapaz de resolver nome do servidor %s"
+
+#~ msgid "Minimize to the tray when closing the main window"
+#~ msgstr "Minimizar para a bandeja ao fechar a janela principal"
 
-#~ msgid "MB"
-#~ msgstr "MB"
+#~ msgid "Minimize to tray"
+#~ msgstr "Minimizar para a bandeja"
 
-#~ msgid "Minutes"
-#~ msgstr "Minutos"
+#~ msgid "Your Name:"
+#~ msgstr "O seu Nome:"
 
-#~ msgid "songs"
-#~ msgstr "músicas"
+#~ msgid "radio|New"
+#~ msgstr "Nova"
+
+#~ msgid ""
+#~ "$5 US\n"
+#~ "$6 US\n"
+#~ "$7 US\n"
+#~ "$8 US (typical)\n"
+#~ "$9 US\n"
+#~ "$10 US (better than average)\n"
+#~ "$11 US\n"
+#~ "$12 US (generous)\n"
+#~ "$13 US\n"
+#~ "$14 US\n"
+#~ "$15 US (very generous)\n"
+#~ "$16 US\n"
+#~ "$17 US\n"
+#~ "$18 US (we love you)"
+#~ msgstr ""
+#~ "$5 US\n"
+#~ "$6 US\n"
+#~ "$7 US\n"
+#~ "$8 US (típico)\n"
+#~ "$9 US\n"
+#~ "$10 US (melhor que a média)\n"
+#~ "$11 US\n"
+#~ "$12 US (generoso)\n"
+#~ "$13 US\n"
+#~ "$14 US\n"
+#~ "$15 US (muito generoso)\n"
+#~ "$16 US\n"
+#~ "$17 US\n"
+#~ "$18 US (adoramo-vos)"
+
+#~ msgid ""
+#~ "01\n"
+#~ "02\n"
+#~ "03\n"
+#~ "04\n"
+#~ "05\n"
+#~ "06\n"
+#~ "07\n"
+#~ "08\n"
+#~ "09\n"
+#~ "10\n"
+#~ "11\n"
+#~ "12"
+#~ msgstr ""
+#~ "01\n"
+#~ "02\n"
+#~ "03\n"
+#~ "04\n"
+#~ "05\n"
+#~ "06\n"
+#~ "07\n"
+#~ "08\n"
+#~ "09\n"
+#~ "10\n"
+#~ "11\n"
+#~ "12"
+
+#~ msgid ""
+#~ "Ogg Vorbis\n"
+#~ "FLAC\n"
+#~ "WAV\n"
+#~ "VBR MP3\n"
+#~ "128K MP3"
+#~ msgstr ""
+#~ "Ogg Vorbis\n"
+#~ "FLAC\n"
+#~ "WAV\n"
+#~ "VBR MP3\n"
+#~ "128K MP3"
+
+#~ msgid ""
+#~ "$5\n"
+#~ "$6\n"
+#~ "$7\n"
+#~ "$8 (typical)\n"
+#~ "$9\n"
+#~ "$10 (better than average)\n"
+#~ "$11\n"
+#~ "$12 (generous)\n"
+#~ "$13\n"
+#~ "$14\n"
+#~ "$15 (VERY generous!)\n"
+#~ "$16\n"
+#~ "$17\n"
+#~ "$18 (We love you!)"
+#~ msgstr ""
+#~ "$5\n"
+#~ "$6\n"
+#~ "$7\n"
+#~ "$8 (típico)\n"
+#~ "$9\n"
+#~ "$10 (melhor que a média)\n"
+#~ "$11\n"
+#~ "$12 (generoso)\n"
+#~ "$13\n"
+#~ "$14\n"
+#~ "$15 (MUITO generoso)\n"
+#~ "$16\n"
+#~ "$17\n"
+#~ "$18 (adoramo-vos)"
+
+#~ msgid ""
+#~ "January (01)\n"
+#~ "February (02)\n"
+#~ "March (03)\n"
+#~ "April (04)\n"
+#~ "May (05)\n"
+#~ "June (06)\n"
+#~ "July (07)\n"
+#~ "August (08)\n"
+#~ "September (09)\n"
+#~ "October (10)\n"
+#~ "November (11)\n"
+#~ "December (12)"
+#~ msgstr ""
+#~ "Janeiro (01)\n"
+#~ "Fevereiro (02)\n"
+#~ "Março (03)\n"
+#~ "Abril (04)\n"
+#~ "Maio (05)\n"
+#~ "Junho (06)\n"
+#~ "Julho (07)\n"
+#~ "Agosto (08)\n"
+#~ "Setembro (09)\n"
+#~ "Outubro (10)\n"
+#~ "Novembtro (11)\n"
+#~ "Dezembro (12)"
+
+#~ msgid "Rhythmbox"
+#~ msgstr "Rhythmbox"
+
+#~ msgid "podcast|New"
+#~ msgstr "Novo"
+
+#~ msgid "%u kbps"
+#~ msgstr "%u kbps"
 
 #~ msgid "Cannot create MusicBrainz client"
 #~ msgstr "Incapaz de criar cliente de MusicBrainz"
@@ -4920,9 +5337,6 @@ msgstr "Localização desconhecido"
 #~ msgid "Audioscrobbler preferences"
 #~ msgstr "Preferências do Audioscrobbler"
 
-#~ msgid "Next Song"
-#~ msgstr "Próxima Música"
-
 #~ msgid "Skip the current track"
 #~ msgstr "Saltar faixa actual"
 
@@ -5333,9 +5747,6 @@ msgstr "Localização desconhecido"
 #~ msgid "Low"
 #~ msgstr "Baixa"
 
-#~ msgid "Regular"
-#~ msgstr "Normal"
-
 #~ msgid "High"
 #~ msgstr "Alta"
 
@@ -5357,9 +5768,6 @@ msgstr "Localização desconhecido"
 #~ msgid "_Play Count"
 #~ msgstr "Contagem de _Reprodução"
 
-#~ msgid "Listening to "
-#~ msgstr "A ouvir "
-
 #~ msgid "Get information on this album from the web"
 #~ msgstr "Obter na web informação sobre este álbum"
 
@@ -5390,9 +5798,6 @@ msgstr "Localização desconhecido"
 #~ msgid "Repea_t"
 #~ msgstr "Repe_tir"
 
-#~ msgid "Start playing"
-#~ msgstr "Iniciar a reprodução"
-
 #~ msgid "_Cut"
 #~ msgstr "_Cortar"
 
@@ -5421,9 +5826,6 @@ msgstr "Localização desconhecido"
 #~ msgid "Error decoding FLAC file"
 #~ msgstr "Erro ao descodificar o ficheiro FLAC"
 
-#~ msgid "FLAC"
-#~ msgstr "FLAC"
-
 #~ msgid "Failed to gather information about the file"
 #~ msgstr "Falha ao obter informação sobre o ficheiro"
 
@@ -5442,21 +5844,12 @@ msgstr "Localização desconhecido"
 #~ msgid "Failed to open file as Ogg Vorbis"
 #~ msgstr "Falha ao abrir o ficheiro como Ogg Vorbis"
 
-#~ msgid "Ogg Vorbis"
-#~ msgstr "Ogg Vorbis"
-
 #~ msgid "An exception occured '%s'"
 #~ msgstr "Ocorreu uma excepção '%s'"
 
-#~ msgid "Whether the main window is visible"
-#~ msgstr "Se a janela principal é ou não visível"
-
 #~ msgid "Whether shuffle is enabled"
 #~ msgstr "Se baralhar está ou não activo"
 
-#~ msgid "Properties for the current song"
-#~ msgstr "Propriedades da música actual"
-
 #~ msgid ""
 #~ "Failed to register the shell: %s\n"
 #~ "This probably means that you installed Rhythmbox in a different prefix "
@@ -5476,9 +5869,6 @@ msgstr "Localização desconhecido"
 #~ msgid "Choose a directory"
 #~ msgstr "Seleccione um directório"
 
-#~ msgid "A_lbum:"
-#~ msgstr "Á_lbum:"
-
 #~ msgid ""
 #~ "Rhythmbox does not currently work if GNOME sound events are are enabled "
 #~ "and esdsink is in use."
diff --git a/sources/rb-playlist-source.c b/sources/rb-playlist-source.c
index 44e8ed1..a36575a 100644
--- a/sources/rb-playlist-source.c
+++ b/sources/rb-playlist-source.c
@@ -356,6 +356,7 @@ rb_playlist_source_constructor (GType type,
  	rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_QUALITY, FALSE);
 	rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_RATING, FALSE);
 	rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_PLAY_COUNT, FALSE);
+	rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_LOCATION, FALSE);
 	rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_LAST_PLAYED, FALSE);
 	rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_FIRST_SEEN, FALSE);
 	rb_entry_view_set_columns_clickable (source->priv->songs, FALSE);
