diff --git a/AUTHORS b/AUTHORS
index 470d6ea..d506023 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -19,6 +19,7 @@ Contributors:
   Andrew Conkling
   Andrés G. Aragoneses
   Andy Midgette
+  Aran Cox
   Arthur Carli
   Arun Raghavan
   Aurélien Mino
@@ -117,7 +118,7 @@ Contributors:
   Nicolò Chieffo
   Nils Naumann
   Oben Sonne
-  Olivier Duff
+  Olivier Dufour
   Oscar Forero
   Pacho Ramos
   Patrick van Staveren
@@ -132,8 +133,10 @@ Contributors:
   Raimo Radczewski
   Robin Stocker
   Roderich Schupp
+  Rodney Dawes
   Romain Tartière
   Ruben Vermeersch
+  Samuel Gyger
   Sandy Armstrong
   Scott Peterson
   Sebastian Dröge
@@ -147,6 +150,7 @@ Contributors:
   Trey Ethridge
   Valentin Sawadski
   Will Farrington
+  William Friesen
   William Pettersson
   Wouter Bolsterlee
   Zhou Ting
diff --git a/Banshee.sln b/Banshee.sln
index ff76e1d..2ebd4af 100644
--- a/Banshee.sln
+++ b/Banshee.sln
@@ -98,7 +98,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Banshee.Wikipedia", "src\Ex
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Banshee.NowPlaying", "src\Extensions\Banshee.NowPlaying\Banshee.NowPlaying.csproj", "{16FB0D3A-53FA-4B8E-B02B-4AF66E87829A}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Banshee.AudioCd", "src\Extensions\Banshee.AudioCd\Banshee.AudioCd.csproj", "{F38B53BA-8F85-4DC6-9B94-029C1CF96F24}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Banshee.Discs", "src\Extensions\Banshee.Discs\Banshee.Discs.csproj", "{F38B53BA-8F85-4DC6-9B94-029C1CF96F24}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Banshee.LibraryWatcher", "src\Extensions\Banshee.LibraryWatcher\Banshee.LibraryWatcher.csproj", "{49CA3F27-0BB6-428d-8B3A-20232493652E}"
 EndProject
diff --git a/NEWS b/NEWS
index c777b53..ed24b3c 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,5 @@
 ===============================================================================
-WELCOME TO BANSHEE 1.9.0 - Released November 10, 2010
+WELCOME TO BANSHEE 1.9.1 - Released December 15, 2010
 ===============================================================================
 
   * Banshee is a multimedia management and playback application for GNOME.
@@ -8,80 +8,56 @@ WELCOME TO BANSHEE 1.9.0 - Released November 10, 2010
     and video podcasts.  Sync your Android, iPod, and other devices. We think
     you'll love the new Banshee!"
 
-  * Learn More: http://banshee.fm/download/archives/1.9.0
+  * Learn More: http://banshee.fm/download/archives/1.9.1
 
 
 ===============================================================================
 NEW AWESOME FEATURES AND ENHANCEMENTS
 ===============================================================================
 
-    Banshee 1.9.0 is a development release, the first of the 1.9.x series
+    Banshee 1.9.1 is a development release, the second of the 1.9.x series
     leading up to Banshee 2.0.
 
-    New Features Since 1.8.0:
+    New Features Since 1.9.0:
 
-      * Artist/Album Browser Track Actions
+      * Ubuntu One Music Store and SoundMenu Extensions
 
-            Track actions (play, queue, remove, delete, edit, properties)
-            now work for the artist and album browser too!  Right click an
-            artist or album to act on it, or click an album and press 'q' to
-            queue it.
+            These two extensions have been moved from Banshee Community
+            Extensions and are now core Banshee extensions.
 
-      * 'Play After' Queue Options
+      * Subtitles
 
-            Want to listen to a track, album, or artist right after the playing
-            track, album, or artist?  The 'Play After' option will insert it
-            into the queue to make it happen.
-
-      * User Interface Improvements
-
-            We have made several changes toward a cleaner and more usable UI.
-            We got rid of the active source's title bar.  Search is now beside
-            the volume button.  The source list has smaller icons, hidden
-            counts for the libraries, and named group-separators.  The seek
-            slider and search entry are resizable via their grips.
-
-            Podcasts episodes are now shown in a grid, with several lines of
-            description shown to help you find an appealing episode to enjoy.
+            Added support for embedded and external subtitles.
 
     Enhancements:
 
-      * Album grid has tooltips for ellipsized text
-      * Subscribe to Internet Archive searches as podcasts
-      * MusicBrainz cover art search supports CDBaby and Jamendo
-      * Support Huawei Ideos Android phones
-
-    Notable Bugs Fixed (51 fixed since 1.8.0):
-
-      * Remove unused Mono.Addins.Gui dependency
-      * Fix checkbox hover prelight in Fixup
-      * Always grab search entry focus on ctrl+f
-      * [TrackEditor] Don't try to load metadata over HTTP
-      * [AppleDevice] Add a matching 'StopSync' call.  We had an unmatched StartSync call which meant that the Sync dialog would be displayed forever.
-      * bgo#587936: [AppleDevice] Sync the Sort* fields
-      * bgo#631172: [AppleDevice] Fix podcast support
-      * bgo#540503: Remove Jump... from context menu
-      * bgo#540525: Stop when the playing track is deleted
-      * bgo#545998: Sensitize and pluralize podcast actions appropriately
-      * bgo#609463: Equalizer distortion
-      * bgo#620010: Displaying random image for "All Albums"
-      * bgo#623441: Duplicates on import due to character encoding
-      * bgo#624734: Allow editing Radio stations again
-      * bgo#629005: Full-screen on multi-head displays
-      * bgo#629534: TaskStatusIcon missing-ctor crash
-      * bgo#630039: Concatenated and untranslatable string
-      * bgo#631277: Crash in when editing some tracks' metadata
-      * bgo#631687: Non-local tracks added to DAP without extensions
-      * bgo#631961: [Gio] Invalid cast exception
-      * bgo#632114: Hang when replaying video
-      * bgo#632246: Missing-ctor issue in SourceComboBox
-      * bgo#632420: [Booter] Use the MeeGo client if appropriate
-      * bgo#632715: [Bookmarks] UI not getting loaded
-      * bgo#633579: Fixup not getting reloaded correctly
-      * bgo#633764: [Dap] not transcoding some files when we should
-      * bgo#633841: Recognize webm as video
-      * bgo#634096: Empty track # in filename patterns
-      * bnc#642505: Insecure LD_LIBRARY_PATH
+      * Massively rework the podcast edit dialog
+      * Let line wrap in properties table
+      * Add 'Podcast Properties' to episode menu
+      * Show context menu even for 'All' filters
+      * Only show tabs if there is more than one
+      * Make Play/Pause action tooltip only show play or pause
+      * Add support for the LG Ally phone
+      * Add dbus method to clear the play queue
+      * Allow to clear the play queue while in Populate mode
+      * Add back podcast browser
+      * Add a new 'Recently Played' default smart playlist
+      * Remember sources' column configuration
+      * Blank track editor spin buttons when 0
+      * Remove Home and Photo folder import sources
+
+    Notable Bugs Fixed (79 fixed since 1.9.0):
+
+      * bgo#637202: Initialize the ipod each time we load
+      * bgo#630209: Fix podcast flag for video podcasts
+      * bgo#635780: Prevent GroupSources from being selected
+      * bgo#540394: Don't overwrite existing files when ripping
+      * bgo#635776: Ensure karma-sharp's DLLmap is copied in the build
+      * bgo#634662: Make search entry in MeeGo panel correctly show query
+      * bgo#634686: Fix streaming broken after first play
+      * bgo#635426: Ensure track filter actions updated
+      * bgo#635453: Fix regression with importing mkv
+      * bgo#608778: 'Random by' skips user-selected artist/album 
 
 ===============================================================================
 SOURCES / PACKAGES
@@ -90,10 +66,10 @@ SOURCES / PACKAGES
 Sources
 -------
 
-    * Banshee 1.9.0 Tarballs:
-      http://download.banshee.fm/banshee/unstable/1.9.0/banshee-1-1.9.0.tar.bz2
-      http://download.banshee.fm/banshee/unstable/1.9.0/banshee-1-1.9.0.tar.gz
-    * http://download.banshee.fm/banshee/unstable/1.9.0/banshee-1-1.9.0.sha256sum
+    * Banshee 1.9.1 Tarballs:
+      http://download.banshee.fm/banshee/unstable/1.9.1/banshee-1-1.9.1.tar.bz2
+      http://download.banshee.fm/banshee/unstable/1.9.1/banshee-1-1.9.1.tar.gz
+    * http://download.banshee.fm/banshee/unstable/1.9.1/banshee-1-1.9.1.sha256sum
 
 Packages
 --------
@@ -180,7 +156,7 @@ REPORT BUGS - HELP THE PROJECT - GROW THE COMMUNITY
     hesitate to file bugs!
 
     * http://banshee.fm/contribute/file-bugs
-    * http://bugzilla.gnome.org/enter_bug.cgi?product=banshee&version=1.9.0
+    * http://bugzilla.gnome.org/enter_bug.cgi?product=banshee&version=1.9.1
 
 
 ===============================================================================
@@ -193,18 +169,16 @@ Contributors For This Release
     The following people directly contributed to the release of this version
     of Banshee. Without their help, there would be no release!
 
-      Aaron Bockover, Alan McGovern, Alex Launi, Alexander Kojevnikov,
-      Andreas Nilsson, Andrés G. Aragoneses, Aurélien Mino, Bertrand Lorentz,
-      Dougal Stanton, Gabriel Burt, Ghislain Lacroix, Kentaro KAZUHAMA,
-      Michał Sawicz, Pete Johanson, Raimo Radczewski, Tim Fisken, Zhou Ting
+      Aaron Bockover, Alex Launi, Alexander Kojevnikov, Aran Cox,
+      Bertrand Lorentz, David Nielsen, Gabriel Burt, Iain Lane, Olivier Dufour,
+      Raimo Radczewski, Rodney Dawes, Samuel Gyger, William Friesen, Zhou Ting
 
     The following people contributed updated translations to this release.
     Without them, our project's reach would be much more limited.
 
-      Andrej Žnidaršič, Benjamín Valero Espinosa, Carles Ferrando,
-      Daniel Nylander, Inaki Larranaga Murgoitio, Joe Hansen, Jorge González,
-      Kjartan Maraas, Mario Blättermann, Matej Urbančič, Maxim V. Dziumanenko,
-      Michael Kotsarinis, Petr Kovar, Takayuki KUSANO, Χάρης Κουζινόπουλος
+      Andrej Žnidaršič, Aron Xu, Benjamín Valero Espinosa, Bruno Brouard,
+      Fran Dieguez, Gabor Kelemen, Inaki Larranaga Murgoitio, Jordi Mas,
+      Jorge González, Michael Kotsarinis, Petr Kovar, Sira Nokyoongtong
 
 Contributors In Past Releases
 -----------------------------
@@ -213,35 +187,37 @@ Contributors In Past Releases
     Alex Mauer, Alexander Hixon, Alexander Kojevnikov, Alexandros Frantzis,
     Alp Toker, Anders Petersson, Andrea Cimitan, Andreas Neustifter,
     Andreas Nilsson, Andrew Conkling, Andrés G. Aragoneses, Andy Midgette,
-    Arthur Carli, Arun Raghavan, Aurélien Mino, Aydemir Ulaş Şahin,
-    Ben Maurer, Benjamín Valero Espinosa, Bertrand Lorentz, Bill Dawson,
-    Bob Copeland, Bojan Rajkovic, Brad Taylor, Brandon Perry, Brian Lucas,
-    Brian Nickel, Brian Teague, Chow Loong Jin, Chris Howie, Chris Jones,
-    Chris Lahey, Chris Toshok, Chris Turchin, Christian Hergert,
-    Christian Krause, Christoph Burgdorf, Christopher James Halse Rogers,
-    Claude Paroz, Cody Russell, Cosmin Banu, Dan Wilson, Dan Winship,
-    Daniel Munkton, Daniel Siegel, David Nielsen, David Spreen, David Stone,
-    Diego E. Pettenò, Dougal Stanton, Eitan Isaacson, Elena Grassi,
-    Eoin Hennessy, Eric Butler, Erik Schmidt, Fabian Jost,
-    Felipe Almeida Lessa, Fernando Casanova, Florent Thoumie, Fredrik Hedberg,
-    Félix Velasco, Gabriel Burt, Garrett LeSage, Ghislain Lacroix,
-    Götz Waschk, Haitao Feng, Hans Petter Jansson, Harold Schreckengost,
-    Iain Lane, Igor Guerrero Fonseca, Ilya Konstantinov, Ivan N. Zlatev,
-    Jack Deslippe, Jakub Steiner, James Willcox, Jan Arne Petersen,
-    Jason Conti, Jason Taylor, Jeff Tickle, Jeff Wheeler, Jensen Somers,
-    Jeroen Budts, Jo Shields, Johannes Kuhn, John Millikin, Jordi Mas,
-    Jorge Castro, Julien Moutte, Juri Pakaste, Ján Sokoly, Jérémie Laval,
-    K. Vishnoo Charan Reddy, Ken Vandine, Kentaro KAZUHAMA, Kevin Duffus,
-    Konstantin Oshiyko, Larry Ewing, Lauri Kotilainen, Lukas Lipka, Marijn Ros,
-    Matt Enright, Michael Kaiser, Michael Martin-Smucker, Michael Monreal,
-    Michael Monreal, Michał Sawicz, Miguel de Icaza, Mike Gemünde,
-    Mike Urbanski, Moritz Schallaböck, Nathan Palmer, Neil Loknath,
-    Nicholas Doyle, Nicholas Parker, Nicolò Chieffo, Nils Naumann, Oben Sonne,
-    Olivier Duff, Oscar Forero, Pacho Ramos, Patrick van Staveren, Paul Cutler,
-    Paul Lange, Pavel Antonov, Pepijn van de Geer, Pete Johanson,
-    Peter de Kraker, Pratik Patel, Przemysław Grzegorczyk, Raimo Radczewski,
-    Robin Stocker, Roderich Schupp, Romain Tartière, Ruben Vermeersch,
-    Ryan Collier, Sandy Armstrong, Scott Peterson, Sebastian Dröge,
+    Aran Cox, Arthur Carli, Arun Raghavan, Aurélien Mino,
+    Aydemir Ulaş Şahin, Ben Maurer, Benjamín Valero Espinosa,
+    Bertrand Lorentz, Bill Dawson, Bob Copeland, Bojan Rajkovic, Brad Taylor,
+    Brandon Perry, Brian Lucas, Brian Nickel, Brian Teague, Chow Loong Jin,
+    Chris Howie, Chris Jones, Chris Lahey, Chris Toshok, Chris Turchin,
+    Christian Hergert, Christian Krause, Christoph Burgdorf,
+    Christopher James Halse Rogers, Claude Paroz, Cody Russell, Cosmin Banu,
+    Dan Wilson, Dan Winship, Daniel Munkton, Daniel Siegel, David Nielsen,
+    David Spreen, David Stone, Diego E. Pettenò, Dougal Stanton,
+    Eitan Isaacson, Elena Grassi, Eoin Hennessy, Eric Butler, Erik Schmidt,
+    Fabian Jost, Felipe Almeida Lessa, Fernando Casanova, Florent Thoumie,
+    Fredrik Hedberg, Félix Velasco, Gabriel Burt, Garrett LeSage,
+    Ghislain Lacroix, Götz Waschk, Haitao Feng, Hans Petter Jansson,
+    Harold Schreckengost, Iain Lane, Igor Guerrero Fonseca, Ilya Konstantinov,
+    Ivan N. Zlatev, Jack Deslippe, Jakub Steiner, James Willcox,
+    Jan Arne Petersen, Jason Conti, Jason Taylor, Jeff Tickle, Jeff Wheeler,
+    Jensen Somers, Jeroen Budts, Jo Shields, Johannes Kuhn, John Millikin,
+    Jordi Mas, Jorge Castro, Julien Moutte, Juri Pakaste, Ján Sokoly,
+    Jérémie Laval, K. Vishnoo Charan Reddy, Ken Vandine, Kentaro KAZUHAMA,
+    Kevin Duffus, Konstantin Oshiyko, Larry Ewing, Lauri Kotilainen,
+    Lukas Lipka, Marijn Ros, Matt Enright, Michael Kaiser,
+    Michael Martin-Smucker, Michael Monreal, Michael Monreal, Michał Sawicz,
+    Miguel de Icaza, Mike Gemünde, Mike Urbanski, Moritz Schallaböck,
+    Nathan Palmer, Neil Loknath, Nicholas Doyle, Nicholas Parker,
+    Nicolò Chieffo, Nils Naumann, Oben Sonne, Olivier Dufour, Oscar Forero,
+    Pacho Ramos, Patrick van Staveren, Paul Cutler, Paul Lange, Pavel Antonov,
+    Pepijn van de Geer, Pete Johanson, Peter de Kraker, Pratik Patel,
+    Przemysław Grzegorczyk, Raimo Radczewski, Robin Stocker, Roderich Schupp,
+    Rodney Dawes, Romain Tartière, Ruben Vermeersch, Ryan Collier,
+    Samuel Gyger, Sandy Armstrong, Scott Peterson, Sebastian Dröge,
     Shaun McCance, Tim Fisken, Tim Yamin, Tobias Mueller, Todd Berman,
     Travis Glenn Hansen, Travis Reitter, Trey Ethridge, Valentin Sawadski,
-    Will Farrington, William Pettersson, Wouter Bolsterlee, Zhou Ting
+    Will Farrington, William Friesen, William Pettersson, Wouter Bolsterlee,
+    Zhou Ting
diff --git a/banshee.doap b/banshee.doap
index 86610eb..c987893 100644
--- a/banshee.doap
+++ b/banshee.doap
@@ -30,11 +30,11 @@
 
   <release>
     <Version>
-      <name>1.9.0 Release</name>
+      <name>1.9.1 Release</name>
       <branch>master</branch>
-      <created>2010-11-10</created>
-      <revision>1.9.0</revision>
-      <file-release rdf:resource="http://download.banshee.fm/banshee/unstable/1.9.0/banshee-1-1.9.0.tar.bz2" />
+      <created>2010-12-15</created>
+      <revision>1.9.1</revision>
+      <file-release rdf:resource="http://download.banshee.fm/banshee/unstable/1.9.1/banshee-1-1.9.1.tar.bz2" />
     </Version>
   </release>
 
diff --git a/build/build.environment.mk b/build/build.environment.mk
index 5dd05ae..1f4a474 100644
--- a/build/build.environment.mk
+++ b/build/build.environment.mk
@@ -127,11 +127,11 @@ REF_DAP_KARMA = $(LINK_DAP_DEPS) $(LINK_KARMA_DEPS)
 LINK_EXTENSION_AMAZONMP3 = -r:$(DIR_BIN)/Banshee.AmazonMp3.exe
 REF_EXTENSION_AMAZONMP3 = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_AMAZONMP3_STORE = $(LINK_BANSHEE_WEBBROWSER_DEPS) $(LINK_EXTENSION_AMAZONMP3)
-REF_EXTENSION_AUDIOCD = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MUSICBRAINZ_DEPS)
 REF_EXTENSION_BOOSCRIPT = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_BOO)
 REF_EXTENSION_BPM = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
+REF_EXTENSION_DISCS = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MUSICBRAINZ_DEPS)
 REF_EXTENSION_EMUSIC = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MIGO_DEPS)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
diff --git a/configure.ac b/configure.ac
index 1cd941a..1c7dfed 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,10 +2,10 @@ dnl Granularly define the version components
 dnl Remember to also update the Display Version
 m4_define([banshee_version_major], [1])
 m4_define([banshee_version_minor], [9])
-m4_define([banshee_version_micro], [0])
+m4_define([banshee_version_micro], [1])
 
 dnl this can sometimes differ manually
-m4_define([banshee_display_version], ["1.9.0"])
+m4_define([banshee_display_version], ["1.9.1"])
 
 dnl set to 0 when doing an official release
 m4_define([banshee_version_pre_release], [0])
@@ -340,11 +340,11 @@ src/Extensions/Makefile
 src/Extensions/Banshee.AmazonMp3/Makefile
 src/Extensions/Banshee.AmazonMp3.Store/Makefile
 src/Extensions/Banshee.Audiobook/Makefile
-src/Extensions/Banshee.AudioCd/Makefile
 src/Extensions/Banshee.BooScript/Makefile
 src/Extensions/Banshee.Bpm/Makefile
 src/Extensions/Banshee.CoverArt/Makefile
 src/Extensions/Banshee.Daap/Makefile
+src/Extensions/Banshee.Discs/Makefile
 src/Extensions/Banshee.Emusic/Makefile
 src/Extensions/Banshee.FileSystemQueue/Makefile
 src/Extensions/Banshee.InternetArchive/Makefile
diff --git a/data/addin-xml-strings.cs b/data/addin-xml-strings.cs
index 4fde14f..9e7053a 100644
--- a/data/addin-xml-strings.cs
+++ b/data/addin-xml-strings.cs
@@ -81,11 +81,6 @@ internal static class AddinXmlStringCatalog
         Catalog.GetString (@"Organize audiobooks, lectures, etc.");
         Catalog.GetString (@"Core");
 
-        // ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd.addin.xml
-        Catalog.GetString (@"Audio CD Support");
-        Catalog.GetString (@"Listen to and rip Audio CDs.");
-        Catalog.GetString (@"Core");
-
         // ../src/Extensions/Banshee.BooScript/Banshee.BooScript.addin.xml
         Catalog.GetString (@"Boo Scripting");
         Catalog.GetString (@"Customize and extend Banshee with Boo-language scripts.");
@@ -106,6 +101,11 @@ internal static class AddinXmlStringCatalog
         Catalog.GetString (@"Browse and listen to music shared over your local network.");
         Catalog.GetString (@"Utilities");
 
+        // ../src/Extensions/Banshee.Discs/Banshee.Discs.addin.xml
+        Catalog.GetString (@"DVD and Audio CD Support");
+        Catalog.GetString (@"Watch DVDs; listen to and rip Audio CDs.");
+        Catalog.GetString (@"Core");
+
         // ../src/Extensions/Banshee.Emusic/Banshee.Emusic.addin.xml
         Catalog.GetString (@"eMusic Import");
         Catalog.GetString (@"Download and import music purchased from eMusic");
diff --git a/extras/create-authors b/extras/create-authors
index 630b90e..0cdc576 100755
--- a/extras/create-authors
+++ b/extras/create-authors
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 
 open (IN, '../src/Core/Banshee.Core/Resources/contributors.xml');
 
diff --git a/extras/create-contributors-paragraph b/extras/create-contributors-paragraph
index 327f6ce..8661362 100755
--- a/extras/create-contributors-paragraph
+++ b/extras/create-contributors-paragraph
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 
 open (IN, '../src/Core/Banshee.Core/Resources/contributors.xml');
 
diff --git a/extras/create-release-notes b/extras/create-release-notes
index 2ae271e..685e5df 100755
--- a/extras/create-release-notes
+++ b/extras/create-release-notes
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 
 open (IN, '../NEWS');
 $news = '';
diff --git a/extras/make-release b/extras/make-release
index 98c55b4..7ce5a45 100755
--- a/extras/make-release
+++ b/extras/make-release
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 
 function preparing_to () {
 	for ((i=10; i > 0; i--)); do
diff --git a/extras/metrics.py b/extras/metrics.py
index 6083876..0309e26 100755
--- a/extras/metrics.py
+++ b/extras/metrics.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 
 import cgi
 import os
diff --git a/extras/metrics/fetch-metrics b/extras/metrics/fetch-metrics
index 3c8344c..e35b656 100755
--- a/extras/metrics/fetch-metrics
+++ b/extras/metrics/fetch-metrics
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 
 mkdir -p data/
 cd data
diff --git a/help/de/de.po b/help/de/de.po
index 93ef60a..e4b9e80 100644
--- a/help/de/de.po
+++ b/help/de/de.po
@@ -6,8 +6,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: banshee help master\n"
-"POT-Creation-Date: 2010-09-03 22:19+0000\n"
-"PO-Revision-Date: 2010-09-04 12:35+0100\n"
+"POT-Creation-Date: 2010-12-03 21:29+0000\n"
+"PO-Revision-Date: 2010-12-15 20:06+0100\n"
 "Last-Translator: Mario Blättermann <mariobl@gnome.org>\n"
 "Language-Team: German <gnome-de@gnome.org>\n"
 "MIME-Version: 1.0\n"
@@ -17,26 +17,6 @@ msgstr ""
 "X-Poedit-Language: German\n"
 "X-Poedit-Country: GERMANY\n"
 
-#: C/legal.xml:3(p)
-msgid ""
-"This work is licensed under a <link href=\"http://creativecommons.org/"
-"licenses/by-sa/3.0/\">Creative Commons Attribution-Share Alike 3.0 Unported "
-"License</link>."
-msgstr ""
-"Dieses Werk ist lizenziert unter einer <link href=\"http://creativecommons."
-"org/licenses/by-sa/3.0/\">Creative Commons Attribution-Share Alike 3.0 "
-"Unported License</link>."
-
-#: C/legal.xml:6(p)
-msgid ""
-"As a special exception, the copyright holders give you permission to copy, "
-"modify, and distribute the example code contained in this document under the "
-"terms of your choosing, without restriction."
-msgstr ""
-"Als besondere Ausnahme erteilen Ihnen die Urheberrechtsinhaber die "
-"Genehmigung, den in diesem Dokument enthaltenen Beispielcode ohne "
-"Einschränkung unter den Bedingungen Ihrer Wahl zu verbreiten."
-
 #. When image changes, this message will be marked fuzzy or untranslated for you.
 #. It doesn't matter what you translate it to: it's not used at all.
 #: C/ui.page:29(None) C/introduction.page:45(None)
@@ -64,8 +44,8 @@ msgstr "Paul Cutler"
 #: C/manage-coverart.page:13(email) C/lastfm.page:13(email)
 #: C/keyboardshortcuts.page:11(email) C/introduction.page:13(email)
 #: C/index.page:10(email) C/import.page:12(email) C/extensions.page:12(email)
-#: C/amazon.page:13(email) C/advanced.page:12(email) C/add-radio.page:15(email)
-#: C/add-podcast.page:15(email)
+#: C/amazon.page:13(email) C/advanced.page:12(email)
+#: C/add-radio.page:15(email) C/add-podcast.page:15(email)
 msgid "pcutler@gnome.org"
 msgstr "pcutler@gnome.org"
 
@@ -103,14 +83,14 @@ msgstr ""
 msgid ""
 "The menu choices will change depending on the source you have chosen. For "
 "example, to use the menu to import a Podcast, you will need to choose the "
-"Podcast source. The menu option for importing a Podcast is not available when "
-"viewing the video or music library."
+"Podcast source. The menu option for importing a Podcast is not available "
+"when viewing the video or music library."
 msgstr ""
-"Abhängig von der von Ihnen gewählten Quelle ändert sich die Menüauswahl. Wenn "
-"Sie beispielsweise einen Podcast in Banshee importieren, müssen Sie die "
+"Abhängig von der von Ihnen gewählten Quelle ändert sich die Menüauswahl. "
+"Wenn Sie beispielsweise einen Podcast in Banshee importieren, müssen Sie die "
 "Podcast-Quelle wählen. Die Menüoption zum Importieren eines Podcasts ist "
-"jedoch nicht vorhanden, wenn Sie ein Video abspielen oder die Musikbibliothek "
-"betrachten."
+"jedoch nicht vorhanden, wenn Sie ein Video abspielen oder die "
+"Musikbibliothek betrachten."
 
 #: C/ui.page:50(title)
 msgid "Library Browser"
@@ -123,10 +103,10 @@ msgid ""
 "Banshee can display your music or video library, Podcast subscriptions or "
 "even the Amazon Music Store to allow you to buy music."
 msgstr ""
-"Wenn Sie eine Musik- oder Videoquelle wählen, dann zeigt Banshee deren inhalt "
-"im Bibliotheksbrowser an. Abhängig von der gewählten Quelle kann Banshee Ihre "
-"Musik- oder Videobibliothek, abonnierte Podcasts oder den Amazon-Musikladen "
-"anzeigen, wo Sie Musik kaufen können."
+"Wenn Sie eine Musik- oder Videoquelle wählen, dann zeigt Banshee deren "
+"inhalt im Bibliotheksbrowser an. Abhängig von der gewählten Quelle kann "
+"Banshee Ihre Musik- oder Videobibliothek, abonnierte Podcasts oder den "
+"Amazon-Musikladen anzeigen, wo Sie Musik kaufen können."
 
 #: C/ui.page:58(title)
 msgid "Now Playing View"
@@ -144,8 +124,8 @@ msgstr ""
 "der »Jetzt wiedergegeben«-Modus die Bibliothek verbirgt, um eine vergrößerte "
 "Ansicht auf die Musik oder das Video zu gewähren. Beim Musik hören zeigt "
 "Ihnen der »Jetzt wiedergegeben«-Modus die Namen des Künstlers, des Albums und "
-"das Alben-Cover an, sofern verfügbar. Beim Ansehen eines Videos zeigt Banshee "
-"das Video an."
+"das Alben-Cover an, sofern verfügbar. Beim Ansehen eines Videos zeigt "
+"Banshee das Video an."
 
 #: C/ui.page:65(p)
 msgid ""
@@ -194,8 +174,8 @@ msgid ""
 "Banshee supports syncing your music to portable media players and "
 "smartphones. You can add specific music tracks, albums or playlist or allow "
 "Banshee to keep your music player in sync with your entire library. After "
-"your player is connected to your computer you can also play back the songs on "
-"your portable player in Banshee. When syncing music in a lossless format, "
+"your player is connected to your computer you can also play back the songs "
+"on your portable player in Banshee. When syncing music in a lossless format, "
 "such as FLAC, Banshee will automatically transcode your music for you to a "
 "lossy format such as Ogg Vorbis or MP3, if you have the correct codecs "
 "installed."
@@ -203,12 +183,12 @@ msgstr ""
 "Banshee unterstützt den Abgleich Ihrer Musik mit tragbaren "
 "Musikwiedergabegeräten und Smartphones. Sie können bestimmte Musiktitel, "
 "Alben oder Wiedergabelisten hinzufügen oder Banshee gestatten, Ihr "
-"Wiedergabegerät direkt mit Ihrer gesamten Bibliothek synchron zu halten. Wenn "
-"Sie Ihr Wiedergabegerät angeschlossen haben, dann können sie die darauf "
+"Wiedergabegerät direkt mit Ihrer gesamten Bibliothek synchron zu halten. "
+"Wenn Sie Ihr Wiedergabegerät angeschlossen haben, dann können sie die darauf "
 "befindliche Musik direkt in Banshee abspielen. Beim Abgleich von Musik in "
 "einem verlustlosen Format wie z.B. FLAC, wandelt Banshee Ihre Musik "
-"automatisch in ein verlustbehaftetes Format wie OggVorbis oder MP3 um, sofern "
-"Sie die korrekten Codecs installiert haben."
+"automatisch in ein verlustbehaftetes Format wie OggVorbis oder MP3 um, "
+"sofern Sie die korrekten Codecs installiert haben."
 
 #: C/sync.page:37(title)
 msgid "Device Support"
@@ -243,16 +223,16 @@ msgid ""
 "automatically sync it or manage your music and media manually."
 msgstr ""
 "Sie können wählen, ob die Medien Ihrer tragbaren Geräte automatisch "
-"abgeglichen werden sollen oder ob Sie Ihre Musik und Medien manuell verwalten "
-"wollen."
+"abgeglichen werden sollen oder ob Sie Ihre Musik und Medien manuell "
+"verwalten wollen."
 
 #: C/sync.page:56(p)
 msgid ""
-"Choose your device from the Banshee menu and then choose how you want to sync "
-"your media, including:"
+"Choose your device from the Banshee menu and then choose how you want to "
+"sync your media, including:"
 msgstr ""
-"Wählen Sie Ihr Gerät im Banshee-Menü aus und wählen Sie anschließend, wie Sie "
-"Ihre Medien abgleichen wollen:"
+"Wählen Sie Ihr Gerät im Banshee-Menü aus und wählen Sie anschließend, wie "
+"Sie Ihre Medien abgleichen wollen:"
 
 #: C/sync.page:60(p)
 msgid "Music"
@@ -301,29 +281,29 @@ msgstr ""
 msgid ""
 "If you have created playlists or smart playlists in your music library, they "
 "will also be displayed as a sync option for Music. This can be helpful when "
-"creating smart playlists, as smart playlists will automatically update as new "
-"content is added based on the playlist rules, and Banshee will sync the new "
-"playlist to your device every time you plug it in."
+"creating smart playlists, as smart playlists will automatically update as "
+"new content is added based on the playlist rules, and Banshee will sync the "
+"new playlist to your device every time you plug it in."
 msgstr ""
 "Falls Sie intelligente oder gewöhnliche Wiedergabelisten in Ihrer "
-"Musikbibliothek erstellt haben, dann werden diese auch als Abgleichoption für "
-"Musik angezeigt. Dies kann beim Erstellen intelligenter Wiedergabelisten "
+"Musikbibliothek erstellt haben, dann werden diese auch als Abgleichoption "
+"für Musik angezeigt. Dies kann beim Erstellen intelligenter Wiedergabelisten "
 "hilfreich sein, da diese gemäß den Regeln der Wiedergabeliste automatisch "
 "aktualisiert werden, sobald neue Inhalte hinzugefügt werden. Banshee gleicht "
 "dann jedes Mal beim anschließen Ihres Gerätes die neue Wiedergabeliste ab."
 
 #: C/sync.page:89(p)
 msgid ""
-"Banshee will display the total hard drive space of your portable music player "
-"in a graph in the bottom center of Banshee. The graph will show you how much "
-"space is taken by audio files, video, other and free space. Directly below "
-"that Banshee will show you how many total items are stored on your portable "
-"music player, how many hours or days of listening that is equal to, and total "
-"space used."
+"Banshee will display the total hard drive space of your portable music "
+"player in a graph in the bottom center of Banshee. The graph will show you "
+"how much space is taken by audio files, video, other and free space. "
+"Directly below that Banshee will show you how many total items are stored on "
+"your portable music player, how many hours or days of listening that is "
+"equal to, and total space used."
 msgstr ""
 "Banshee zeigt den gesamten auf Ihrem tragbaren Wiedergabegerät vorhandenen "
-"Speicherplatz in einer Grafik unten in der Mitte des Banshee-Fensters an. Die "
-"Grafik zeigt an, wie viel Platz jeweils von Audio-, Video- und anderen "
+"Speicherplatz in einer Grafik unten in der Mitte des Banshee-Fensters an. "
+"Die Grafik zeigt an, wie viel Platz jeweils von Audio-, Video- und anderen "
 "Dateien beansprucht wird und wie viel freier Platz verfügbar ist. Direkt "
 "darunter zeigt Banshee die Gesamtanzahl der auf Ihrem tragbaren "
 "Wiedergabegerät gespeicherten Objekte an, die Gesamtzeit der möglichen "
@@ -353,16 +333,16 @@ msgid ""
 "does not support, such as OGG or FLAC, and you have the necessary codecs "
 "installed, Banshee can automatically transcode these files to MP3 when "
 "transferring to your portable media player. Check with your Linux "
-"distribution for the necessary codecs as it is outside the scope of this help "
-"and varies by distribution."
+"distribution for the necessary codecs as it is outside the scope of this "
+"help and varies by distribution."
 msgstr ""
 "Falls Ihre Musikbibliothek in einem Format vorliegt, mit dem Ihr tragbares "
 "Wiedergabegerät nicht umgehen kann, wie OGG oder FLAC, Sie aber die "
-"notwendigen Codecs installiert haben, dann kann Banshee diese Dateien bei der "
-"Übertragung auf Ihr tragbares Wiedergabegerät automatisch in MP3 umwandeln. "
-"Prüfen Sie in Ihrer Distribution, ob die notwendigen Codecs vorhanden sind. "
-"Einzelheiten dazu liegen außerhalb des Bereichs dieser Dokumentation und "
-"können von Distribution zu Distribution variieren."
+"notwendigen Codecs installiert haben, dann kann Banshee diese Dateien bei "
+"der Übertragung auf Ihr tragbares Wiedergabegerät automatisch in MP3 "
+"umwandeln. Prüfen Sie in Ihrer Distribution, ob die notwendigen Codecs "
+"vorhanden sind. Einzelheiten dazu liegen außerhalb des Bereichs dieser "
+"Dokumentation und können von Distribution zu Distribution variieren."
 
 #: C/sync.page:117(p)
 msgid ""
@@ -387,8 +367,8 @@ msgid ""
 "as you would music in your own library."
 msgstr ""
 "Sie können auf Ihrem tragbaren Wiedergabegerät gespeicherte Musik direkt in "
-"Banshee anhören. Wählen Sie Ihr Wiedergabegerät im Banshee-Menü an der linken "
-"Seite aus, woraufhin die Bibliothek Ihres tragbaren Wiedergabegerätes "
+"Banshee anhören. Wählen Sie Ihr Wiedergabegerät im Banshee-Menü an der "
+"linken Seite aus, woraufhin die Bibliothek Ihres tragbaren Wiedergabegerätes "
 "angezeigt wird. Sie können Sie Musik dann so wiedergeben, als ob Sie sich "
 "direkt in Ihrer eigenen Bibliothek befinden würde."
 
@@ -406,16 +386,17 @@ msgstr ""
 "Um auf Ihrem tragbaren Wiedergabegerät gespeicherte Titel zu löschen, wählen "
 "Sie Ihr Wiedergabegerät in Banshee aus, um dessen Bibliothek anzuzeigen. "
 "Wählen Sie dann die zu entfernenden Titel aus und klicken Sie sie mit der "
-"rechten Maustaste an. Wählen Sie anschließend <gui>Löschen</gui> aus dem Menü "
-"oder wählen Sie <guiseq><gui>Bearbeiten</gui><gui>Löschen</gui></guiseq>."
+"rechten Maustaste an. Wählen Sie anschließend <gui>Löschen</gui> aus dem "
+"Menü oder wählen Sie <guiseq><gui>Bearbeiten</gui><gui>Löschen</gui></"
+"guiseq>."
 
 #: C/sync.page:142(p)
 msgid ""
-"Deleting files from your portable music will permanently remove the files and "
-"you will not be able to recover them."
+"Deleting files from your portable music will permanently remove the files "
+"and you will not be able to recover them."
 msgstr ""
-"Das Löschen von Dateien auf tragbaren Geräten entfernt die Dateien dauerhaft. "
-"Sie werden nicht in der Lage sein, diese wiederherzustellen."
+"Das Löschen von Dateien auf tragbaren Geräten entfernt die Dateien "
+"dauerhaft. Sie werden nicht in der Lage sein, diese wiederherzustellen."
 
 #: C/sort.page:9(desc)
 msgid "Sort your media and add additional columns."
@@ -448,13 +429,13 @@ msgid ""
 "name of the column you wish to add to the library view."
 msgstr ""
 "Sie können zusätzliche Spalten zur Bibliotheksansicht in <app>Banshee</app> "
-"hinzufügen, um weitere Informationen über die Titel und die Sortierung anhand "
-"dieser Informationen zu ermöglichen. Standardmäßig zeigt Banshee die Spalten "
-"<gui>Name</gui>, <gui>Interpret</gui>, <gui>Album</gui> und <gui>Zeit</gui> "
-"an. Um zusätzliche Spalten hinzuzufügen, klicken Sie mit der rechten "
-"Maustaste auf eine beliebige Spalte, woraufhin Banshee alle zur Auswahl "
-"verfügbaren Spalten anzeigt. Klicken Sie in das Ankreuzfeld neben dem Namen "
-"der Spalte, die Sie zur Bibliotheksansicht hinzufügen wollen."
+"hinzufügen, um weitere Informationen über die Titel und die Sortierung "
+"anhand dieser Informationen zu ermöglichen. Standardmäßig zeigt Banshee die "
+"Spalten <gui>Name</gui>, <gui>Interpret</gui>, <gui>Album</gui> und "
+"<gui>Zeit</gui> an. Um zusätzliche Spalten hinzuzufügen, klicken Sie mit der "
+"rechten Maustaste auf eine beliebige Spalte, woraufhin Banshee alle zur "
+"Auswahl verfügbaren Spalten anzeigt. Klicken Sie in das Ankreuzfeld neben "
+"dem Namen der Spalte, die Sie zur Bibliotheksansicht hinzufügen wollen."
 
 #: C/sort.page:46(title)
 msgid "Sorting Columns"
@@ -464,9 +445,9 @@ msgstr "Sortieren der Spalten"
 msgid ""
 "You can sort your library by using your mouse to click on any of the columns "
 "displayed in library view. If you wish to sort your music library by Artist, "
-"click the <gui>Artist</gui> column header and Banshee will automically sort "
-"that column alphabetically. Clicking the <gui>Artist</gui> column again will "
-"sort the column in reverse alphabetical order."
+"click the <gui>Artist</gui> column header and Banshee will automatically "
+"sort that column alphabetically. Clicking the <gui>Artist</gui> column again "
+"will sort the column in reverse alphabetical order."
 msgstr ""
 "Sie können mit der Maus in eine beliebige Spalte in der Bibliotheksansicht "
 "klicken, um Ihre Bibliothek zu sortieren. Wenn Sie Ihre Musikbibliothek nach "
@@ -489,29 +470,30 @@ msgid ""
 "quickly and easily with basic search terms or perform detailed searches with "
 "Banshee's advanced search terminology."
 msgstr ""
-"Banshee liefert eine mächtige Suchsprache mit. Sie können schnell und einfach "
-"mittels grundlegender Suchbegriffe Ihre Bibliothek durchsuchen oder eine "
-"detailliertere Suche mit der erweiterten Terminologie von Banshee durchführen."
+"Banshee liefert eine mächtige Suchsprache mit. Sie können schnell und "
+"einfach mittels grundlegender Suchbegriffe Ihre Bibliothek durchsuchen oder "
+"eine detailliertere Suche mit der erweiterten Terminologie von Banshee "
+"durchführen."
 
 #: C/search.page:30(p)
 msgid ""
-"To perform a search of your media in Banshee, press the <key>S</key> or click "
-"the <gui>Search</gui> box in the upper right hand corner of the Library view "
-"in Banshee."
+"To perform a search of your media in Banshee, press the <key>S</key> or "
+"click the <gui>Search</gui> box in the upper right hand corner of the "
+"Library view in Banshee."
 msgstr ""
 "Um Ihre Medien in Banshee zu durchsuchen, drücken Sie die Taste <key>S</key> "
-"oder klicken Sie in das Feld <gui>Suchen</gui> in der oberen rechten Ecke der "
-"Bibliotheksansicht in Banshee."
+"oder klicken Sie in das Feld <gui>Suchen</gui> in der oberen rechten Ecke "
+"der Bibliotheksansicht in Banshee."
 
 #: C/search.page:35(p)
 msgid ""
 "A search query consists of some basic terms, for example, <em>dave matthews</"
 "em>. By entering <em>dave matthews</em> in the search box, Banshee will "
-"search all metatdata fields including Track Title, Album Title, Album Artist, "
-"Year, etc. Any track whose metadata includes <em>dave</em> and <em>matthews</"
-"em> will be returned. Search terms are case, meaningyou don't have to "
-"capitalize. <em>dave</em>, <em>Dave</em>, and <em>DAVE</em> all mean the same "
-"thing when searching."
+"search all metatdata fields including Track Title, Album Title, Album "
+"Artist, Year, etc. Any track whose metadata includes <em>dave</em> and "
+"<em>matthews</em> will be returned. Search terms are case, meaning you don't "
+"have to capitalize. <em>dave</em>, <em>Dave</em>, and <em>DAVE</em> all mean "
+"the same thing when searching."
 msgstr ""
 "Eine Suchanfrage besteht aus zwei grundlegenden Begriffen, beispielsweise "
 "<em>dave matthews</em>. Nach Eingabe von <em>dave matthews</em> im Suchfeld "
@@ -529,12 +511,12 @@ msgstr "Grundlegende Operatoren"
 msgid ""
 "Operators can be placed between any two search words or placed before a "
 "search word. The default operation is <gui>AND</gui> and is used when no "
-"other operators are used between two search terms. Because it is the default, "
-"there is no explicit AND operator."
+"other operators are used between two search terms. Because it is the "
+"default, there is no explicit AND operator."
 msgstr ""
-"Operatoren können zwischen zwei Suchwörter oder auch vor ein Suchwort gesetzt "
-"werden. Die vorgegebene Operation ist <gui>AND</gui> und wird immer dann "
-"verwendet, wenn keine weiteren Operatoren zwischen zwei Suchbegriffen "
+"Operatoren können zwischen zwei Suchwörter oder auch vor ein Suchwort "
+"gesetzt werden. Die vorgegebene Operation ist <gui>AND</gui> und wird immer "
+"dann verwendet, wenn keine weiteren Operatoren zwischen zwei Suchbegriffen "
 "verwendet werden. Da dies ohnehin die Vorgabe ist, gibt es keinen expliziten "
 "AND-Operator."
 
@@ -592,7 +574,7 @@ msgstr "NOT, not,<key>-</key>"
 
 #: C/search.page:73(p)
 msgid ""
-"Do not display search results with any search team that follows the operator "
+"Do not display search results with any search term that follows the operator "
 "of NOT, not,<key>-</key>."
 msgstr ""
 "Keine Suchergebnisse anzeigen, die den Teil des Suchbegriffs enthalten, der "
@@ -612,8 +594,8 @@ msgstr "dave matthews"
 
 #: C/search.page:87(p)
 msgid ""
-"Matches any fields in a track containing both <em>dave</em> and <em>matthews</"
-"em>."
+"Matches any fields in a track containing both <em>dave</em> and "
+"<em>matthews</em>."
 msgstr ""
 "Berücksichtigt alle Felder in einem Titel, die sowohl <em>dave</em> als auch "
 "<em>matthews</em> enthalten."
@@ -644,17 +626,18 @@ msgid "-\"dave matthews\""
 msgstr "-\"dave matthews\""
 
 #: C/search.page:107(p)
-msgid "Displays all tracks whose fields do not containt <em>dave matthews</em>."
+msgid ""
+"Displays all tracks whose fields do not containt <em>dave matthews</em>."
 msgstr ""
 "Zeigt alle Titel an, deren Felder nicht <em>dave matthews</em> enthalten."
 
 #: C/search.page:114(p)
 msgid ""
-"For more information on performing more complex search queries, see the <link "
-"xref=\"adv-search\"/> page."
+"For more information on performing more complex search queries, see the "
+"<link xref=\"adv-search\"/> page."
 msgstr ""
-"Weitere Informationen über die Ausführung komplexerer Suchanfragen finden Sie "
-"in <link xref=\"adv-search\"/>."
+"Weitere Informationen über die Ausführung komplexerer Suchanfragen finden "
+"Sie in <link xref=\"adv-search\"/>."
 
 #: C/rb-import.page:8(desc)
 msgid ""
@@ -691,8 +674,8 @@ msgstr ""
 
 #: C/play.page:33(p)
 msgid ""
-"Choose the album or song you wish to play from the list of artists, albums or "
-"use the search bar in the upper right hand corner of Banshee."
+"Choose the album or song you wish to play from the list of artists, albums "
+"or use the search bar in the upper right hand corner of Banshee."
 msgstr ""
 "Wählen Sie das wiederzugebende Album oder den wiederzugebenden Titel in der "
 "Liste der Künstler oder Alben aus, oder benutzen sie das Suchfeld in der "
@@ -716,8 +699,8 @@ msgid ""
 "<key>Spacebar</key>, or choose <guiseq><gui>Playback</gui><gui>Play</gui></"
 "guiseq> from the Banshee menu."
 msgstr ""
-"Sie können auch mit der Wiedergabe eines Albums beginnen, indem Sie das Album "
-"im Alben-Browser auswählen und mit der Maus doppelt auf den Titelnamen "
+"Sie können auch mit der Wiedergabe eines Albums beginnen, indem Sie das "
+"Album im Alben-Browser auswählen und mit der Maus doppelt auf den Titelnamen "
 "klicken, die <key>Leertaste</key> drücken oder <guiseq><gui>Wiedergabe</"
 "gui><gui>Wiedergabe</gui></guiseq> im Banshee-Menü wählen."
 
@@ -728,8 +711,9 @@ msgid ""
 "gui><gui>Play</gui></guiseq> from the Banshee menu."
 msgstr ""
 "Um alle Lieder eines Künstlers abzuspielen, wählen Sie den Künstler im "
-"Künstler-Browser aus und drücken Sie die <key>Leertaste</key> oder wählen Sie "
-"<guiseq><gui>Wiedergabe</gui><gui>Wiedergabe</gui></guiseq> im Banshee-Menü."
+"Künstler-Browser aus und drücken Sie die <key>Leertaste</key> oder wählen "
+"Sie <guiseq><gui>Wiedergabe</gui><gui>Wiedergabe</gui></guiseq> im Banshee-"
+"Menü."
 
 #: C/play.page:53(p)
 msgid ""
@@ -738,9 +722,9 @@ msgid ""
 "listen to and you can play songs from each."
 msgstr ""
 "<app>Banshee</app> zeigt auch Ihre Lieblingsalben an, das sind diejenigen, "
-"die Sie am häufigsten abspielen, außerdem kürzlich hinzugefügte Favoriten und "
-"noch nicht gehörte Musik. Wählen Sie aus, was Sie hören wollen und Sie können "
-"es nacheinander abspielen."
+"die Sie am häufigsten abspielen, außerdem kürzlich hinzugefügte Favoriten "
+"und noch nicht gehörte Musik. Wählen Sie aus, was Sie hören wollen und Sie "
+"können es nacheinander abspielen."
 
 #: C/play.page:61(title)
 msgid "Play a video"
@@ -754,8 +738,8 @@ msgid ""
 "menu."
 msgstr ""
 "Ihre importierten Videos werden alphabetisch aufgelistet. Um ein Video "
-"abzuspielen, wählen Sie das gewünschte Video in der Liste aus und drücken Sie "
-"die <key>Leertaste</key> oder wählen Sie <guiseq><gui>Wiedergabe</"
+"abzuspielen, wählen Sie das gewünschte Video in der Liste aus und drücken "
+"Sie die <key>Leertaste</key> oder wählen Sie <guiseq><gui>Wiedergabe</"
 "gui><gui>Wiedergabe</gui></guiseq> im Banshee-Menü."
 
 #: C/play.page:68(p)
@@ -788,8 +772,8 @@ msgid ""
 "gui><gui>Play</gui></guiseq> from the Banshee menu."
 msgstr ""
 "Um einen Podcast wiederzugeben, wählen Sie den Podcast in der Liste aus und "
-"drücken Sie die <key>Leertaste</key> oder wählen Sie <guiseq><gui>Wiedergabe</"
-"gui><gui>Wiedergabe</gui></guiseq> im Banshee-Menü."
+"drücken Sie die <key>Leertaste</key> oder wählen Sie "
+"<guiseq><gui>Wiedergabe</gui><gui>Wiedergabe</gui></guiseq> im Banshee-Menü."
 
 #: C/play.page:88(title)
 msgid "Play an internet radio station"
@@ -829,8 +813,8 @@ msgid ""
 "You can add individual tracks or entire albums, and sort or re-order them."
 msgstr ""
 "Die <gui>Wiedergabe-Warteschlange</gui> ermöglicht Ihnen das Hinzufügen von "
-"Musik zum Wiedergeben in einer bestimmten Reihenfolge. Sie können viele Titel "
-"hinzufügen, die dann über mehrere Stunden ununterbrochenen Musikgenuss "
+"Musik zum Wiedergeben in einer bestimmten Reihenfolge. Sie können viele "
+"Titel hinzufügen, die dann über mehrere Stunden ununterbrochenen Musikgenuss "
 "ermöglichen. Sie können einzelne Titel oder ganze Alben hinzufügen und diese "
 "sortieren oder neu ordnen."
 
@@ -848,9 +832,9 @@ msgstr ""
 
 #: C/play-queue.page:32(p)
 msgid ""
-"To add an entire album to the Play Queue, using your mouse press and hold the "
-"album and drag the album over <gui>Play Queue</gui> in the far left window "
-"pane."
+"To add an entire album to the Play Queue, using your mouse press and hold "
+"the album and drag the album over <gui>Play Queue</gui> in the far left "
+"window pane."
 msgstr ""
 "Um ein komplettes Album zur Wiedergabe-Warteschlange hinzuzufügen, klicken "
 "Sie es mit der Maus an und ziehen Sie es mit gedrückter Maustaste in die "
@@ -859,16 +843,16 @@ msgstr ""
 
 #: C/play-queue.page:37(p)
 msgid ""
-"You can add music tracks to the Play Queue individually or as a group. To add "
-"an individual file, drag and drop it over the <gui>Play Queue</gui> in the "
-"far left window pane, or right click the track and choose <gui>Add to Play "
-"Queue</gui>."
+"You can add music tracks to the Play Queue individually or as a group. To "
+"add an individual file, drag and drop it over the <gui>Play Queue</gui> in "
+"the far left window pane, or right click the track and choose <gui>Add to "
+"Play Queue</gui>."
 msgstr ""
 "Sie können Musiktitel einzeln oder als Gruppe zur Wiedergabe-Warteschlange "
 "hinzufügen. Um eine einzelne Datei hinzuzufügen, ziehen Sie sie mit der Maus "
-"in die <gui>Wiedergabe-Warteschlange</gui> in der äußersten linken Leiste des "
-"Fensters, oder klicken Sie mit der rechten Maustaste auf den Titel und wählen "
-"Sie <gui>Zur Wiedergabe-Warteschlange hinzufügen</gui> im Kontextmenü."
+"in die <gui>Wiedergabe-Warteschlange</gui> in der äußersten linken Leiste "
+"des Fensters, oder klicken Sie mit der rechten Maustaste auf den Titel und "
+"wählen Sie <gui>Zur Wiedergabe-Warteschlange hinzufügen</gui> im Kontextmenü."
 
 #: C/play-queue.page:43(p)
 msgid ""
@@ -880,9 +864,9 @@ msgid ""
 msgstr ""
 "Sie können mehrere Dateien mit der Maus auswählen, indem Sie während des "
 "Anklickens die <key>Strg</key>-Taste gedrückt halten und einzelne Dateien "
-"auswählen oder die <key>Umschalttaste</key> zweimal drücken, um einen Bereich "
-"von Dateien auszuwählen. Ziehen Sie die Dateien mit der Maus über die "
-"<gui>Wiedergabe-Warteschlange</gui> in der äußersten linken Leiste des "
+"auswählen oder die <key>Umschalttaste</key> zweimal drücken, um einen "
+"Bereich von Dateien auszuwählen. Ziehen Sie die Dateien mit der Maus über "
+"die <gui>Wiedergabe-Warteschlange</gui> in der äußersten linken Leiste des "
 "Fensters oder klicken Sie mit der rechten Maustaste darauf und wählen Sie "
 "<gui>Zur Wiedergabe-Warteschlange hinzufügen</gui> im Kontextmenü."
 
@@ -899,8 +883,8 @@ msgid ""
 "order with your mouse and release your mouse over the number or place in the "
 "list you wish those files to be in the queue."
 msgstr ""
-"Ihre Wiedergabe-Warteschlange wird in der Reihenfolge organisiert, in der Sie "
-"die Titel hinzugefügt haben. Die ersten zur Wiedergabe-Warteschlange "
+"Ihre Wiedergabe-Warteschlange wird in der Reihenfolge organisiert, in der "
+"Sie die Titel hinzugefügt haben. Die ersten zur Wiedergabe-Warteschlange "
 "hinzugefügten Titel oder Alben werden auch zuerst abgespielt. Sie können die "
 "Wiedergabe-Warteschlange neu ordnen, indem Sie die Maus dazu verwenden, um "
 "Titel oder Titelgruppen in der Liste zu ziehen und an der gewünschten Stelle "
@@ -952,19 +936,19 @@ msgstr "Musik-Metadaten"
 #: C/manage-tags.page:31(p)
 msgid ""
 "Digital music contains metadata that stores information in the music file "
-"including the artist, album, year recorded, genre, and more. Almost all music "
-"purchased over the internet will have the metadata already embedded and if "
-"you import music from CDs, Banshee will include the metadata when ripping the "
-"CD if available. For more information on ripping CDs and including the "
-"metadata see the <link xref=\"import\"/>."
-msgstr ""
-"Digital gespeicherte Musiktitel enthalten Metadaten, welche Informationen wie "
-"Name des Künstlers, Album, Jahr der Aufnahme, Genre und noch Einiges mehr "
-"enthalten können. In nahezu aller über das Internet verbreiteten Musik sind "
-"diese Metadaten bereits integriert. Wenn Sie Musik von CDs importieren, "
+"including the artist, album, year recorded, genre, and more. Almost all "
+"music purchased over the internet will have the metadata already embedded "
+"and if you import music from CDs, Banshee will include the metadata when "
+"ripping the CD if available. For more information on ripping CDs and "
+"including the metadata see the <link xref=\"import\"/>."
+msgstr ""
+"Digital gespeicherte Musiktitel enthalten Metadaten, welche Informationen "
+"wie Name des Künstlers, Album, Jahr der Aufnahme, Genre und noch Einiges "
+"mehr enthalten können. In nahezu aller über das Internet verbreiteten Musik "
+"sind diese Metadaten bereits integriert. Wenn Sie Musik von CDs importieren, "
 "berücksichtigt Banshee diese Metadaten beim Auslesen der CD, falls diese "
-"verfügbar sind. Weitere Informationen über das Auslesen von CDs und Einbinden "
-"von Metadaten finden Sie in <link xref=\"import\"/>."
+"verfügbar sind. Weitere Informationen über das Auslesen von CDs und "
+"Einbinden von Metadaten finden Sie in <link xref=\"import\"/>."
 
 #: C/manage-tags.page:39(p)
 msgid ""
@@ -997,10 +981,10 @@ msgid ""
 msgstr ""
 "Sie können die Metadaten Ihrer Titel ändern und bearbeiten. Wählen Sie den "
 "oder die zu bearbeitenden Titel aus und drücken Sie entweder die Taste "
-"<key>E</key>, wählen Sie <guiseq><gui>Bearbeiten</gui><gui>Titelinformationen "
-"bearbeiten</gui></guiseq> im Menü oder klicken Sie mit der rechten Maustaste "
-"auf die Datei(en) und wählen Sie <gui>Titelinformationen bearbeiten</gui> im "
-"Kontextmenü."
+"<key>E</key>, wählen Sie <guiseq><gui>Bearbeiten</"
+"gui><gui>Titelinformationen bearbeiten</gui></guiseq> im Menü oder klicken "
+"Sie mit der rechten Maustaste auf die Datei(en) und wählen Sie "
+"<gui>Titelinformationen bearbeiten</gui> im Kontextmenü."
 
 #: C/manage-tags.page:59(p)
 msgid ""
@@ -1064,19 +1048,19 @@ msgstr "Wiedergabelisten"
 
 #: C/manage-playlists.page:21(p)
 msgid ""
-"Playlists allow you to create and save a list of music tracks to be played in "
-"a specific order. Playlists are convenient to create a list of your favorite "
-"songs or to split your library into smaller lists that are easy to browse "
-"through. Some portable media players even allow you to transfer the playlist "
-"so you can take it with you on the go."
+"Playlists allow you to create and save a list of music tracks to be played "
+"in a specific order. Playlists are convenient to create a list of your "
+"favorite songs or to split your library into smaller lists that are easy to "
+"browse through. Some portable media players even allow you to transfer the "
+"playlist so you can take it with you on the go."
 msgstr ""
 "Wiedergabelisten ermöglichen Ihnen das Erstellen und Speichern einer Liste "
 "aus Musiktiteln, die in einer bestimmten Reihenfolge abgespielt werden "
-"sollen. Wiedergabelisten stellen einen bequemen Weg zum Erstellen einer Liste "
-"Ihrer Lieblingstiteln oder zum Unterteilen Ihrer Bibliothek in kleinere "
-"Listen, die sich leichter durchsuchen lassen. Einige tragbare Abspielgeräte "
-"ermöglichen sogar die Übertragung der Wiedergabeliste, so dass Sie sie "
-"überall hin mitnehmen können."
+"sollen. Wiedergabelisten stellen einen bequemen Weg zum Erstellen einer "
+"Liste Ihrer Lieblingstiteln oder zum Unterteilen Ihrer Bibliothek in "
+"kleinere Listen, die sich leichter durchsuchen lassen. Einige tragbare "
+"Abspielgeräte ermöglichen sogar die Übertragung der Wiedergabeliste, so dass "
+"Sie sie überall hin mitnehmen können."
 
 #: C/manage-playlists.page:28(p)
 msgid ""
@@ -1084,10 +1068,11 @@ msgid ""
 "playlist, as well as smart playlists. Smart Playlists are automatically "
 "generated playlists based on your listening habits, favorite music, or more."
 msgstr ""
-"Banshee unterstützt sowohl gewöhnliche Wiedergabelisten als auch intelligente "
-"Wiedergabelisten. Zu gewöhnlichen Wiedergabelisten fügen Sie Titel selbst "
-"hinzu. Intelligente Wiedergabelisten werden automatisch anhand Ihrer "
-"Hörgewohnheiten, Ihrer Lieblingsmusik und weiterer Anhaltspunkte erstellt."
+"Banshee unterstützt sowohl gewöhnliche Wiedergabelisten als auch "
+"intelligente Wiedergabelisten. Zu gewöhnlichen Wiedergabelisten fügen Sie "
+"Titel selbst hinzu. Intelligente Wiedergabelisten werden automatisch anhand "
+"Ihrer Hörgewohnheiten, Ihrer Lieblingsmusik und weiterer Anhaltspunkte "
+"erstellt."
 
 #: C/manage-playlists.page:34(title)
 msgid "Normal Playlists"
@@ -1113,12 +1098,12 @@ msgid ""
 "Playlist</gui></guiseq> or by selecing the track(s) you would like to add to "
 "the playlist. Select the track(s), right click them, and choose "
 "<guiseq><gui>Add to Playlist</gui><gui>New Playlist</gui></guiseq>. You can "
-"also drag and drop them to a new playlist by selcting the track(s) and "
-"dragging them to the left hand window pane over <gui>Music</gui>. As you drag "
-"it over <gui>Music</gui>, a new option <gui><em>New Playlist</em></gui> will "
-"appear and you can drop the track(s) over <gui><em>New Playlist</em></gui> to "
-"add them to the playlist. You can repeat this process until you have added "
-"all the tracks you want in the playlist."
+"also drag and drop them to a new playlist by selecting the track(s) and "
+"dragging them to the left hand window pane over <gui>Music</gui>. As you "
+"drag it over <gui>Music</gui>, a new option <gui><em>New Playlist</em></gui> "
+"will appear and you can drop the track(s) over <gui><em>New Playlist</em></"
+"gui> to add them to the playlist. You can repeat this process until you have "
+"added all the tracks you want in the playlist."
 msgstr ""
 "Zum Erstellen einer neuen Wiedergabeliste drücken Sie <keyseq><key>Strg</"
 "key><key>N</key></keyseq> oder wählen im Menü <guiseq><gui>Menü</"
@@ -1130,8 +1115,9 @@ msgstr ""
 "linke Fensterleiste über <gui>Musik</gui> ziehen. Sobald sich der Mauszeiger "
 "über <gui>Musik</gui> befindet, erscheint eine neue Option <gui><em>Neue "
 "Wiedergabeliste</em></gui>. Lassen Sie die Maustaste los, um die Titel zur "
-"Wiedergabeliste hinzuzufügen. Sie können diesen Vorgang so lange wiederholen, "
-"bis Sie alle gewünschten Titel zur Wiedergabeliste hinzugefügt haben."
+"Wiedergabeliste hinzuzufügen. Sie können diesen Vorgang so lange "
+"wiederholen, bis Sie alle gewünschten Titel zur Wiedergabeliste hinzugefügt "
+"haben."
 
 #: C/manage-playlists.page:56(p)
 msgid ""
@@ -1139,15 +1125,15 @@ msgid ""
 "the playlist and press <gui>Rename Playlist</gui> and enter the name of your "
 "playlist."
 msgstr ""
-"Um Ihrer Wiedergabeliste einen selbstgewählten Namen zu geben, wählen Sie die "
-"Wiedergabeliste aus und klicken Sie dann mit der rechten Maustaste darauf. "
-"Wählen Sie anschließend <gui>Wiedergabeliste umbenennen</gui> im Kontextmenü "
-"und geben Sie den Namen Ihrer Wiedergabeliste ein."
+"Um Ihrer Wiedergabeliste einen selbstgewählten Namen zu geben, wählen Sie "
+"die Wiedergabeliste aus und klicken Sie dann mit der rechten Maustaste "
+"darauf. Wählen Sie anschließend <gui>Wiedergabeliste umbenennen</gui> im "
+"Kontextmenü und geben Sie den Namen Ihrer Wiedergabeliste ein."
 
 #: C/manage-playlists.page:61(p)
 msgid ""
-"You can change the order of the playlist by dragging and dropping the song to "
-"the new position in the playlist. Songs can only be re-ordered in the "
+"You can change the order of the playlist by dragging and dropping the song "
+"to the new position in the playlist. Songs can only be re-ordered in the "
 "playlist when none of the columns are sorted. To unsort a column, press the "
 "column until the up or down arrow is no longer showing and the column is "
 "blank and then re-order the playlist."
@@ -1163,15 +1149,15 @@ msgstr ""
 msgid ""
 "To remove a track from the playlist, select the track(s) you wish to remove. "
 "Press the <key>Delete</key>, from the menu choose <guiseq><gui>Edit</"
-"gui><gui>Remove from Playlist</gui></guiseq> or right click the track(s) with "
-"your mouse and press <gui>Remove from Playlist</gui>."
+"gui><gui>Remove from Playlist</gui></guiseq> or right click the track(s) "
+"with your mouse and press <gui>Remove from Playlist</gui>."
 msgstr ""
 "Um einen Titel aus der Wiedergabeliste zu löschen, wählen Sie zunächst den "
 "oder die zu löschenden Titel aus. Drücken Sie anschließend die <key>Entf</"
 "key>-Taste, wählen Sie im Menü <guiseq><gui>Bearbeiten</gui><gui>Aus der "
 "Wiedergabeliste entfernen</gui></guiseq> oder klicken Sie mit der rechten "
-"Maustaste auf den oder die zu löschenden Titel und klicken Sie im Kontextmenü "
-"auf <gui>Aus der Wiedergabeliste entfernen</gui>."
+"Maustaste auf den oder die zu löschenden Titel und klicken Sie im "
+"Kontextmenü auf <gui>Aus der Wiedergabeliste entfernen</gui>."
 
 #: C/manage-playlists.page:76(title)
 msgid "Smart Playlist"
@@ -1180,13 +1166,13 @@ msgstr "Intelligente Wiedergabelisten"
 #: C/manage-playlists.page:78(p)
 msgid ""
 "Smart Playlists allow you to quickly generate a dynamic playlist based on a "
-"number of pre-set variables. You can quickly create a new playlist based on a "
-"specific artist, favorites or more."
+"number of pre-set variables. You can quickly create a new playlist based on "
+"a specific artist, favorites or more."
 msgstr ""
 "Intelligente Wiedergabelisten ermöglichen Ihnen die schnelle und einfache "
-"Erstellung dynamischer Wiedergabelisten, basierend auf einer Reihe von vorher "
-"festgelegten Variablen. Sie können eine neue Wiedergabeliste auf der Basis "
-"eines Künstlers, auf Vorlieben oder weiterer Parameter erstellen."
+"Erstellung dynamischer Wiedergabelisten, basierend auf einer Reihe von "
+"vorher festgelegten Variablen. Sie können eine neue Wiedergabeliste auf der "
+"Basis eines Künstlers, auf Vorlieben oder weiterer Parameter erstellen."
 
 #: C/manage-playlists.page:83(p)
 msgid ""
@@ -1201,10 +1187,10 @@ msgstr ""
 "<guiseq><gui>Medien</gui><gui>Neue intelligente Wiedergabeliste</gui></"
 "guiseq>. Ein dialog zum Erstellen der neuen intelligenten Wiedergabeliste "
 "wird geöffnet. Geben Sie den Namen Ihrer Wiedergabeliste ein und wählen Sie "
-"anschließend die Kriterien aus, auf denen Ihre Wiedergabeliste basieren soll. "
-"Sie können aus jedem in den Metadaten der Titel enthaltenen Feld wählen, wie "
-"Album, Künstler oder Erscheinungsjahr. Wählen Sie die Kriterien und wählen "
-"Sie dann Folgendes aus:"
+"anschließend die Kriterien aus, auf denen Ihre Wiedergabeliste basieren "
+"soll. Sie können aus jedem in den Metadaten der Titel enthaltenen Feld "
+"wählen, wie Album, Künstler oder Erscheinungsjahr. Wählen Sie die Kriterien "
+"und wählen Sie dann Folgendes aus:"
 
 #: C/manage-playlists.page:93(p) C/manage-playlists.page:109(gui)
 #: C/manage-playlists.page:113(gui)
@@ -1235,8 +1221,8 @@ msgstr "mindestens"
 msgid ""
 "You can also press the <gui>+</gui> button to add an addition query to the "
 "Smart Playlist. For example, you could create a smart playlist that includes "
-"all songs from 2010 that you rated 5 stars. To create this playlist you would "
-"choose:"
+"all songs from 2010 that you rated 5 stars. To create this playlist you "
+"would choose:"
 msgstr ""
 "Sie können auch auf den <gui>+</gui>-Knopf klicken, um eine zusätzliche "
 "Abfrage zu Ihrer intelligenten Wiedergabeliste hinzuzufügen. Beispielsweise "
@@ -1344,7 +1330,7 @@ msgid ""
 "Last.fm is a popular online service that offers both free and paid versions. "
 "Last.fm offers information on music artists and albums and if you create a "
 "user profile Last.fm allows you to track the music you listen to in Banshee "
-"for free. If you suscribe as a paying member, you can also listen to "
+"for free. If you subscribe as a paying member, you can also listen to "
 "streaming music from Last.fm in various music clients, including Banshee. "
 "Last.fm offers multiple channels to stream, including recommended music for "
 "you based on your listening habits, your favorites and more."
@@ -1352,11 +1338,12 @@ msgstr ""
 "Last.fm ist ein populärer Onlinedienst, der sowohl freie als auch zu "
 "bezahlende Versionen anbietet. Last.fm liefert Informationen über Künstler "
 "und Alben. Sobald Sie ein Benutzerprofil in Last.fm angelegt haben, können "
-"Sie frei Ihre gehörte Musik in Banshee verfolgen. Wenn Sie sich als zahlendes "
-"Mitglied registrieren, können Sie außerdem einen Musik-Datenstrom (Streaming) "
-"in verschiedenen Client-Programmen anhören, auch in Banshee. Last.fm bietet "
-"mehrere Kanäle für das Streaming an, zum Beispiel für Sie empfehlenswerte "
-"Musik, basierend auf Ihren Hörgewohnheiten, Ihren Favoriten und mehr."
+"Sie frei Ihre gehörte Musik in Banshee verfolgen. Wenn Sie sich als "
+"zahlendes Mitglied registrieren, können Sie außerdem einen Musik-Datenstrom "
+"(Streaming) in verschiedenen Client-Programmen anhören, auch in Banshee. "
+"Last.fm bietet mehrere Kanäle für das Streaming an, zum Beispiel für Sie "
+"empfehlenswerte Musik, basierend auf Ihren Hörgewohnheiten, Ihren Favoriten "
+"und mehr."
 
 #: C/lastfm.page:35(title)
 msgid "Enable Last.fm"
@@ -1366,10 +1353,10 @@ msgstr "Last.fm aktivieren"
 msgid ""
 "To get the most out of Last.fm, you will want to create a Last.fm profile. "
 "Visit <link href=\"http://www.last.fm/join\">http://www.last.fm/join</link> "
-"to create an account or choose <guiseq><gui>Edit</gui><gui>Preferences</gui></"
-"guiseq> from the Banshee menu. Then press the <gui>Source Specific</gui> tab "
-"and press the <gui>Source</gui> drop down menu and choose <gui>Last.fm</gui> "
-"and select the <em>Sign up for Last.fm</em> link."
+"to create an account or choose <guiseq><gui>Edit</gui><gui>Preferences</"
+"gui></guiseq> from the Banshee menu. Then press the <gui>Source Specific</"
+"gui> tab and press the <gui>Source</gui> drop down menu and choose <gui>Last."
+"fm</gui> and select the <em>Sign up for Last.fm</em> link."
 msgstr ""
 "Um Last.fm umfassend zu nutzen, sollten Sie ein Last.fm-Benutzerprofil "
 "erstellen. Besuchen Sie <link href=\"http://www.last.fm/join\">http://www."
@@ -1407,14 +1394,14 @@ msgstr "Musikbewertungen für Last.fm aktivieren"
 
 #: C/lastfm.page:59(p)
 msgid ""
-"After you have successfully linked Banshee to your Last.fm profile, to enable "
-"Banshee to report the songs to your Last.fm profile, in the <gui>Source "
-"Specific</gui> tab in Banshee's preferences, press the <gui>Enable Song "
-"Reporting</gui> checkbox. If you have an active internet connection, Banshee "
-"will now send Last.fm information regarding the songs you play. To view your "
-"play history, visit your profile on the Last.fm website. Last.fm will "
-"automatically update your music metadata if any of your artist, song title or "
-"album information is incorrect."
+"After you have successfully linked Banshee to your Last.fm profile, to "
+"enable Banshee to report the songs to your Last.fm profile, in the "
+"<gui>Source Specific</gui> tab in Banshee's preferences, press the "
+"<gui>Enable Song Reporting</gui> checkbox. If you have an active internet "
+"connection, Banshee will now send Last.fm information regarding the songs "
+"you play. To view your play history, visit your profile on the Last.fm "
+"website. Last.fm will automatically update your music metadata if any of "
+"your artist, song title or album information is incorrect."
 msgstr ""
 "Nachdem Sie nun Banshee erfolgreich mit Ihrem Last.fm-Benutzerprofil "
 "verknüpft haben, um die gespielten Titel an Last.fm zu übermitteln, "
@@ -1446,21 +1433,21 @@ msgstr ""
 
 #: C/lastfm.page:80(p)
 msgid ""
-"In Banshee's context menu onthe left hand side, you will now have a Last.fm "
-"section, including your Lat.fm radio stations. You will need an active "
+"In Banshee's context menu on the left hand side, you will now have a Last.fm "
+"section, including your Last.fm radio stations. You will need an active "
 "internet connection to listen to Last.fm radio. Choose the radio station you "
-"wish to listen to and Banshee will communicate with Last.fm to populate songs "
-"for that radio station. Press the <gui>Play</gui> button in Banshee or "
+"wish to listen to and Banshee will communicate with Last.fm to populate "
+"songs for that radio station. Press the <gui>Play</gui> button in Banshee or "
 "<key>Spacebar</key> to start streaming a Last.fm radio station. You can also "
 "press the <gui>Next</gui> button in Banshee, <key>N</key> or choose "
 "<guiseq><gui>Playback</gui><gui>Next</gui></guiseq> to play the next song in "
 "your radio station queue."
 msgstr ""
-"Im Kontextmenü von Banshee an der linken Seite wird nun ein Last.fm-Abschnitt "
-"mit Ihren Last.fm-Sendern angezeigt. Sie benötigen eine aktive "
+"Im Kontextmenü von Banshee an der linken Seite wird nun ein Last.fm-"
+"Abschnitt mit Ihren Last.fm-Sendern angezeigt. Sie benötigen eine aktive "
 "Internetverbindung, um Last.fm-Radio zu hören. Wählen Sie den gewünschten "
-"Radiosender aus, woraufhin Banshee eine Verbindung zu Last.fm aufbaut, um die "
-"Titel dieses Radiosenders zu übertragen. Klicken Sie auf den Knopf "
+"Radiosender aus, woraufhin Banshee eine Verbindung zu Last.fm aufbaut, um "
+"die Titel dieses Radiosenders zu übertragen. Klicken Sie auf den Knopf "
 "<gui>Wiedergabe</gui> in Banshee oder drücken Sie die <key>Leertaste</key>, "
 "um mit der Übertragung eines Last.fm-Radiosenders zu beginnen. Sie können "
 "auch auf den Knopf <gui>Weiter</gui> in Banshee klicken, auf der Tastatur "
@@ -1646,8 +1633,8 @@ msgstr "Einführung"
 #: C/introduction.page:26(p)
 msgid ""
 "<app>Banshee</app> is a media player that allows you to play your music, "
-"videos, and other media media as well sync it with portable devices to take "
-"your media on the go."
+"videos, and other media as well sync it with portable devices to take your "
+"media on the go."
 msgstr ""
 "<app>Banshee</app> ist ein Medien-Wiedergabeprogramm zum Abspielen Ihrer "
 "Musik und Videos sowie anderer Medien. Es unterstützt außerdem den Abgleich "
@@ -1658,8 +1645,8 @@ msgid ""
 "<app>Banshee</app> includes features to import your media, manage its "
 "metadata, and play your music and videos."
 msgstr ""
-"<app>Banshee</app> verfügt über Funktionsmerkmale zum Importieren von Medien, "
-"Verwalten von Metadaten und Wiedergeben Ihrer Musik und Videos."
+"<app>Banshee</app> verfügt über Funktionsmerkmale zum Importieren von "
+"Medien, Verwalten von Metadaten und Wiedergeben Ihrer Musik und Videos."
 
 #: C/introduction.page:35(p)
 msgid ""
@@ -1753,9 +1740,9 @@ msgid ""
 "choose a folder to import from."
 msgstr ""
 "Wählen Sie diese Option, um sämtliche Musik- und Videodateien in einem "
-"angegebenen Ordner zu importieren, einschließlich aller Unterordner. In einem "
-"Dialogfenster werden Sie dazu aufgefordert, den zu importierenden Ordner "
-"auszuwählen."
+"angegebenen Ordner zu importieren, einschließlich aller Unterordner. In "
+"einem Dialogfenster werden Sie dazu aufgefordert, den zu importierenden "
+"Ordner auszuwählen."
 
 #: C/import.page:43(gui)
 msgid "Local Files"
@@ -1780,7 +1767,8 @@ msgid ""
 "folder, including files in any subfolders."
 msgstr ""
 "Wählen Sie diese Option, um sämtliche Musik- und Videodateien in Ihrem "
-"gesamten persönlichen Ordner zu importieren, einschließlich aller Unterordner."
+"gesamten persönlichen Ordner zu importieren, einschließlich aller "
+"Unterordner."
 
 #: C/import.page:54(gui)
 msgid "Videos From Photos Folder"
@@ -1788,9 +1776,10 @@ msgstr "Videos aus dem Foto-Ordner"
 
 #: C/import.page:55(p)
 msgid ""
-"Many digital cameras can take short vidoes, and photo-management applications "
-"often download these videos directly into your Photos folder. Choose this "
-"option to import any videos that have been stored in your Photos folder."
+"Many digital cameras can take short videos, and photo-management "
+"applications often download these videos directly into your Photos folder. "
+"Choose this option to import any videos that have been stored in your Photos "
+"folder."
 msgstr ""
 "Viele Digitalkameras können kurze Videos aufnehmen, und Anwendungen zur "
 "Fotoverwaltung können diese Videos direkt in Ihren Foto-Ordner übertragen. "
@@ -1802,8 +1791,9 @@ msgid ""
 "You can safely import from a folder you have already imported from without "
 "worrying about duplicate entries in your library."
 msgstr ""
-"Sie können sicher aus einem bereits importierten Ordner importieren, ohne die "
-"Vervielfachung vorhandener Einträge in Ihrer Bibliothek befürchten zu müssen."
+"Sie können sicher aus einem bereits importierten Ordner importieren, ohne "
+"die Vervielfachung vorhandener Einträge in Ihrer Bibliothek befürchten zu "
+"müssen."
 
 #: C/import.page:68(title)
 msgid "Import from a Playlist"
@@ -1811,8 +1801,8 @@ msgstr "Aus einer Wiedergabeliste importieren"
 
 #: C/import.page:69(p)
 msgid ""
-"You can also import music from playlists. Most playlist files end in <em>m3u</"
-"em>. To import from a playlist, from the Banshee menu choose "
+"You can also import music from playlists. Most playlist files end in "
+"<em>m3u</em>. To import from a playlist, from the Banshee menu choose "
 "<guiseq><gui>Media</gui><gui>Import Playlist</gui></guiseq> and locate the "
 "playlist file in your folder, select it and press <gui>Import</gui>."
 msgstr ""
@@ -1894,8 +1884,8 @@ msgstr ""
 
 #: C/amazon.page:34(p)
 msgid ""
-"Banshee uses an Amazon affiliate code for all music purchases. All money made "
-"via this affiliate code is donated to the GNOME Foundation."
+"Banshee uses an Amazon affiliate code for all music purchases. All money "
+"made via this affiliate code is donated to the GNOME Foundation."
 msgstr ""
 "Banshee nutzt einen Amazon-eigenen Code für alle Musik-Käufe. Alles über "
 "diesen Code eingespielte Geld kommt der GNOME-Foundation zu Gute."
@@ -1925,18 +1915,19 @@ msgstr "MP3s von Amazon in Banshee kaufen"
 
 #: C/amazon.page:53(p)
 msgid ""
-"You can also search for songs on Amazon within Banshee. Choose the Amazon MP3 "
-"Store from the Banshee menu on the left. This will load the Amazon MP3 Store "
-"just as if you were in a web browser. You can search Amazon for the music you "
-"wish to buy and after logging in to Amazon, buy music with one click. Banshee "
-"will automatically download and import the your purchase into the library."
+"You can also search for songs on Amazon within Banshee. Choose the Amazon "
+"MP3 Store from the Banshee menu on the left. This will load the Amazon MP3 "
+"Store just as if you were in a web browser. You can search Amazon for the "
+"music you wish to buy and after logging in to Amazon, buy music with one "
+"click. Banshee will automatically download and import the your purchase into "
+"the library."
 msgstr ""
 "Sie können auch mittels Banshee nach Musik bei Amazon suchen. Wählen Sie "
 "links im Banshee-Menü den Amazon MP3-Musikladen aus. Daraufhin wird der "
 "Amazon MP3-Musikladen geladen, so als ob Sie sich in einem Webbrowser "
-"befänden. Sie können Amazon nach der Musik durchsuchen, die Sie kaufen wollen "
-"und den Kauf mit einem Klick einleiten. Banshee lädt Ihren Kauf automatisch "
-"herunter und importiert ihn in die Bibliothek."
+"befänden. Sie können Amazon nach der Musik durchsuchen, die Sie kaufen "
+"wollen und den Kauf mit einem Klick einleiten. Banshee lädt Ihren Kauf "
+"automatisch herunter und importiert ihn in die Bibliothek."
 
 #: C/amazon.page:63(title)
 msgid "Import Amazon MP3s manually"
@@ -1951,12 +1942,12 @@ msgid ""
 "to be imported. Banshee will then open this file and connect to the Amazon "
 "MP3 store to begin the download."
 msgstr ""
-"Wenn Sie Musik von Amazon in einem Webbrowser kaufen, wird eine Datei mit der "
-"Endung .amz heruntergeladen und gespeichert. Um bei Amazon gekaufte Musik "
-"manuell zu importieren, wählen Sie <guiseq><gui>Medien</gui><gui>Medien "
-"importieren</gui></guiseq> aus dem Banshee-Menü und wählen Sie die zu "
-"importierende *.amz-Datei. Banshee öffnet diese Datei und stellt eine "
-"Verbindung zum Amazon MP3-Musikladen her, um mit dem Herunterladen zu "
+"Wenn Sie Musik von Amazon in einem Webbrowser kaufen, wird eine Datei mit "
+"der Endung .amz heruntergeladen und gespeichert. Um bei Amazon gekaufte "
+"Musik manuell zu importieren, wählen Sie <guiseq><gui>Medien</"
+"gui><gui>Medien importieren</gui></guiseq> aus dem Banshee-Menü und wählen "
+"Sie die zu importierende *.amz-Datei. Banshee öffnet diese Datei und stellt "
+"eine Verbindung zum Amazon MP3-Musikladen her, um mit dem Herunterladen zu "
 "beginnen."
 
 #: C/amazon.page:74(p)
@@ -1999,8 +1990,8 @@ msgid ""
 "Internet radio stations are similar to regular radio stations, allowing an "
 "individual or organization to stream music live over the internet. Internet "
 "radio stations can be a simultaneous stream of a regular radio station, an "
-"amateur broadasting their own station, or commercial internet radio stations "
-"that include live DJs and even commercials."
+"amateur broadcasting their own station, or commercial internet radio "
+"stations that include live DJs and even commercials."
 msgstr ""
 "Internet-Radiostationen ähneln herkömmlichen Radiosendern. Sie ermöglichen "
 "Einzelpersonen oder Organisationen die Verbreitung von Musik live als "
@@ -2032,8 +2023,8 @@ msgid ""
 msgstr ""
 "Kopieren Sie auf der Webseite der Internet-Radiostation den Link zur "
 "Datenstrom-Adresse. In den meisten Webbrowsern können Sie mit der rechten "
-"Maustaste auf den Link klicken und im Kontextmenü <gui>Link-Adresse kopieren</"
-"gui> wählen."
+"Maustaste auf den Link klicken und im Kontextmenü <gui>Link-Adresse "
+"kopieren</gui> wählen."
 
 #: C/add-radio.page:54(p)
 msgid ""
@@ -2048,11 +2039,11 @@ msgstr ""
 "Banshee bittet Sie, das <gui>Stationsgenre</gui> einzugeben. Wählen Sie die "
 "Musikart aus, die die Internet-Radiostation senden soll, in den verfügbaren "
 "Auswahlmenüs aus. Geben Sie dann den <gui>Stationsnamen</gui> ein. Geben Sie "
-"einen Namen für die Radiostation ein. Dann drücken Sie die Tabulatortaste, um "
-"zur Eingabe der Adresse in den Dialog <gui>Stream-Adresse:</gui> zu gelangen. "
-"Klicken Sie mit der rechten Maustaste in das Eingabefeld und wählen Sie "
-"<gui>Einfügen</gui> im Kontextmenü oder drücken Sie <keyseq><key>Strg</key>"
-"+<key>V</key></keyseq>."
+"einen Namen für die Radiostation ein. Dann drücken Sie die Tabulatortaste, "
+"um zur Eingabe der Adresse in den Dialog <gui>Stream-Adresse:</gui> zu "
+"gelangen. Klicken Sie mit der rechten Maustaste in das Eingabefeld und "
+"wählen Sie <gui>Einfügen</gui> im Kontextmenü oder drücken Sie "
+"<keyseq><key>Strg</key>+<key>V</key></keyseq>."
 
 #: C/add-radio.page:62(p)
 msgid ""
@@ -2079,10 +2070,10 @@ msgstr "Was ist ein Podcast?"
 
 #: C/add-podcast.page:31(p)
 msgid ""
-"Podcasts are recorded programs, similar to radio programs, that are available "
-"on the internet and allow you to subscribe. When you subscribe to a podcast "
-"in Banshee, each time a new program is released, Banshee will automatically "
-"download the podcast and allow you to listen to it."
+"Podcasts are recorded programs, similar to radio programs, that are "
+"available on the internet and allow you to subscribe. When you subscribe to "
+"a podcast in Banshee, each time a new program is released, Banshee will "
+"automatically download the podcast and allow you to listen to it."
 msgstr ""
 "Podcasts sind aufgezeichnete Programme, ähnlich wie Radiosendungen, die über "
 "das Internet verbreitet werden und die Sie abonnieren können. Wenn Sie in "
@@ -2093,13 +2084,13 @@ msgstr ""
 msgid ""
 "There are podcasts on almost any subject including music, movies, Linux, and "
 "more. Search the internet using your favorite search engine with a search "
-"term such as \"movie podcast\" and you will be presented with many options to "
-"choose from."
+"term such as \"movie podcast\" and you will be presented with many options "
+"to choose from."
 msgstr ""
-"Es gibt Podcasts zu fast allen Themen wie Musik, Filme, Linux und noch vieles "
-"mehr. Durchsuchen Sie mit Ihrer Lieblings-Suchmaschine das Internet mit einem "
-"Suchbegriff wie »Film Podcast«, und Sie werden viele Treffer erhalten, aus "
-"denen Sie wählen können."
+"Es gibt Podcasts zu fast allen Themen wie Musik, Filme, Linux und noch "
+"vieles mehr. Durchsuchen Sie mit Ihrer Lieblings-Suchmaschine das Internet "
+"mit einem Suchbegriff wie »Film Podcast«, und Sie werden viele Treffer "
+"erhalten, aus denen Sie wählen können."
 
 #: C/add-podcast.page:44(title)
 msgid "Add a Podcast"
@@ -2109,9 +2100,9 @@ msgstr "Hinzufügen eines Podcasts"
 msgid ""
 "To add a Podcast to Banshee you will first need to visit the podcast's home "
 "page on the internet in your browser. Almost all podcasts will have a button "
-"or link displayed to subscribe to the podcast. Copy the link to the podcast's "
-"subscription. In most web browsers, you can right click on the link and "
-"choose <gui>Copy link</gui>."
+"or link displayed to subscribe to the podcast. Copy the link to the "
+"podcast's subscription. In most web browsers, you can right click on the "
+"link and choose <gui>Copy link</gui>."
 msgstr ""
 "Um einen Podcast zu Banshee hinzuzufügen, müssen Sie zunächst die Webseite "
 "des Podcasts in Ihrem Webbrowser aufrufen. Beinahe alle Podcasts verfügen "
@@ -2151,12 +2142,13 @@ msgstr ""
 
 #: C/add-podcast.page:65(p)
 msgid "Download All Episodes (This will download all episodes)."
-msgstr "Alle Folgen herunterladen (Dadurch werden alle Folgen heruntergeladen)."
+msgstr ""
+"Alle Folgen herunterladen (Dadurch werden alle Folgen heruntergeladen)."
 
 #: C/add-podcast.page:66(p)
 msgid ""
-"Let Me Decide Which Episodes to Download (This will allow you to choose which "
-"episodes you would like to download)."
+"Let Me Decide Which Episodes to Download (This will allow you to choose "
+"which episodes you would like to download)."
 msgstr ""
 "Mich entscheiden lassen, welche Folgen heruntergeladen werden (Dadurch wird "
 "Ihnen ermöglicht, aus den verfügbaren Folgen diejenigen auszuwählen, welche "
@@ -2184,6 +2176,24 @@ msgstr "<gui>Veröffentlicht</gui> (Veröffentlichungsdatum der Folge)"
 msgid "translator-credits"
 msgstr "Mario Blättermann <mariobl@gnome.org>, 2010."
 
+#~ msgid ""
+#~ "This work is licensed under a <link href=\"http://creativecommons.org/"
+#~ "licenses/by-sa/3.0/\">Creative Commons Attribution-Share Alike 3.0 "
+#~ "Unported License</link>."
+#~ msgstr ""
+#~ "Dieses Werk ist lizenziert unter einer <link href=\"http://"
+#~ "creativecommons.org/licenses/by-sa/3.0/\">Creative Commons Attribution-"
+#~ "Share Alike 3.0 Unported License</link>."
+
+#~ msgid ""
+#~ "As a special exception, the copyright holders give you permission to "
+#~ "copy, modify, and distribute the example code contained in this document "
+#~ "under the terms of your choosing, without restriction."
+#~ msgstr ""
+#~ "Als besondere Ausnahme erteilen Ihnen die Urheberrechtsinhaber die "
+#~ "Genehmigung, den in diesem Dokument enthaltenen Beispielcode ohne "
+#~ "Einschränkung unter den Bedingungen Ihrer Wahl zu verbreiten."
+
 #~ msgid "Sync Playlists"
 #~ msgstr "Wiedergabelisten abgleichen"
 
diff --git a/libbanshee/Makefile.am b/libbanshee/Makefile.am
index 415b329..6ed369a 100644
--- a/libbanshee/Makefile.am
+++ b/libbanshee/Makefile.am
@@ -19,6 +19,7 @@ libbanshee_la_SOURCES =  \
 	banshee-gst.c \
 	banshee-player.c \
 	banshee-player-cdda.c \
+	banshee-player-dvd.c \
 	banshee-player-equalizer.c \
 	banshee-player-missing-elements.c \
 	banshee-player-pipeline.c \
@@ -39,6 +40,7 @@ endif
 noinst_HEADERS =  \
 	banshee-gst.h \
 	banshee-player-cdda.h \
+	banshee-player-dvd.h \
 	banshee-player-equalizer.h \
 	banshee-player-missing-elements.h \
 	banshee-player-pipeline.h \
diff --git a/libbanshee/banshee-player-dvd.c b/libbanshee/banshee-player-dvd.c
new file mode 100644
index 0000000..ad96fe8
--- /dev/null
+++ b/libbanshee/banshee-player-dvd.c
@@ -0,0 +1,328 @@
+//
+// banshee-player-dvd.c
+//
+// Author:
+//   Alex Launi <alex.launi@canonical.com>
+//
+// Copyright (C) 2010 Alex Launi
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#include "banshee-player-dvd.h"
+
+// ---------------------------------------------------------------------------
+// Private Functions
+// ---------------------------------------------------------------------------
+
+static void
+bp_dvd_on_notify_source (GstElement *playbin, gpointer unknown, BansheePlayer *player)
+{
+    GstElement *dvd_src = NULL;
+
+    g_return_if_fail (IS_BANSHEE_PLAYER (player));
+
+    if (player->dvd_device == NULL) {
+        return;
+    }
+
+    g_object_get (playbin, "source", &dvd_src, NULL);
+    if (dvd_src == NULL) {
+        return;
+    }
+
+    if (G_LIKELY (g_object_class_find_property (G_OBJECT_GET_CLASS (dvd_src), "device"))) {
+      bp_debug2 ("bp_dvd: setting device property on source (%s)", player->dvd_device);
+      g_object_set (dvd_src, "device", player->dvd_device, NULL);
+    }
+
+    g_object_unref (dvd_src);
+}
+
+/*
+static gboolean
+bp_dvd_source_seek_to_track (GstElement *playbin, guint track)
+{
+    static GstFormat format = GST_FORMAT_UNDEFINED;
+    GstElement *dvd_src = NULL;
+    GstState state;
+
+    format = gst_format_get_by_nick ("track");
+    if (G_UNLIKELY (format == GST_FORMAT_UNDEFINED)) {
+        return FALSE;
+    }
+
+    gst_element_get_state (playbin, &state, NULL, 0);
+    if (state < GST_STATE_PAUSED) {
+        // We can only seek if the pipeline is playing or paused, otherwise
+        // we just allow playbin to do its thing, which will re-start the
+        // device and start at the desired track
+        return FALSE;
+    }
+
+    cdda_src = bp_cdda_get_cdda_source (playbin);
+    if (G_UNLIKELY (cdda_src == NULL)) {
+        return FALSE;
+    }
+
+    if (gst_element_seek (playbin, 1.0, format, GST_SEEK_FLAG_FLUSH, 
+        GST_SEEK_TYPE_SET, track - 1, GST_SEEK_TYPE_NONE, -1)) {
+        bp_debug2 ("bp_cdda: seeking to track %d, avoiding playbin", track);
+        g_object_unref (cdda_src);
+        return TRUE;
+    }
+
+    g_object_unref (cdda_src);
+    return FALSE;
+}
+*/
+
+// ---------------------------------------------------------------------------
+// Internal Functions
+// ---------------------------------------------------------------------------
+
+void
+_bp_dvd_pipeline_setup (BansheePlayer *player)
+{
+    if (player != NULL && player->playbin != NULL) {
+        g_signal_connect (player->playbin, "notify::source", G_CALLBACK (bp_dvd_on_notify_source), player);
+    }
+}
+
+gboolean
+_bp_dvd_handle_uri (BansheePlayer *player, const gchar *uri)
+{
+    // Processes URIs like dvd://<track-number>#<device-node> and overrides
+    // track transitioning through playbin if playback was already happening
+    // from the device node by seeking directly to the track since the disc
+    // is already spinning; playbin doesn't handle DVD URIs with device nodes
+    // so we have to handle setting the device property through the
+    // notify::source signal on playbin
+
+    const gchar *new_dvd_device;
+
+    if (player == NULL || uri == NULL || !g_str_has_prefix (uri, "dvd://")) {
+        // Something is hosed or the URI isn't actually DVD
+        if (player->dvd_device != NULL) {
+            bp_debug2 ("bp_dvd: finished using device (%s)", player->dvd_device);
+            g_free (player->dvd_device);
+            player->dvd_device = NULL;
+        }
+
+        return FALSE;
+    }
+
+    GError *error = NULL;
+    new_dvd_device = uri + 6;
+    if (error != NULL) {
+        bp_debug2 ("bp_dvd: error converting uri to filename: %s", error->message);
+        g_error_free (error);
+        return FALSE;
+    }
+
+    if (player->dvd_device == NULL) {
+        // If we weren't already playing from a DVD, cache the
+        // device and allow playbin to begin playing it
+        player->dvd_device = g_strdup (new_dvd_device);
+        bp_debug2 ("bp_dvd: storing device node for fast seeks (%s)", player->dvd_device);
+        return FALSE;
+    }
+
+    if (strcmp (new_dvd_device, player->dvd_device) == 0) {
+        // Parse the track number from the URI and seek directly to it
+        // since we are already playing from the device; prevent playbin
+        // from stopping/starting the DVD, which can take many many seconds
+        gchar *chapter_str = g_strndup (uri + 7, strlen (uri) - strlen (new_dvd_device) - 8);
+        //gint chapter_num = atoi (chapter_str);
+        g_free (chapter_str);
+        bp_debug2 ("bp_dvd: fast seeking to track on already playing device (%s)", player->dvd_device);
+
+        //return bp_dvd_source_seek_to_track (player->playbin, track_num);
+        return FALSE;
+    }
+
+    // We were already playing some DVD, but switched to a different device node, 
+    // so unset and re-cache the new device node and allow playbin to do its thing
+    bp_debug3 ("bp_dvd: switching devices for DVD playback (from %s, to %s)", player->dvd_device, new_dvd_device);
+    g_free (player->dvd_device);
+    player->dvd_device = g_strdup (new_dvd_device);
+
+    return FALSE;
+}
+
+//get navigation when videosink changed as done on video
+void _bp_dvd_find_navigation (BansheePlayer *player)
+{
+    GstElement *video_sink = NULL;
+    GstElement *navigation = NULL;
+    GstNavigation *previous_navigation;
+
+    previous_navigation = player->navigation;
+    g_object_get (player->playbin, "video-sink", &video_sink, NULL);
+
+    if (video_sink == NULL) {
+        player->navigation = NULL;
+        if (previous_navigation != NULL) {
+            gst_object_unref (previous_navigation);
+        }
+    }
+
+    navigation = GST_IS_BIN (video_sink)
+        ? gst_bin_get_by_interface (GST_BIN (video_sink), GST_TYPE_NAVIGATION)
+        : video_sink;
+
+    player->navigation = GST_IS_NAVIGATION (navigation) ? GST_NAVIGATION (navigation) : NULL;
+
+    if (previous_navigation != NULL) {
+        gst_object_unref (previous_navigation);
+    }
+    gst_object_unref (video_sink);
+}
+
+P_INVOKE gboolean
+bp_dvd_is_menu (BansheePlayer *player)
+{
+    return player->is_menu;
+}
+
+//mouse event
+
+P_INVOKE void
+bp_dvd_mouse_move_notify (BansheePlayer *player, double x, double y)
+{
+    if (!player->navigation) {
+        _bp_dvd_find_navigation (player);
+    }
+    if (player->navigation) {
+        gst_navigation_send_mouse_event (player->navigation, "mouse-move", 0, x, y);
+    }
+}
+
+P_INVOKE void
+bp_dvd_mouse_button_pressed_notify (BansheePlayer *player, int button, double x, double y)
+{
+    if (!player->navigation) {
+        _bp_dvd_find_navigation (player);
+    }
+    if (player->navigation) {
+        gst_navigation_send_mouse_event (player->navigation, "mouse-button-press", button, x, y);
+    }
+}
+
+P_INVOKE void
+bp_dvd_mouse_button_released_notify (BansheePlayer *player, int button, double x, double y)
+{
+    if (!player->navigation) {
+        _bp_dvd_find_navigation (player);
+    }
+    if (player->navigation) {
+        gst_navigation_send_mouse_event (player->navigation, "mouse-button-release", button, x, y);
+    }
+}
+
+//keyboard event
+
+P_INVOKE void
+bp_dvd_left_notify (BansheePlayer *player)
+{
+    if (!player->navigation) {
+        _bp_dvd_find_navigation (player);
+    }
+    if (player->navigation) {
+        gst_navigation_send_command (player->navigation, GST_NAVIGATION_COMMAND_LEFT);
+    }
+}
+
+P_INVOKE void
+bp_dvd_right_notify (BansheePlayer *player)
+{
+    if (!player->navigation) {
+        _bp_dvd_find_navigation (player);
+    }
+    if (player->navigation) {
+        gst_navigation_send_command (player->navigation, GST_NAVIGATION_COMMAND_RIGHT);
+    }
+}
+
+P_INVOKE void
+bp_dvd_up_notify (BansheePlayer *player)
+{
+    if (!player->navigation) {
+        _bp_dvd_find_navigation (player);
+    }
+    if (player->navigation) {
+        gst_navigation_send_command (player->navigation, GST_NAVIGATION_COMMAND_UP);
+    }
+}
+
+P_INVOKE void
+bp_dvd_down_notify (BansheePlayer *player)
+{
+    if (!player->navigation) {
+        _bp_dvd_find_navigation (player);
+    }
+    if (player->navigation) {
+        gst_navigation_send_command (player->navigation, GST_NAVIGATION_COMMAND_DOWN);
+    }
+}
+
+P_INVOKE void
+bp_dvd_activate_notify (BansheePlayer *player)
+{
+    if (!player->navigation) {
+        _bp_dvd_find_navigation (player);
+    }
+    if (player->navigation) {
+        gst_navigation_send_command (player->navigation, GST_NAVIGATION_COMMAND_ACTIVATE);
+    }
+}
+
+//command
+
+P_INVOKE void
+bp_dvd_go_to_menu (BansheePlayer *player)
+{
+    if (!player->navigation) {
+        _bp_dvd_find_navigation (player);
+    }
+    if (player->navigation) {
+        gst_navigation_send_command (player->navigation, GST_NAVIGATION_COMMAND_DVD_MENU);
+    }
+}
+
+P_INVOKE void
+bp_dvd_go_to_next_chapter (BansheePlayer *player)
+{
+    gint64 index;
+    GstFormat format = gst_format_get_by_nick ("chapter");
+    gst_element_query_position (player->playbin, &format, &index);
+    gst_element_seek (player->playbin, 1.0, format, GST_SEEK_FLAG_FLUSH,
+        GST_SEEK_TYPE_SET, index + 1, GST_SEEK_TYPE_NONE, 0);
+}
+
+P_INVOKE void
+bp_dvd_go_to_previous_chapter (BansheePlayer *player)
+{
+    gint64 index;
+    GstFormat format = gst_format_get_by_nick ("chapter");
+    gst_element_query_position (player->playbin, &format, &index);
+    gst_element_seek (player->playbin, 1.0, format, GST_SEEK_FLAG_FLUSH,
+        GST_SEEK_TYPE_SET, index - 1, GST_SEEK_TYPE_NONE, 0);
+}
diff --git a/libbanshee/banshee-player-dvd.h b/libbanshee/banshee-player-dvd.h
new file mode 100644
index 0000000..74bba6b
--- /dev/null
+++ b/libbanshee/banshee-player-dvd.h
@@ -0,0 +1,39 @@
+//
+// banshee-player-dvd.h
+//
+// Author:
+//   Alex Launi <alex.launi@canonical.com>
+//
+// Copyright (C) 2010 Alex Launi
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#ifndef _BANSHEE_PLAYER_DVD_H
+#define _BANSHEE_PLAYER_DVD_H
+
+#include "banshee-player-private.h"
+
+void      _bp_dvd_pipeline_setup    (BansheePlayer *player);
+gboolean  _bp_dvd_handle_uri        (BansheePlayer *player, const gchar *uri);
+void      _bp_dvd_find_navigation   (BansheePlayer *player);
+
+
+#endif /* _BANSHEE_PLAYER_DVD_H */
diff --git a/libbanshee/banshee-player-pipeline.c b/libbanshee/banshee-player-pipeline.c
index e0b3759..39eef19 100644
--- a/libbanshee/banshee-player-pipeline.c
+++ b/libbanshee/banshee-player-pipeline.c
@@ -30,6 +30,7 @@
 
 #include "banshee-player-pipeline.h"
 #include "banshee-player-cdda.h"
+#include "banshee-player-dvd.h"
 #include "banshee-player-video.h"
 #include "banshee-player-equalizer.h"
 #include "banshee-player-missing-elements.h"
@@ -209,9 +210,39 @@ bp_pipeline_bus_callback (GstBus *bus, GstMessage *message, gpointer userdata)
         case GST_MESSAGE_ELEMENT: {
             const GstStructure *messageStruct;
             messageStruct = gst_message_get_structure (message);
-            if (GST_MESSAGE_SRC (message) == GST_OBJECT (player->playbin) && gst_structure_has_name (messageStruct, "playbin2-stream-changed")) {
+            if (GST_MESSAGE_SRC (message) == GST_OBJECT (player->playbin)
+                    && gst_structure_has_name (messageStruct, "playbin2-stream-changed")) {
                 bp_next_track_starting (player);
             }
+            if ( gst_navigation_message_get_type (message) == GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED) {
+                player->is_menu = FALSE;
+                // Get available command to know if player is in menu
+                GstQuery *query = gst_navigation_query_new_commands();
+
+                //execute query over playbin or navigation ?
+                if (gst_element_query (player->playbin, query)) {
+                    guint n_cmds, i;
+                    if (gst_navigation_query_parse_commands_length (query, &n_cmds)) {
+                        for (i = 0; i < n_cmds; i++) {
+                            GstNavigationCommand cmd;
+                            if (gst_navigation_query_parse_commands_nth (query, i, &cmd)) {
+                                switch (cmd) {
+                                    case GST_NAVIGATION_COMMAND_ACTIVATE:
+                                    case GST_NAVIGATION_COMMAND_LEFT:
+                                    case GST_NAVIGATION_COMMAND_RIGHT:
+                                    case GST_NAVIGATION_COMMAND_UP:
+                                    case GST_NAVIGATION_COMMAND_DOWN:
+                                        player->is_menu = TRUE;
+                                        break;
+                                    default:
+                                        break;
+                                }
+                            }
+                        }
+                    }
+                }
+                gst_query_unref (query);
+            }
             _bp_missing_elements_process_message (player, message);
             break;
         }
@@ -416,8 +447,9 @@ _bp_pipeline_construct (BansheePlayer *player)
     gst_pad_link (gst_element_get_request_pad (player->audiotee, "src0"), sinkpad);
     // Now allow specialized pipeline setups
     _bp_cdda_pipeline_setup (player);
+    _bp_dvd_pipeline_setup (player);
     _bp_video_pipeline_setup (player, bus);
-
+    _bp_dvd_find_navigation (player);
     return TRUE;
 }
 
diff --git a/libbanshee/banshee-player-private.h b/libbanshee/banshee-player-private.h
index 4d9bf44..26ed900 100644
--- a/libbanshee/banshee-player-private.h
+++ b/libbanshee/banshee-player-private.h
@@ -42,6 +42,7 @@
 #include <gst/fft/gstfftf32.h>
 #include <gst/pbutils/pbutils.h>
 #include <gst/tag/tag.h>
+#include <gst/interfaces/navigation.h>
 
 #if defined(GDK_WINDOWING_X11)
 #  include <gdk/gdkx.h>
@@ -150,6 +151,7 @@ struct BansheePlayer {
     GstState target_state;
     gboolean buffering;
     gchar *cdda_device;
+    gchar *dvd_device;
     gboolean in_gapless_transition;
     gboolean supports_stream_volume;
     gboolean audiosink_has_volume;
@@ -199,6 +201,10 @@ struct BansheePlayer {
     // http://replaygain.hydrogenaudio.org/player_scale.html
     gdouble rg_gain_history[10];
     gint history_size;
+
+    //dvd navigation
+    GstNavigation *navigation;
+    gboolean is_menu;
 };
 
 #endif /* _BANSHEE_PLAYER_PRIVATE_H */
diff --git a/libbanshee/banshee-player-vis.c b/libbanshee/banshee-player-vis.c
index e3c3ebb..1cb867b 100644
--- a/libbanshee/banshee-player-vis.c
+++ b/libbanshee/banshee-player-vis.c
@@ -168,6 +168,7 @@ _bp_vis_pipeline_event_probe (GstPad *pad, GstEvent *event, gpointer data)
         case GST_EVENT_FLUSH_STOP:
         case GST_EVENT_SEEK:
         case GST_EVENT_NEWSEGMENT:
+        case GST_EVENT_CUSTOM_DOWNSTREAM:
             player->vis_thawing = TRUE;
 
         default: break;
@@ -178,9 +179,10 @@ _bp_vis_pipeline_event_probe (GstPad *pad, GstEvent *event, gpointer data)
 
     switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_EOS:
+    case GST_EVENT_CUSTOM_DOWNSTREAM_OOB:
         _bp_vis_pipeline_set_blocked (player, FALSE);
         break;
-
+    case GST_EVENT_CUSTOM_DOWNSTREAM:
     case GST_EVENT_NEWSEGMENT:
         _bp_vis_pipeline_set_blocked (player, TRUE);
         break;
diff --git a/libbanshee/banshee-player.c b/libbanshee/banshee-player.c
index 56f8319..38c3645 100644
--- a/libbanshee/banshee-player.c
+++ b/libbanshee/banshee-player.c
@@ -110,6 +110,10 @@ bp_destroy (BansheePlayer *player)
     if (player->cdda_device != NULL) {
         g_free (player->cdda_device);
     }
+
+    if (player->dvd_device != NULL) {
+        g_free (player->dvd_device);
+    }
     
     _bp_pipeline_destroy (player);
     _bp_missing_elements_destroy (player);
@@ -155,6 +159,8 @@ bp_open (BansheePlayer *player, const gchar *uri)
     // in case it is able to perform a fast seek to a track
     if (_bp_cdda_handle_uri (player, uri)) {
         return TRUE;
+    } else if (_bp_dvd_handle_uri (player, uri)) {
+        return TRUE;
     } else if (player->playbin == NULL) {
         return FALSE;
     }
diff --git a/libbanshee/libbanshee.cproj b/libbanshee/libbanshee.cproj
index a98b090..e594807 100644
--- a/libbanshee/libbanshee.cproj
+++ b/libbanshee/libbanshee.cproj
@@ -11,7 +11,6 @@
     <Language>C</Language>
     <Target>Bin</Target>
     <SchemaVersion>2.0</SchemaVersion>
-    <ReleaseVersion>1.3</ReleaseVersion>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -43,6 +42,7 @@
     <Compile Include="banshee-player-replaygain.c" />
     <Compile Include="banshee-player-vis.c" />
     <Compile Include="banshee-bpmdetector.c" />
+    <Compile Include="banshee-player-dvd.c" />
   </ItemGroup>
   <ItemGroup>
     <None Include="banshee-player-private.h" />
@@ -55,6 +55,7 @@
     <None Include="banshee-player-equalizer.h" />
     <None Include="banshee-player-replaygain.h" />
     <None Include="banshee-player-vis.h" />
+    <None Include="banshee-player-dvd.h" />
   </ItemGroup>
   <ProjectExtensions>
     <MonoDevelop>
diff --git a/libbanshee/libbanshee.sln b/libbanshee/libbanshee.sln
index 3a03817..ace1939 100644
--- a/libbanshee/libbanshee.sln
+++ b/libbanshee/libbanshee.sln
@@ -20,6 +20,18 @@ Global
 	EndGlobalSection
 	GlobalSection(MonoDevelopProperties) = preSolution
 		StartupItem = libbanshee.cproj
+		Policies = $0
+		$0.TextStylePolicy = $1
+		$1.FileWidth = 120
+		$1.inheritsSet = VisualStudio
+		$1.inheritsScope = text/plain
+		$1.scope = text/x-csrc
+		$0.TextStylePolicy = $2
+		$2.FileWidth = 120
+		$2.TabWidth = 4
+		$2.inheritsSet = Mono
+		$2.inheritsScope = text/plain
+		$2.scope = text/plain
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/po/de.po b/po/de.po
index afa709f..f898abd 100644
--- a/po/de.po
+++ b/po/de.po
@@ -4,6 +4,10 @@
 # #
 # # ReplayGain   -  Lautstärkeanpassung
 # #
+# Das »Sound Menu« ist eine Erweiterung für die Mac-Menüleiste:
+# http://mac.softpedia.com/get/Audio/Sound-Menu.shtml
+# Derzeit gibt es dafür noch keine deutsche Übersetzung (Dez. 2010).
+#
 # Daniel Schindler <daniel@vcard24.de>, 2006.
 # Jochen Skulj <jochen@jochenskulj.de>, 2007, 2008.
 # Philipp Kerling <k.philipp@gmail.com>, 2008.
@@ -18,8 +22,8 @@ msgstr ""
 "Project-Id-Version: banshee master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
 "product=banshee&component=general\n"
-"POT-Creation-Date: 2010-10-29 17:37+0000\n"
-"PO-Revision-Date: 2010-10-30 21:23+0100\n"
+"POT-Creation-Date: 2010-12-15 00:37+0000\n"
+"PO-Revision-Date: 2010-12-15 19:45+0100\n"
 "Last-Translator: Mario Blättermann <mariobl@gnome.org>\n"
 "Language-Team: Deutsch <gnome-de@gnome.org>\n"
 "MIME-Version: 1.0\n"
@@ -172,7 +176,7 @@ msgstr "Musik aus dem Amazon MP3-Laden durchsuchen und kaufen"
 #: ../data/addin-xml-strings.cs:72 ../data/addin-xml-strings.cs:77
 #: ../data/addin-xml-strings.cs:112 ../data/addin-xml-strings.cs:127
 #: ../data/addin-xml-strings.cs:137 ../data/addin-xml-strings.cs:142
-#: ../data/addin-xml-strings.cs:161
+#: ../data/addin-xml-strings.cs:161 ../data/addin-xml-strings.cs:224
 msgid "Online Sources"
 msgstr "Online-Quellen"
 
@@ -223,7 +227,8 @@ msgstr "Anpassen und Erweitern von Banshee mit Skripten in Boo-Sprache."
 #: ../data/addin-xml-strings.cs:122 ../data/addin-xml-strings.cs:147
 #: ../data/addin-xml-strings.cs:156 ../data/addin-xml-strings.cs:166
 #: ../data/addin-xml-strings.cs:171 ../data/addin-xml-strings.cs:176
-#: ../data/addin-xml-strings.cs:185 ../data/addin-xml-strings.cs:214
+#: ../data/addin-xml-strings.cs:185 ../data/addin-xml-strings.cs:209
+#: ../data/addin-xml-strings.cs:219
 msgid "Utilities"
 msgstr "Hilfsmittel"
 
@@ -389,7 +394,7 @@ msgstr "Ein Symbol im Benachrichtigungsfeld zur Steuerung von Banshee anzeigen."
 
 #. ../src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying.addin.xml
 #: ../data/addin-xml-strings.cs:179
-#: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/MediaPanelContents.cs:164
+#: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/MediaPanelContents.cs:168
 #: ../src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingSource.cs:50
 msgid "Now Playing"
 msgstr "Jetzt wiedergegeben"
@@ -427,10 +432,10 @@ msgstr ""
 
 #. ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.addin.xml
 #: ../data/addin-xml-strings.cs:193
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:193
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:194
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/PodcastGroupSource.cs:38
 #: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:107
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:212
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:210
 msgid "Podcasts"
 msgstr "Podcasts"
 
@@ -464,53 +469,78 @@ msgstr "Eine Beispielquelle, nützlich für Entwickler."
 msgid "Sources"
 msgstr "Quellen"
 
-#. ../src/Extensions/Banshee.SqlDebugConsole/Banshee.SqlDebugConsole.addin.xml
+#. ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu.addin.xml
 #: ../data/addin-xml-strings.cs:207
+msgid "Sound Menu integration for Banshee"
+msgstr "Sound-Menu-Integration für Banshee"
+
+#: ../data/addin-xml-strings.cs:208
+msgid "Control Banshee from the Sound Menu."
+msgstr "Banshee über das Sound Menu bedienen"
+
+#. ../src/Extensions/Banshee.SqlDebugConsole/Banshee.SqlDebugConsole.addin.xml
+#: ../data/addin-xml-strings.cs:212
 msgid "SQL Debug Console"
 msgstr "SQL-Debugger-Konsole"
 
-#: ../data/addin-xml-strings.cs:208
+#: ../data/addin-xml-strings.cs:213
 msgid "Provides a UI for monitoring Banshee's SQL usage, and running queries."
 msgstr ""
 "Stellt eine grafische Oberfläche zur Verfügung, um die SQL-Abfragen durch "
 "Banshee zu beobachten oder Abfragen zu tätigen."
 
-#: ../data/addin-xml-strings.cs:209
+#: ../data/addin-xml-strings.cs:214
 msgid "Debug"
 msgstr "Fehlerdiagnose"
 
 #. ../src/Extensions/Banshee.Torrent/Banshee.Torrent.addin.xml
-#: ../data/addin-xml-strings.cs:212
+#: ../data/addin-xml-strings.cs:217
 msgid "Torrent Downloader"
 msgstr "Torrent-Downloader"
 
-#: ../data/addin-xml-strings.cs:213
+#: ../data/addin-xml-strings.cs:218
 msgid "Support downloading BitTorrent files from podcasts."
 msgstr "Unterstützung für Herunterladen von BitTorrent-Dateien für Podcasts."
 
+#. ../src/Extensions/Banshee.UbuntuOneMusicStore/Banshee.UbuntuOneMusicStore.addin.xml
+#: ../data/addin-xml-strings.cs:222
+#: ../src/Extensions/Banshee.UbuntuOneMusicStore/Banshee.UbuntuOneMusicStore/UbuntuOneMusicStoreSource.cs:49
+#: ../src/Extensions/Banshee.UbuntuOneMusicStore/Banshee.UbuntuOneMusicStore/UbuntuOneMusicStoreSource.cs:50
+#: ../src/Extensions/Banshee.UbuntuOneMusicStore/Banshee.UbuntuOneMusicStore/UbuntuOneMusicStoreSource.cs:90
+msgid "Ubuntu One Music Store"
+msgstr "Ubuntu One Music Store"
+
+#: ../data/addin-xml-strings.cs:223
+msgid ""
+"This extension grants access to the Ubuntu One Music Store, powered by "
+"7digital."
+msgstr ""
+"Diese Erweiterung ermöglicht den Zugriff auf den Ubuntu One Music Store, "
+"bereitgestellt von 7digital."
+
 #. ../src/Extensions/Banshee.Wikipedia/Banshee.Wikipedia.addin.xml
-#: ../data/addin-xml-strings.cs:217
+#: ../data/addin-xml-strings.cs:227
 #: ../src/Extensions/Banshee.Wikipedia/Banshee.Wikipedia/ContextPage.cs:44
 msgid "Wikipedia"
 msgstr "Wikipedia"
 
-#: ../data/addin-xml-strings.cs:218
+#: ../data/addin-xml-strings.cs:228
 msgid "View artist information from Wikipedia in the context pane."
 msgstr ""
 "Anzeigen von Informationen über den Künstler aus Wikipedia in einem "
 "Kontextfenster."
 
-#: ../data/addin-xml-strings.cs:219 ../data/addin-xml-strings.cs:224
+#: ../data/addin-xml-strings.cs:229 ../data/addin-xml-strings.cs:234
 msgid "Context Pane"
 msgstr "Kontextleiste"
 
 #. ../src/Extensions/Banshee.YouTube/Banshee.YouTube.addin.xml
-#: ../data/addin-xml-strings.cs:222
+#: ../data/addin-xml-strings.cs:232
 #: ../src/Extensions/Banshee.YouTube/Banshee.YouTube/ContextPage.cs:44
 msgid "YouTube"
 msgstr "YouTube"
 
-#: ../data/addin-xml-strings.cs:223
+#: ../data/addin-xml-strings.cs:233
 msgid "Show related YouTube videos in the context pane"
 msgstr "Ähnliche YouTube-Videos in der Kontextleiste anzeigen"
 
@@ -523,7 +553,7 @@ msgid "AAC (Novell Encoder)"
 msgstr "AAC (Novell-Encoder)"
 
 #: ../data/audio-profiles/aac-novell.xml.in.h:3
-#: ../data/audio-profiles/mp3-lame.xml.in.h:4
+#: ../data/audio-profiles/mp3-lame.xml.in.h:3
 #: ../data/audio-profiles/mp3-xing.xml.in.h:2
 #: ../data/audio-profiles/wavpack.xml.in.h:3
 #: ../data/audio-profiles/wma.xml.in.h:4
@@ -592,61 +622,33 @@ msgstr ""
 "Audioformat, das größere Dateien bei niedrigeren Bitraten erzeugt."
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:2
-msgid "Average Bitrate"
-msgstr "Durchschnittliche Bitrate"
-
-#: ../data/audio-profiles/mp3-lame.xml.in.h:3
 #: ../data/audio-profiles/vorbis.xml.in.h:2
 #: ../data/audio-profiles/wavpack.xml.in.h:2
 #: ../data/audio-profiles/wma.xml.in.h:3
 msgid "Best"
 msgstr "Beste"
 
-#: ../data/audio-profiles/mp3-lame.xml.in.h:5
+#: ../data/audio-profiles/mp3-lame.xml.in.h:4
 msgid "Constant Bitrate"
 msgstr "Konstante Bitrate"
 
-#: ../data/audio-profiles/mp3-lame.xml.in.h:6
-msgid "Extreme"
-msgstr "Extrem"
-
-#: ../data/audio-profiles/mp3-lame.xml.in.h:7
-msgid "Insane"
-msgstr "Wahnsinnig"
-
-#: ../data/audio-profiles/mp3-lame.xml.in.h:8
-msgid "LAME Preset"
-msgstr "LAME-Voreinstellung"
+#: ../data/audio-profiles/mp3-lame.xml.in.h:5
+msgid "Encoding Mode"
+msgstr "Kodierungsmodus"
 
-#: ../data/audio-profiles/mp3-lame.xml.in.h:9
+#: ../data/audio-profiles/mp3-lame.xml.in.h:6
 msgid "MP3 (LAME Encoder)"
 msgstr "MP3 (LAME-Encoder)"
 
-#: ../data/audio-profiles/mp3-lame.xml.in.h:10
-msgid "Medium"
-msgstr "Medium"
-
-#: ../data/audio-profiles/mp3-lame.xml.in.h:11
-msgid "Preset"
-msgstr "Voreinstellung"
-
-#: ../data/audio-profiles/mp3-lame.xml.in.h:12
-msgid "Standard"
-msgstr "Standard"
-
-#: ../data/audio-profiles/mp3-lame.xml.in.h:13
-msgid "VBR Mode"
-msgstr "VBR-Modus"
-
-#: ../data/audio-profiles/mp3-lame.xml.in.h:14
+#: ../data/audio-profiles/mp3-lame.xml.in.h:7
 msgid "VBR Quality"
 msgstr "VBR-Qualität"
 
-#: ../data/audio-profiles/mp3-lame.xml.in.h:15
+#: ../data/audio-profiles/mp3-lame.xml.in.h:8
 msgid "Variable Bitrate"
 msgstr "Variable Bitrate"
 
-#: ../data/audio-profiles/mp3-lame.xml.in.h:16
+#: ../data/audio-profiles/mp3-lame.xml.in.h:9
 #: ../data/audio-profiles/vorbis.xml.in.h:5
 #: ../data/audio-profiles/wavpack.xml.in.h:15
 #: ../data/audio-profiles/wma.xml.in.h:7
@@ -761,7 +763,7 @@ msgstr "Windows Media Audio"
 
 #: ../data/desktop-files/common.desktop.in.h:1
 #: ../src/Clients/Muinshee/Muinshee/PlayerInterface.cs:76
-#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:105
+#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:107
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs:206
 #: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:60
 msgid "Banshee Media Player"
@@ -863,11 +865,11 @@ msgstr "CD schreiben …"
 msgid "Write selected tracks to an audio CD"
 msgstr "Die gewählten Stücke auf eine Audio-CD brennen"
 
-#: ../src/Backends/Banshee.Gnome/Banshee.GnomeBackend/Brasero.cs:104
+#: ../src/Backends/Banshee.Gnome/Banshee.GnomeBackend/Brasero.cs:105
 msgid "Could not write CD"
 msgstr "CD konnte nicht geschrieben werden"
 
-#: ../src/Backends/Banshee.Gnome/Banshee.GnomeBackend/Brasero.cs:105
+#: ../src/Backends/Banshee.Gnome/Banshee.GnomeBackend/Brasero.cs:106
 msgid "Brasero could not be started"
 msgstr "Brasero konnte nicht gestartet werden"
 
@@ -888,7 +890,7 @@ msgid "Could not create BPM detection driver."
 msgstr "BPM-Erkennungstreiber konnte nicht erstellt werden."
 
 #: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:82
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:766
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:812
 msgid "Enable _gapless playback"
 msgstr "_Lückenlose Wiedergabe aktivieren"
 
@@ -901,19 +903,19 @@ msgstr ""
 "Konzeptalben und klassische Musik"
 
 #: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:150
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:187
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:192
 msgid "Could not initialize GStreamer library"
 msgstr "GStreamer-Bibliothek konnte nicht initialisiert werden"
 
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:430
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:435
 msgid "Unknown Error"
 msgstr "Unbekannter Fehler"
 
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:760
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:806
 msgid "_Enable ReplayGain correction"
 msgstr "Korrektur durch _Lautstärkeanpassung aktivieren"
 
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:761
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:807
 msgid ""
 "For tracks that have ReplayGain data, automatically scale (normalize) "
 "playback volume"
@@ -921,7 +923,7 @@ msgstr ""
 "Für Titel mit Daten zur Lautstärkeanpassung die Wiedergabelautstärke "
 "automatisch anpassen (normalisieren)."
 
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:767
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:813
 msgid ""
 "Eliminate the small playback gap on track change.  Useful for concept albums "
 "and classical music."
@@ -933,79 +935,81 @@ msgstr ""
 msgid "Could not create transcoder"
 msgstr "Transkoder konnte nicht erzeugt werden"
 
-#: ../src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs:222
+#: ../src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs:229
 msgid "GStreamer# 0.10"
 msgstr "GStreamer# 0.10"
 
 #: ../src/Backends/Banshee.Osx/Banshee.OsxBackend/OsxService.cs:91
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:132
+#: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:111
 msgid "_Close"
 msgstr "_Schließen"
 
 #: ../src/Backends/Banshee.Osx/Banshee.OsxBackend/OsxService.cs:92
-#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:249
+#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:251
 #: ../src/Extensions/Banshee.Fixup/Banshee.Fixup/FixSource.cs:79
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:133
+#: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:112
 msgid "Close"
 msgstr "Schließen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:148
+#: ../src/Clients/Booter/Booter/Entry.cs:152
 msgid "Help Options"
 msgstr "Hilfeoptionen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:149
+#: ../src/Clients/Booter/Booter/Entry.cs:153
 msgid "Show this help"
 msgstr "Diese Hilfe anzeigen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:150
+#: ../src/Clients/Booter/Booter/Entry.cs:154
 msgid "Show options for controlling playback"
 msgstr "Optionen für die Steuerung der Wiedergabe anzeigen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:151
+#: ../src/Clients/Booter/Booter/Entry.cs:155
 msgid "Show options for querying the playing track"
 msgstr "Optionen für das Abfragen des aktuellen Titels anzeigen"
 
 # CHECK
-#: ../src/Clients/Booter/Booter/Entry.cs:152
+#: ../src/Clients/Booter/Booter/Entry.cs:156
 msgid "Show options for querying the playing engine"
 msgstr "Optionen für das Abfragen des Wiedergabeprogrammes anzeigen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:153
+#: ../src/Clients/Booter/Booter/Entry.cs:157
 msgid "Show options for the user interface"
 msgstr "Optionen der Benutzerschnittstelle anzeigen"
 
 # O
-#: ../src/Clients/Booter/Booter/Entry.cs:154
+#: ../src/Clients/Booter/Booter/Entry.cs:158
 msgid "Show options for developers and debugging"
 msgstr "Optionen für Entwickler und zur Fehlerdiagnose anzeigen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:155
+#: ../src/Clients/Booter/Booter/Entry.cs:159
 msgid "Show all option groups"
 msgstr "Alle Optionsgruppen anzeigen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:156
+#: ../src/Clients/Booter/Booter/Entry.cs:160
 msgid "Show version information"
 msgstr "Versionsinformation anzeigen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:159
+#: ../src/Clients/Booter/Booter/Entry.cs:163
 msgid "Playback Control Options"
 msgstr "Wiedergabeoptionen"
 
 # CHECK
-#: ../src/Clients/Booter/Booter/Entry.cs:160
+#: ../src/Clients/Booter/Booter/Entry.cs:164
 msgid "Play the next track, optionally restarting if the 'restart' value is set"
 msgstr ""
 "Den nächsten Titel abspielen, optional neu starten, falls das »restart«-Feld "
 "gesetzt ist"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:161
+#: ../src/Clients/Booter/Booter/Entry.cs:165
 msgid ""
 "Play the previous track, optionally restarting if the 'restart value is set"
 msgstr ""
 "Den vorherigen Titel abspielen, optional neu starten, falls das »restart«-"
 "Feld gesetzt ist"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:162
+#: ../src/Clients/Booter/Booter/Entry.cs:166
 msgid ""
 "If the current song has been played longer than 4 seconds then restart it, "
 "otherwise the same as --previous"
@@ -1013,29 +1017,29 @@ msgstr ""
 "Falls der aktuelle Titel länger als 4 Sekunden gespielt wird, dann neu "
 "starten, ansonsten wie bei --previous"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:163
+#: ../src/Clients/Booter/Booter/Entry.cs:167
 msgid "Automatically start playing any tracks enqueued on the command line"
 msgstr ""
 "Automatisch damit beginnen, alle auf der Befehlszeile angegebenen Titel in "
 "die Warteschlange aufzunehmen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:164
+#: ../src/Clients/Booter/Booter/Entry.cs:168
 msgid "Start playback"
 msgstr "Wiedergabe starten"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:165
+#: ../src/Clients/Booter/Booter/Entry.cs:169
 msgid "Pause playback"
 msgstr "Wiedergabe pausieren"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:166
+#: ../src/Clients/Booter/Booter/Entry.cs:170
 msgid "Toggle playback"
 msgstr "Wiedergabe pausieren/fortsetzen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:167
+#: ../src/Clients/Booter/Booter/Entry.cs:171
 msgid "Completely stop playback"
 msgstr "Wiedergabe komplett anhalten"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:169
+#: ../src/Clients/Booter/Booter/Entry.cs:173
 msgid ""
 "Enable or disable playback stopping after the currently playing track (value "
 "should be either 'true' or 'false')"
@@ -1043,99 +1047,99 @@ msgstr ""
 "Stopp nach dem aktuellen Titel aktivieren bzw. deaktivieren (der Wert sollte "
 "entweder »true« oder »false« sein)"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:170
+#: ../src/Clients/Booter/Booter/Entry.cs:174
 msgid "Set the playback volume (0-100), prefix with +/- for relative values"
 msgstr ""
 "Die Wiedergabelautstärke einstellen (0-100), +/- vorangestellt für relative "
 "Werte"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:171
+#: ../src/Clients/Booter/Booter/Entry.cs:175
 msgid "Seek to a specific point (seconds, float)"
 msgstr "Zu einer bestimmten Position springen (in Sekunden, als Fließkommazahl)"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:172
+#: ../src/Clients/Booter/Booter/Entry.cs:176
 msgid "Set the currently played track's rating (0 to 5)"
 msgstr "Die Bewertung des laufenden Titels festlegen (0 bis 5)"
 
 # CHECK
-#: ../src/Clients/Booter/Booter/Entry.cs:175
+#: ../src/Clients/Booter/Booter/Entry.cs:179
 msgid "Player Engine Query Options"
 msgstr "Optionen zum Abfragen des Wiedergabeprogramms"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:176
+#: ../src/Clients/Booter/Booter/Entry.cs:180
 msgid "Current player state"
 msgstr "Aktueller Wiedergabestatus"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:177
+#: ../src/Clients/Booter/Booter/Entry.cs:181
 msgid "Last player state"
 msgstr "Letzter Wiedergabestatus"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:178
+#: ../src/Clients/Booter/Booter/Entry.cs:182
 msgid "Query whether the player can be paused"
 msgstr "Abfragen, ob das Wiedergabeprogramm pausiert werden kann"
 
 # CHECK
-#: ../src/Clients/Booter/Booter/Entry.cs:179
+#: ../src/Clients/Booter/Booter/Entry.cs:183
 msgid "Query whether the player can seek"
 msgstr "Abfragen, ob das Wiedergabeprogramm im Titel springen kann"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:180
+#: ../src/Clients/Booter/Booter/Entry.cs:184
 msgid "Player volume"
 msgstr "Wiedergabelautstärke"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:181
+#: ../src/Clients/Booter/Booter/Entry.cs:185
 msgid "Player position in currently playing track"
 msgstr "Abspielposition im aktuellen Titel"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:184
+#: ../src/Clients/Booter/Booter/Entry.cs:188
 msgid "Playing Track Metadata Query Options"
 msgstr "Optionen zur Abfrage der Metadaten des aktuellen Titels"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:185
+#: ../src/Clients/Booter/Booter/Entry.cs:189
 msgid "URI"
 msgstr "Adresse"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:186
+#: ../src/Clients/Booter/Booter/Entry.cs:190
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:138
 #: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/SearchEntry.cs:89
 msgid "Artist Name"
 msgstr "Künstler"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:187
+#: ../src/Clients/Booter/Booter/Entry.cs:191
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:140
 #: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/SearchEntry.cs:90
 msgid "Album Title"
 msgstr "Albumtitel"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:188
+#: ../src/Clients/Booter/Booter/Entry.cs:192
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:137
 #: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/SearchEntry.cs:88
 msgid "Track Title"
 msgstr "Stücktitel"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:189
+#: ../src/Clients/Booter/Booter/Entry.cs:193
 msgid "Duration"
 msgstr "Dauer"
 
 #. Translators: noun
-#: ../src/Clients/Booter/Booter/Entry.cs:190
+#: ../src/Clients/Booter/Booter/Entry.cs:194
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:117
 msgid "Track Number"
 msgstr "Titelnummer"
 
 #. Translators: noun
-#: ../src/Clients/Booter/Booter/Entry.cs:191
+#: ../src/Clients/Booter/Booter/Entry.cs:195
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:126
 msgid "Track Count"
 msgstr "Titelanzahl"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:192
+#: ../src/Clients/Booter/Booter/Entry.cs:196
 #: ../src/Core/Banshee.Services/Banshee.Library/MusicFileNamePattern.cs:149
 #: ../src/Extensions/Banshee.Audiobook/Banshee.Audiobook/AudiobookFileNamePattern.cs:114
 msgid "Disc Number"
 msgstr "CD-Nummer"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:193
+#: ../src/Clients/Booter/Booter/Entry.cs:197
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:142
 #: ../src/Core/Banshee.Services/Banshee.Library/MusicFileNamePattern.cs:113
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:177
@@ -1146,7 +1150,7 @@ msgstr "CD-Nummer"
 msgid "Year"
 msgstr "Jahr"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:194
+#: ../src/Clients/Booter/Booter/Entry.cs:198
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:230
 #: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:131
 #: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:60
@@ -1154,79 +1158,79 @@ msgstr "Jahr"
 msgid "Rating"
 msgstr "Bewertung"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:195
+#: ../src/Clients/Booter/Booter/Entry.cs:199
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:322
 msgid "Score"
 msgstr "Punktzahl"
 
 #. Translators: noun
-#: ../src/Clients/Booter/Booter/Entry.cs:196
+#: ../src/Clients/Booter/Booter/Entry.cs:200
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:143
 msgid "Bit Rate"
 msgstr "Bitrate"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:199
+#: ../src/Clients/Booter/Booter/Entry.cs:203
 msgid "User Interface Options"
 msgstr "Optionen der Benutzeroberfläche"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:200
+#: ../src/Clients/Booter/Booter/Entry.cs:204
 msgid "Present the user interface on the active workspace"
 msgstr "Die Benutzeroberfläche auf der aktuellen Arbeitsfläche anzeigen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:201
+#: ../src/Clients/Booter/Booter/Entry.cs:205
 msgid "Enter the full-screen mode"
 msgstr "Vollbildmodus einschalten"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:202
+#: ../src/Clients/Booter/Booter/Entry.cs:206
 msgid "Hide the user interface"
 msgstr "Benutzeroberfläche verbergen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:203
+#: ../src/Clients/Booter/Booter/Entry.cs:207
 msgid "Do not present the user interface, regardless of any other options"
 msgstr ""
 "Die Benutzeroberfläche nicht anzeigen, alle gegenteiligen Optionen ignorieren"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:204
+#: ../src/Clients/Booter/Booter/Entry.cs:208
 msgid "Present the import media dialog box"
 msgstr "Dialog zum Importieren von Medien anzeigen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:205
+#: ../src/Clients/Booter/Booter/Entry.cs:209
 msgid "Present the about dialog"
 msgstr "Infodialog anzeigen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:206
+#: ../src/Clients/Booter/Booter/Entry.cs:210
 msgid "Present the open location dialog"
 msgstr "Dialog zum Öffnen von Orten anzeigen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:207
+#: ../src/Clients/Booter/Booter/Entry.cs:211
 msgid "Present the preferences dialog"
 msgstr "Einstellungsdialog anzeigen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:210
+#: ../src/Clients/Booter/Booter/Entry.cs:214
 msgid "Debugging and Development Options"
 msgstr "Optionen für Entwickler und zur Fehlerdiagnose"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:211
+#: ../src/Clients/Booter/Booter/Entry.cs:215
 msgid "Enable general debugging features"
 msgstr "Fehlerdiagnosefunktionen allgemein aktivieren"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:212
+#: ../src/Clients/Booter/Booter/Entry.cs:216
 msgid "Enable debugging output of SQL queries"
 msgstr "Fehlerdiagnoseausgabe von SQL-Abfragen aktivieren"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:213
+#: ../src/Clients/Booter/Booter/Entry.cs:217
 msgid "Enable debugging output of Mono.Addins"
 msgstr "Fehlerdiagnoseausgabe von Mono.Addins aktivieren"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:214
+#: ../src/Clients/Booter/Booter/Entry.cs:218
 msgid "Specify an alternate database to use"
 msgstr "Eine alternative Datenbank angeben"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:215
+#: ../src/Clients/Booter/Booter/Entry.cs:219
 msgid "Specify an alternate key, default is /apps/banshee-1/"
 msgstr "Einen alternativen Schlüssel eingeben, Standard ist /apps/banshee-1/"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:216
+#: ../src/Clients/Booter/Booter/Entry.cs:220
 msgid ""
 "Optimize instance for running uninstalled; most notably, this will create an "
 "alternate Mono.Addins database in the working directory"
@@ -1235,18 +1239,18 @@ msgstr ""
 "hauptsächlich eine alternative Mono.Addins-Datenbank im Arbeitsordner "
 "erstellen"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:218
+#: ../src/Clients/Booter/Booter/Entry.cs:222
 msgid "Disable DBus support completely"
 msgstr "DBus-Unterstützung komplett deaktivieren"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:220
+#: ../src/Clients/Booter/Booter/Entry.cs:224
 #, csharp-format
 msgid "Skip loading a custom gtkrc file ({0}) if it exists"
 msgstr ""
 "Das Laden einer benutzerdefinierten gtkrc-Datei ({0}) überspringen, falls "
 "diese existiert"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:251
+#: ../src/Clients/Booter/Booter/Entry.cs:255
 #, csharp-format
 msgid "The following help arguments are invalid: {0}"
 msgstr "Die folgenden Hilfeoptionen sind ungültig: {0}"
@@ -1261,9 +1265,9 @@ msgid "En_queue"
 msgstr "_Warteschlange"
 
 #: ../src/Clients/Muinshee/Muinshee/BaseDialog.cs:86
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:66
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:196
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:86
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:73
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:210
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:126
 msgid "_Play"
 msgstr "_Wiedergabe"
 
@@ -1293,7 +1297,7 @@ msgid "Play Song"
 msgstr "Titel wiedergeben"
 
 #. Translators: this is a verb (command), not a noun (things)
-#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:457
+#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:465
 msgid "Search"
 msgstr "Suche"
 
@@ -1353,7 +1357,7 @@ msgid "Stream location not found"
 msgstr "Ort des Datenstroms nicht gefunden"
 
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:347
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:324
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:328
 msgid "File not found"
 msgstr "Datei nicht gefunden"
 
@@ -1383,7 +1387,7 @@ msgid "_Restart Video"
 msgstr "Video _neu beginnen"
 
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:425
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:86
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:93
 msgid "_Restart Song"
 msgstr "Titel _neu beginnen"
 
@@ -1404,7 +1408,7 @@ msgid "_Jump to Playing Video"
 msgstr "Zum laufenden Video _springen"
 
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:445
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:82
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:89
 msgid "_Jump to Playing Song"
 msgstr "Zum _laufenden Titel springen"
 
@@ -1414,35 +1418,35 @@ msgstr "Zum laufenden Objekt _springen"
 
 #. Translators: This is used to generate bookmark names. {0} is track title, {1} is minutes
 #. (possibly more than two digits) and {2} is seconds (between 00 and 60).
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/Bookmark.cs:173
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/Bookmark.cs:172
 #, csharp-format
 msgid "{0} ({1}:{2:00})"
 msgstr "{0} ({1}:{2:00})"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs:70
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs:69
 #, csharp-format
 msgid "All Albums ({0})"
 msgstr "Alle Alben ({0})"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs:69
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs:68
 #, csharp-format
 msgid "All Artists ({0})"
 msgstr "Alle Künstler ({0})"
 
 #: ../src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseQueryFilterModel.cs:48
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:90
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:96
 msgid "Value"
 msgstr "Wert"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByAlbum.cs:50
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByAlbum.cs:49
 msgid "Shuffle by A_lbum"
 msgstr "_Alben zufällig wiedergeben"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByAlbum.cs:51
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByAlbum.cs:50
 msgid "by album"
 msgstr "nach Album"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByAlbum.cs:52
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByAlbum.cs:51
 msgid "Play all songs from an album, then randomly choose another album"
 msgstr "Alle Titel eines Albums wiedergeben, dann ein zufälliges anderes wählen"
 
@@ -1459,27 +1463,27 @@ msgid "Play all songs by an artist, then randomly choose another artist"
 msgstr ""
 "Alle Titel eines Künstlers wiedergeben, dann einen zufälligen anderen wählen"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByOff.cs:36
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByOff.cs:38
 msgid "Shuffle _Off"
 msgstr "_Keine Zufallswiedergabe"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByOff.cs:37
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByOff.cs:39
 msgid "manually"
 msgstr "manuell"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByOff.cs:38
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByOff.cs:40
 msgid "Do not shuffle playlist"
 msgstr "Wiedergabeliste nicht zufällig abspielen"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByRating.cs:46
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByRating.cs:45
 msgid "Shuffle by _Rating"
 msgstr "Titel zufällig anhand der _Bewertung wiedergeben"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByRating.cs:47
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByRating.cs:46
 msgid "by rating"
 msgstr "nach Bewertung"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByRating.cs:48
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByRating.cs:47
 msgid "Play songs randomly, prefer higher rated songs"
 msgstr ""
 "Titel zufällig wiedergeben, wobei besser bewertete Titel bevorzugt werden"
@@ -1497,15 +1501,15 @@ msgid "Play songs randomly, prefer higher scored songs"
 msgstr ""
 "Titel zufällig wiedergeben, wobei Titel mit höherer Punktzahl bevorzugt werden"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByTrack.cs:47
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByTrack.cs:46
 msgid "Shuffle by _Song"
 msgstr "_Titel zufällig wiedergeben"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByTrack.cs:48
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByTrack.cs:47
 msgid "by song"
 msgstr "nach Titel"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByTrack.cs:49
+#: ../src/Core/Banshee.Services/Banshee.Collection.Database/RandomByTrack.cs:48
 msgid "Play songs randomly from the playlist"
 msgstr "Zufällige Titel aus der Wiedergabeliste spielen"
 
@@ -1514,7 +1518,7 @@ msgid "Scanning for media"
 msgstr "Suche nach Medien läuft"
 
 #: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:188
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1382
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1384
 msgid "Scanning..."
 msgstr "Einlesen …"
 
@@ -1539,23 +1543,23 @@ msgstr "Der Import-Vorgang läuft momentan. Möchten Sie diesen stoppen?"
 msgid "Importing {0} of {1}"
 msgstr "{0} von {1} werden importiert"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection/RescanPipeline.cs:79
+#: ../src/Core/Banshee.Services/Banshee.Collection/RescanPipeline.cs:78
 #, csharp-format
 msgid "Rescanning {0} of {1}"
 msgstr "{0} von {1} werden neu eingelesen"
 
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:234
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:232
 msgid "Upgrading your Banshee Database"
 msgstr "Ihre Banshee-Datenbank wird aktualisiert"
 
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:235
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:233
 msgid ""
 "Please wait while your old Banshee database is migrated to the new format."
 msgstr ""
 "Bitte warten Sie, während Ihre alte Banshee-Datenbank in das neue Format "
 "konvertiert wird."
 
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1379
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1381
 msgid "Refreshing Metadata"
 msgstr "Metadaten werden aktualisiert"
 
@@ -1627,10 +1631,6 @@ msgstr "Soft Rock"
 msgid "Techno"
 msgstr "Techno"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/HomeDirectoryImportSource.cs:48
-msgid "Home Folder"
-msgstr "Persönlicher Ordner"
-
 #: ../src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs:58
 msgid "Remove From Library"
 msgstr "Aus der Bibliothek entfernen"
@@ -1706,110 +1706,118 @@ msgid "Grouping"
 msgstr "Gruppierung"
 
 #. Catalog.GetString ("Music Library")
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:59
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:60
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/MusicGroupSource.cs:39
 msgid "Music"
 msgstr "Musik"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:65
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:66
 msgid "Search your music"
 msgstr "Ihre Musik durchsuchen"
 
 #. Misc section
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:79
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:80
 #: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:65
 msgid "Miscellaneous"
 msgstr "Diverses"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:82
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:83
 msgid "_Sort an artist's albums by year, not title"
 msgstr "Alben eines Künstlers nach Jahr _sortieren, nicht nach Titel"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:93
 #, csharp-format
 msgid "{0} song"
 msgid_plural "{0} songs"
 msgstr[0] "{0} Titel"
 msgstr[1] "{0} Titel"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:113
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
 msgid "Music Folder"
 msgstr "Musik-Ordner"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:118
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
 #: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:95
 msgid "Favorites"
 msgstr "Favoriten"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:120
 msgid "Songs rated four and five stars"
 msgstr "Titel, die mit vier oder fünf Sternen bewertet wurden"
 
 # CHECK
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:123
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:124
 msgid "Recent Favorites"
 msgstr "Aktuelle Favoriten"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:124
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
 msgid "Songs listened to often in the past week"
 msgstr "Titel, die Sie in der letzten Woche oft gehört haben"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:128
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:129
 #: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:95
 msgid "Recently Added"
 msgstr "Zuletzt hinzugefügt"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:129
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:130
 msgid "Songs imported within the last week"
 msgstr "Titel, die in der letzten Woche importiert wurden"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:133
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:134
+msgid "Recently Played"
+msgstr "Zuletzt wiedergegeben"
+
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:135
+msgid "Recently played songs"
+msgstr "Zuletzt wiedergegebene Titel"
+
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:139
 msgid "Unheard"
 msgstr "Nicht gehört"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:134
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:140
 msgid "Songs that have not been played or skipped"
 msgstr "Titel, die noch nicht gespielt oder übersprungen wurden"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:141
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:147
 msgid "Neglected Favorites"
 msgstr "Nicht beachtete Favoriten"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:142
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:148
 msgid "Favorites not played in over two months"
 msgstr "Favoriten, die in den letzten zwei Wochen nicht gespielt wurden"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:146
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:152
 msgid "Least Favorite"
 msgstr "Sehr unerwünschte Titel"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:147
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:153
 msgid "Songs rated one or two stars or that you have frequently skipped"
 msgstr ""
 "Titel, die mit einem oder zwei Sternen bewertet wurden oder die Sie oft "
 "übersprungen haben"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:151
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:157
 msgid "700 MB of Favorites"
 msgstr "700 MB der Favoriten"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:152
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:158
 msgid "A data CD worth of favorite songs"
 msgstr "Eine Daten-CD voll mit Favoriten"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:157
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:163
 msgid "80 Minutes of Favorites"
 msgstr "80 Minuten der Favoriten"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:158
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:164
 msgid "An audio CD worth of favorite songs"
 msgstr "Eine Audio-CD voll mit Favoriten"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:163
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:169
 msgid "Unrated"
 msgstr "Unbewertet"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:164
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:170
 msgid "Songs that haven't been rated"
 msgstr "Titel, die noch nicht bewertet wurden"
 
@@ -1943,11 +1951,6 @@ msgstr "Bewertungen _importieren"
 msgid "Import play _counts"
 msgstr "Wieder_gabeanzahlwerte importieren"
 
-#. disabled by default
-#: ../src/Core/Banshee.Services/Banshee.Metrics/BansheeMetrics.cs:312
-msgid "Improve Banshee by sending anonymous usage data"
-msgstr "Verbessern von Banshee durch anonymes Senden von Benutzerdaten"
-
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:52
 msgid "There is no available network connection"
 msgstr "Keine Netzwerkverbindung verfügbar"
@@ -1973,34 +1976,34 @@ msgstr ""
 "Einige Funktionen erfordern eine Breitbandverbindung mit dem Internet, wie "
 "etwa Last.fm oder die Abfrage von Cover-Bildern"
 
-#: ../src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs:160
+#: ../src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs:159
 msgid "Search this playlist"
 msgstr "Diese Wiedergabeliste durchsuchen"
 
-#: ../src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs:229
+#: ../src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs:228
 msgid "The track's rating was set differently on the device and in Banshee"
 msgstr "Unterschiedliche Bewertung des Titels am Gerät und in Banshee"
 
-#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:59
+#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:58
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "Playlist"
 msgstr "Wiedergabeliste"
 
-#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:134
+#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:133
 msgid "Remove From Playlist"
 msgstr "Aus der Wiedergabeliste entfernen"
 
-#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:135
+#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:134
 msgid "Delete Playlist"
 msgstr "Wiedergabeliste löschen"
 
 #. TODO generate name based on the track selection, or begin editing it
-#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:386
-#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:392
+#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:385
+#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:391
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:176
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:95
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:394
-#: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs:542
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:135
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:462
+#: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs:591
 #: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView_DragAndDrop.cs:214
 msgid "New Playlist"
 msgstr "Neue Wiedergabeliste"
@@ -2047,6 +2050,10 @@ msgstr "Dateirichtlinien"
 msgid "Co_py files to media folders when importing"
 msgstr "Beim Importieren alle Dateien in den Medienordner _kopieren"
 
+#: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:69
+msgid "Improve Banshee by sending anonymous usage data"
+msgstr "Verbessern von Banshee durch anonymes Senden von Benutzerdaten"
+
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:63
 msgid "items"
 msgstr "Elemente"
@@ -2217,7 +2224,7 @@ msgstr "Quantisierung"
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:169
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:363
 #: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:666
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:89
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:95
 msgid "Name"
 msgstr "Name"
 
@@ -2469,7 +2476,7 @@ msgid "importedon"
 msgstr "Importdatum"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:315
-#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:66
+#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:65
 msgid "Smart Playlist"
 msgstr "Intelligente Wiedergabeliste"
 
@@ -2548,6 +2555,7 @@ msgstr "Früher hinzugefügt"
 #. Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:44
 #: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:46
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:146
 #: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs:97
 msgid "None"
 msgstr "Keine"
@@ -2602,10 +2610,10 @@ msgstr "drm"
 #: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:64
 #: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:66
 #: ../src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs:354
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:208
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:210
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:212
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:383
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:234
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:236
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:238
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:389
 msgid "Unknown"
 msgstr "Unbekannt"
 
@@ -2614,27 +2622,27 @@ msgid "unknown"
 msgstr "unbekannt"
 
 # CHECK
-#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs:79
+#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs:78
 msgid "Unable to Migrate Smart Playlists"
 msgstr "Intelligente Wiedergabelisten konnten nicht migriert werden"
 
 # CHECK
-#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs:80
+#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs:79
 #, csharp-format
 msgid "Please file a bug with this error: {0}"
 msgstr "Bitte melden Sie den folgenden Fehler an die Entwickler: {0}"
 
-#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:67
+#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:66
 #: ../src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs:49
 msgid "Edit Smart Playlist"
 msgstr "Intelligente Wiedergabeliste bearbeiten"
 
-#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:242
+#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:249
 msgid "Delete Smart Playlist"
 msgstr "Intelligente Wiedergabeliste löschen"
 
 #: ../src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs:147
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:163
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:161
 #, csharp-format
 msgid "All Genres ({0})"
 msgstr "Alle Genres ({0})"
@@ -2687,6 +2695,7 @@ msgstr "Fehler"
 #: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:84
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ErrorListDialog.cs:79
 #: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:251
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:176
 msgid "Details"
 msgstr "Details"
 
@@ -2715,12 +2724,12 @@ msgstr "Ordnerhie_rarchie"
 msgid "File _name"
 msgstr "Datei_name"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:693
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:669
 #, csharp-format
 msgid "Adding {0} of {1} to {2}"
 msgstr "{0} von {1} wird zu {2} hinzugefügt"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:712
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:688
 #, csharp-format
 msgid "Deleting {0} of {1} From {2}"
 msgstr "{0} von {1} wird aus {2} entfernt"
@@ -2939,19 +2948,19 @@ msgstr "Neue Voreinstellung"
 msgid "{0} by {1}"
 msgstr "{0} von {1}"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BookmarkUI.cs:87
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BookmarkUI.cs:86
 msgid "_Bookmarks"
 msgstr "_Lesezeichen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BookmarkUI.cs:90
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BookmarkUI.cs:89
 msgid "_Add Bookmark"
 msgstr "Lesezeichen _hinzufügen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BookmarkUI.cs:91
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BookmarkUI.cs:90
 msgid "Bookmark the Position in the Current Track"
 msgstr "Lesezeichen für die Position im aktuellen Titel anlegen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BookmarkUI.cs:104
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BookmarkUI.cs:103
 msgid "_Remove Bookmark"
 msgstr "Lesezeichen _entfernen"
 
@@ -3026,7 +3035,7 @@ msgid "Make Banshee the Default"
 msgstr "Banshee als Vorgabe festlegen"
 
 #. Translators: verb
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs:52
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs:53
 msgid "I_mport"
 msgstr "I_mportieren"
 
@@ -3133,113 +3142,105 @@ msgid "_Contents"
 msgstr "_Inhalt"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:95
-msgid "_Web Resources"
-msgstr "_Web-Ressourcen"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:98
-msgid "Banshee _User Guide (Wiki)"
-msgstr "Banshee-_Benutzerhandbuch (Wiki)"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:99
-msgid "Learn about how to use Banshee"
-msgstr "Die Benutzung von Banshee kennenlernen"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:104
 msgid "Advanced Collection Searching"
 msgstr "Erweiterte Suche in der Bibliothek"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:105
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:96
 msgid "Learn advanced ways to search your media collection"
 msgstr ""
 "Lernen Sie fortgeschrittene Wege kennen, um in Ihrer Mediensammlung zu suchen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:110
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:101
 msgid "Banshee _Home Page"
 msgstr "Banshee-_Homepage"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:111
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:102
 msgid "Visit the Banshee Home Page"
 msgstr "Besuchen Sie die Banshee-Homepage"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:116
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:107
 msgid "_Get Involved"
 msgstr "_Mitarbeit"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:117
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:108
 msgid "Become a contributor to Banshee"
 msgstr "Sich an der Entwicklung von Banshee beteiligen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:122
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:113
 msgid "_Version Information"
 msgstr "_Versionsinformation"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:123
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:114
 msgid "View detailed version and configuration information"
 msgstr "Detaillierte Versions- und Konfigurationsinformationen ansehen"
 
 #. Prompt user for location of the playlist.
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:178
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:169
 msgid "Import Playlist"
 msgstr "Wiedergabeliste importieren"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:179
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:559
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:170
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:558
 msgid "Playlists"
 msgstr "Wiedergabelisten"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:67
-msgid "Play or pause the current item"
-msgstr "Aktuelles Element wiedergeben oder unterbrechen"
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:69
+msgid "Play the current item"
+msgstr "Aktuelles Element wiedergeben"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:70
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:77
 msgid "_Next"
 msgstr "W_eiter"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:71
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:78
 msgid "Play the next item"
 msgstr "Nächstes Element wiedergeben"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:74
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:81
 msgid "Pre_vious"
 msgstr "_Zurück"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:75
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:82
 msgid "Play the previous item"
 msgstr "Vorheriges Element wiedergeben"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:78
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:85
 msgid "Seek _To..."
 msgstr "Zu Posi_tion bewegen …"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:79
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:86
 msgid "Seek to a specific location in current item"
 msgstr "Zu einer bestimmten Position im aktuellen Element bewegen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:83
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:90
 msgid "Jump to the currently playing item"
 msgstr "Zum momentan laufenden Element springen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:87
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:94
 msgid "Restart the current item"
 msgstr "Den aktuellen Titel neu beginnen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:92
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:99
 msgid "_Stop When Finished"
 msgstr "Am Ende _stoppen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:93
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:100
 msgid "Stop playback after the current item finishes playing"
 msgstr "Die Wiedergabe nach dem aktuellen Element stoppen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:99
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:106
 msgid "_Playback"
 msgstr "_Wiedergabe"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:190
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:203
 msgid "_Pause"
 msgstr "_Pause"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:202
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:205
+msgid "Pause the current item"
+msgstr "Aktuelles Element unterbrechen"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:217
 msgid "Sto_p"
 msgstr "Sto_pp"
 
@@ -3275,10 +3276,49 @@ msgstr "Den aktuell laufenden Titel wiederholen"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:79
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:80
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:83
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:84
 msgid "Shuffle"
 msgstr "Zufallswiedergabe"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:62
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:63
+msgid "Subtitle"
+msgstr "Untertitel"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:65
+msgid "Load File..."
+msgstr "Ladevorgang …"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:66
+msgid "Load subtitle file"
+msgstr "Untertiteldatei laden"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:79
+msgid "Load Subtitle File"
+msgstr "Untertiteldatei laden"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:88
+msgid "L_oad"
+msgstr "La_den"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:97
+msgid "Subtitle files"
+msgstr "Untertiteldateien"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:128
+#, csharp-format
+msgid "Subtitle {0}"
+msgstr "Untertitel {0}"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:132
+#, csharp-format
+msgid "Activate embedded subtitle {0}"
+msgstr "Eingebettete {0}-Untertitel aktivieren"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:147
+msgid "Hide subtitles"
+msgstr "Untertitel verbergen"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:75
 msgid "_New Playlist"
 msgstr "_Neue Wiedergabeliste"
@@ -3352,7 +3392,7 @@ msgstr "Neue _intelligente Wiedergabeliste"
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:129
 #: ../src/Extensions/Banshee.Fixup/Banshee.Fixup/FixSource.cs:84
 #: ../src/Extensions/Banshee.LastfmStreaming/Banshee.LastfmStreaming/LastfmStreamingActions.cs:67
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:78
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:79
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:72
 msgid "Refresh"
 msgstr "Aktualisieren"
@@ -3374,141 +3414,141 @@ msgstr "Sind Sie sicher, dass Sie {0} löschen möchten?"
 msgid "Separate by Type"
 msgstr "Nach Typ trennen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:70
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:110
 msgid "Select _All"
 msgstr "_Alles auswählen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:71
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:111
 msgid "Select all tracks"
 msgstr "Alle Titel auswählen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:74
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:114
 msgid "Select _None"
 msgstr "_Nichts auswählen"
 
 # CHECK
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:75
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:115
 msgid "Unselect all tracks"
 msgstr "Auswahl aufheben"
 
 # CHECK
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:78
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:118
 #: ../src/Extensions/Banshee.Audiobook/Banshee.Audiobook/Actions.cs:59
 msgid "_Edit Track Information"
 msgstr "Titelinformationen _bearbeiten"
 
 # CHECK
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:79
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:119
 msgid "Edit information on selected tracks"
 msgstr "Informationen der ausgewählten Titel bearbeiten"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:82
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:252
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:122
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:283
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:117
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:159
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:164
 msgid "Properties"
 msgstr "Eigenschaften"
 
 # CHECK
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:83
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:123
 msgid "View information on selected tracks"
 msgstr "Informationen der ausgewählten Titel ansehen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:87
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:127
 msgid "Play the selected item"
 msgstr "Ausgewähltes Element wiedergeben"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:90
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:130
 msgid "Add _to Playlist"
 msgstr "_Zur Wiedergabeliste hinzufügen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:91
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:131
 msgid "Append selected items to playlist or create new playlist from selection"
 msgstr ""
 "Ausgewählte Elemente zur Wiedergabeliste hinzufügen oder neue Wiedergabeliste "
 "aus der Auswahl erstellen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:96
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:136
 msgid "Create new playlist from selected tracks"
 msgstr "Neue Wiedergabeliste mit den ausgewählten Titeln erstellen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:100
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:140
 msgid "_Remove"
 msgstr "_Entfernen"
 
 # CHECK: Wie ist das gemeint?
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:101
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:141
 msgid "Remove selected track(s) from this source"
 msgstr "Ausgewählte(n) Titel aus dieser Quelle entfernen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:104
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:144
 msgid "Remove From _Library"
 msgstr "Aus der _Bibliothek entfernen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:105
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:145
 msgid "Remove selected track(s) from library"
 msgstr "Ausgewählte(n) Titel aus der Bibliothek entfernen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:108
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:148
 msgid "_Open Containing Folder"
 msgstr "Enthaltenen _Ordner öffnen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:109
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:149
 msgid "Open the folder that contains the selected item"
 msgstr "Den Ordner öffnen, der das gewählte Objekt enthält"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:112
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:152
 msgid "_Delete From Drive"
 msgstr "Vom Laufwerk _löschen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:113
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:153
 msgid "Permanently delete selected item(s) from medium"
 msgstr "Ausgewählte(s) Element(e) dauerhaft vom Speichermedium löschen"
 
 #. Translators: this is a verb (command), not a noun (things)
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:119
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:159
 #: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:170
 #: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/SearchEntry.cs:112
 #, csharp-format
 msgid "_Search"
 msgstr "_Suchen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:120
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:160
 msgid "Search for items matching certain criteria"
 msgstr "Nach Elementen suchen, die bestimmte Kriterien erfüllen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:123
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:163
 msgid "By Matching _Album"
 msgstr "Nach Übereinstimmung des _Albums"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:124
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:164
 msgid "Search all songs of this album"
 msgstr "Alle Titel aus diesem Album suchen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:127
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:167
 msgid "By Matching A_rtist"
 msgstr "Nach Übereinstimmung des _Künstlers"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:128
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:168
 msgid "Search all songs of this artist"
 msgstr "Alle Titel dieses Künstlers suchen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:258
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:322
 #, csharp-format
 msgid "_Delete From \"{0}\""
 msgstr "Von {0} _löschen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:464
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:542
 msgid "The folder could not be found."
 msgstr "Der Ordner konnte nicht gefunden werden."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:465
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:543
 msgid "Please check that the track's location is accessible by the system."
 msgstr ""
 "Bitte überprüfen Sie, ob der Zugriff zum Ort des Titels auf dem System "
 "möglich ist."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:535
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:620
 #, csharp-format
 msgid "Are you sure you want to permanently delete this item?"
 msgid_plural ""
@@ -3518,16 +3558,16 @@ msgstr[1] ""
 "Sind Sie sicher, dass Sie die {0} ausgewählten Elemente dauerhaft löschen "
 "möchten?"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:539
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:624
 msgid "If you delete the selection, it will be permanently lost."
 msgstr "Wenn Sie die Auswahl löschen, geht diese für Sie dauerhaft verloren."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:542
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:627
 #, csharp-format
 msgid "Remove selection from {0}?"
 msgstr "Auswahl aus {0} entfernen?"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:545
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:630
 #, csharp-format
 msgid "Are you sure you want to remove the selected item from your {1}?"
 msgid_plural ""
@@ -3742,122 +3782,122 @@ msgstr "Alle sortierten Albumtitel auf diesen Wert setzen"
 msgid "Sort Album Title:"
 msgstr "Sortierter Albumtitel:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:159
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:185
 msgid "File Name:"
 msgstr "Dateiname:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:160
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:186
 msgid "Directory:"
 msgstr "Ordner:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:161
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:187
 msgid "Full Path:"
 msgstr "Vollständiger Pfad:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:167
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:193
 msgid "URI:"
 msgstr "Adresse:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:176
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:202
 msgid "Duration:"
 msgstr "Dauer:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:179
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:205
 msgid "Audio Bitrate:"
 msgstr "Audio-Bitrate:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:181
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:207
 msgid "Audio Sample Rate:"
 msgstr "Audio-Abtastrate:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:183
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:209
 msgid "Audio Channels:"
 msgstr "Audio-Kanäle:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:185
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:211
 msgid "Bits Per Sample:"
 msgstr "Bits pro Sample."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:190
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:216
 msgid "Video Dimensions:"
 msgstr "Video-Abmessungen:"
 
 #. Translators: {0} is the description of the codec
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:197
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:223
 #, csharp-format
 msgid "{0} Codec:"
 msgstr "{0}-Codec:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:202
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:228
 msgid "Container Formats:"
 msgstr "Container-Formate:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:207
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:233
 msgid "Imported On:"
 msgstr "Importiert am:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:209
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:235
 msgid "Last Played:"
 msgstr "Zuletzt wiedergegeben:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:211
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:237
 msgid "Last Skipped:"
 msgstr "Zuletzt übersprungen:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:213
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:239
 msgid "Play Count:"
 msgstr "Wiedergabeanzahl:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:214
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:240
 msgid "Skip Count:"
 msgstr "Überspringanzahl:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:215
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:241
 msgid "Score:"
 msgstr "Punktzahl:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:221
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:247
 msgid "File Size:"
 msgstr "Dateigröße:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:222
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:248
 #: ../src/Hyena/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs:61
 msgid "bytes"
 msgstr "Bytes"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:95
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:97
 msgid "Track Editor"
 msgstr "Titeleditor"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:95
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:97
 msgid "Track Properties"
 msgstr "Titeleigenschaften"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:147
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:151
 msgid "Show the previous track"
 msgstr "Vorherigen Titel anzeigen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:153
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:157
 msgid "Show the next track"
 msgstr "Nächsten Titel anzeigen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:183
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:187
 msgid "Title:"
 msgstr "Titel:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:184
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:188
 msgid "Artist:"
 msgstr "Künstler:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:185
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:189
 msgid "Album:"
 msgstr "Album:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:309
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:313
 msgid "Sync all field _values"
 msgstr "Alle _Feldwerte abgleichen"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:314
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:318
 msgid ""
 "Apply the values of all common fields set for this track to all of the tracks "
 "selected in this editor"
@@ -3865,23 +3905,23 @@ msgstr ""
 "Die Werte aller gemeinsamen Felder in diesem Titel auf alle im Editor "
 "ausgewählten Titel anwenden."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:413
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:418
 #, csharp-format
 msgid "<i>Editing {0} of {1} items</i>"
 msgstr "<i>Element {0} von {1} bearbeiten</i>"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:675
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:698
 #, csharp-format
 msgid "Save the changes made to the open track?"
 msgid_plural "Save the changes made to {0} of {1} open tracks?"
 msgstr[0] "Änderungen am offenen Titel speichern?"
 msgstr[1] "Änderungen an {0} von {1} offenen Titeln speichern?"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:692
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:715
 msgid "Close _without Saving"
 msgstr "Beenden _ohne zu speichern"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:729
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:752
 #, csharp-format
 msgid "If you don't save, changes from the last {0} will be permanently lost."
 msgstr ""
@@ -4027,10 +4067,8 @@ msgid "Files"
 msgstr "Dateien"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:63
-#: ../src/Extensions/Banshee.AmazonMp3/Banshee.AmazonMp3/ImportSource.cs:67
-#: ../src/Extensions/Banshee.Emusic/Banshee.Emusic/EmusicImport.cs:82
-msgid "C_hoose Files"
-msgstr "Dateien wä_hlen"
+msgid "C_hoose Files..."
+msgstr "Dateien wä_hlen …"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:81
 msgid "_Files to import:"
@@ -4057,8 +4095,8 @@ msgid "Folders"
 msgstr "Ordner"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:57
-msgid "C_hoose Folders"
-msgstr "Ordner _wählen"
+msgid "C_hoose Folders..."
+msgstr "Ordner _wählen …"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:75
 msgid "_Folders to import:"
@@ -4090,14 +4128,10 @@ msgstr "Diesen Dialog nicht mehr anzeigen"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/ImportDialog.cs:130
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:82
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:384
 msgid "_Import"
 msgstr "I_mportieren"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs:69
-msgid "Videos From Photos Folder"
-msgstr "Videos aus dem Foto-Ordner"
-
 #: ../src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs:86
 msgid "No available profiles"
 msgstr "Keine verfügbaren Profile"
@@ -4241,28 +4275,28 @@ msgstr "Stummgeschaltet"
 msgid "Full Volume"
 msgstr "Volle Lautstärke"
 
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:101
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:102
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:102
 msgid "Device"
 msgstr "Gerät"
 
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:102
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:103
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:104
 msgid "Generation"
 msgstr "Generation"
 
 #. FIXME
 #. AddDapProperty (Catalog.GetString ("Color"), "black");
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:107
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:108
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:105
 msgid "Capacity"
 msgstr "Kapazität"
 
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:108
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:109
 msgid "Available"
 msgstr "Verfügbar"
 
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:109
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:110
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:106
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:141
 msgid "Serial number"
@@ -4273,42 +4307,42 @@ msgstr "Seriennummer"
 #. string [] capabilities = new string [ipod_device.ModelInfo.Capabilities.Count];
 #. ipod_device.ModelInfo.Capabilities.CopyTo (capabilities, 0);
 #. AddDapProperty (Catalog.GetString ("Capabilities"), String.Join (", ", capabilities));
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:116
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:117
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:113
 msgid "Supports cover art"
 msgstr "Alben-Cover werden unterstützt"
 
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:117
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:118
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:114
 msgid "Supports photos"
 msgstr "Fotos werden unterstützt"
 
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:412
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:413
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:491
 msgid "Track duration is zero"
 msgstr "Dauer des Titels ist 0 Sekunden"
 
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:515
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:516
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:694
 msgid "Syncing iPod"
 msgstr "iPod wird abgeglichen"
 
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:516
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:517
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:695
 msgid "Preparing to synchronize..."
 msgstr "Abgleich wird vorbereitet …"
 
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:519
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:520
 #, csharp-format
 msgid "Adding track {0} of {1}"
 msgstr "Titel {0} von {1} wird hinzugefügt"
 
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:555
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:556
 #, csharp-format
 msgid "Removing track {0} of {1}"
 msgstr "Titel {0} von {1} wird entfernt"
 
-#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:619
+#: ../src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs:620
 msgid "Writing media database"
 msgstr "Medien-Datenbank wird gespeichert"
 
@@ -4342,23 +4376,23 @@ msgstr "Produkt"
 msgid "Vendor"
 msgstr "Hersteller"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:280
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:142
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:284
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:140
 #, csharp-format
 msgid "Loading {0}"
 msgstr "{0} wird geladen"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:364
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:370
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellYesNo.cs:37
 msgid "Yes"
 msgstr "Ja"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:364
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:370
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellYesNo.cs:38
 msgid "No"
 msgstr "Nein"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:385
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:391
 #, csharp-format
 msgid ""
 "The {0} format is not supported by the device, and no converter was found to "
@@ -4367,11 +4401,11 @@ msgstr ""
 "Das Format {0} wird vom Gerät nicht unterstützt und es wurde kein Konverter "
 "gefunden, um es umzuwandeln"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:391
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:397
 msgid "File format conversion support is not available"
 msgstr "Dateiformats-Umwandlung ist nicht verfügbar"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:417
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:423
 msgid "Error converting file"
 msgstr "Fehler beim Umwandeln einer Datei"
 
@@ -4713,6 +4747,11 @@ msgstr "Amazon MP3-Dateien"
 msgid "Amazon MP3 Purchase"
 msgstr "Amazon MP3-Kauf"
 
+#: ../src/Extensions/Banshee.AmazonMp3/Banshee.AmazonMp3/ImportSource.cs:67
+#: ../src/Extensions/Banshee.Emusic/Banshee.Emusic/EmusicImport.cs:81
+msgid "C_hoose Files"
+msgstr "Dateien wä_hlen"
+
 #: ../src/Extensions/Banshee.AmazonMp3.Store/Banshee.AmazonMp3.Store/StoreSource.cs:42
 #: ../src/Extensions/Banshee.AmazonMp3.Store/Banshee.AmazonMp3.Store/StoreWebBrowserShell.cs:39
 msgid "Amazon MP3 Store"
@@ -4817,8 +4856,9 @@ msgid "Book Title"
 msgstr "Buchtitel"
 
 #: ../src/Extensions/Banshee.Audiobook/Banshee.Audiobook/AudiobookLibrarySource.cs:68
-msgid "Audiobooks, etc"
-msgstr "Audiobooks usw."
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:307
+msgid "Audiobooks"
+msgstr "Hörbücher"
 
 #: ../src/Extensions/Banshee.Audiobook/Banshee.Audiobook/AudiobookLibrarySource.cs:75
 msgid "Search your audiobooks"
@@ -4844,7 +4884,7 @@ msgid "No Bookmark Set"
 msgstr "Keine Lesezeichen gesetzt"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs:76
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:55
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:56
 msgid "Audio CD"
 msgstr "Audio-CD"
 
@@ -4921,7 +4961,7 @@ msgstr ""
 "auf einer CD zu umgehen, aber verringert die Importgeschwindigkeit deutlich."
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:320
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:440
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:441
 msgid "Import CD"
 msgstr "CD importieren"
 
@@ -4937,46 +4977,46 @@ msgstr "CD kopieren"
 msgid "Duplicate this audio CD"
 msgstr "Diese Audio-CD kopieren"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:130
-msgid "Searching for CD metadata..."
-msgstr "Suchen nach Metadaten der CD …"
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:131
+msgid "Searching for track information..."
+msgstr "Nach Titelinformationen wird gesucht …"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:163
-msgid "Could not fetch metadata for CD."
-msgstr "Metadaten für die CD konnten nicht abgefragt werden."
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:164
+msgid "Could not fetch track information"
+msgstr "Titelinformationen konnten nicht abgefragt werden"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:191
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:192
 msgid "Automatic import off since this album is already in the Music Library."
 msgstr ""
 "Der automatische Import wurde nicht durchgeführt, da sich dieses Album "
 "bereits in der Musikbibliothek befindet."
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:214
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:215
 msgid "Could not import CD"
 msgstr "CD konnte nicht importiert werden"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:231
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:232
 msgid "Could not duplicate audio CD"
 msgstr "Audio-CD konnte nicht kopiert werden"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:363
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:364
 msgid "Ejecting audio CD..."
 msgstr "Audio-CD wird ausgeworfen …"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:381
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:382
 #, csharp-format
 msgid "Could not eject audio CD: {0}"
 msgstr "Audio-CD konnte nicht ausgeworfen werden: {0}"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:414
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:415
 msgid "Audio CD Preferences"
 msgstr "Einstellungen für Audio-CDs"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:415
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:416
 msgid "Eject Disc"
 msgstr "CD auswerfen"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:439
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:440
 #, csharp-format
 msgid "Import ‟{0}”"
 msgstr "»{0}« importieren"
@@ -4985,33 +5025,33 @@ msgstr "»{0}« importieren"
 msgid "Detecting BPM"
 msgstr "BPM erkennen"
 
-#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:91
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:92
 msgid "D_etect"
 msgstr "_Erkennen"
 
-#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:103
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:104
 msgid "T_ap"
 msgstr "A_nschlag"
 
-#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:111
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:112
 msgid "Have Banshee attempt to auto-detect the BPM of this song"
 msgstr "Banshee soll versuchen, den BPM-Wert des Titels automatisch zu erkennen"
 
-#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:113
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:114
 msgid "Play this song"
 msgstr "Diesen Titel wiedergeben"
 
-#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:116
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:117
 msgid "Tap this button to the beat to set the BPM for this song manually"
 msgstr ""
 "Diesen Knopf zum Takt des Titels anklicken, um den BPM-Wert manuell zu "
 "bestimmen"
 
-#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs:148
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs:147
 msgid "_Automatically detect BPM for all songs"
 msgstr "BPM-Werte für alle Titel _automatisch erkennen"
 
-#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs:149
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs:148
 msgid ""
 "Detect beats per minute (BPM) for all songs that don't already have a value "
 "set"
@@ -5115,11 +5155,11 @@ msgstr "Anmelden"
 msgid "Connecting to {0}"
 msgstr "Mit {0} verbinden"
 
-#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs:178
+#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs:187
 msgid "Add Remote DAAP Server"
 msgstr "Entfernten DAAP-Server hinzufügen"
 
-#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs:179
+#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs:188
 msgid "Add a new remote DAAP server"
 msgstr "Neuen entfernten DAAP-Server hinzufügen"
 
@@ -5190,15 +5230,15 @@ msgstr "Herunterladen abbrechen"
 msgid "Waiting for downloads to terminate..."
 msgstr "Auf das Beenden des Herunterladens wird gewartet …"
 
-#: ../src/Extensions/Banshee.Emusic/Banshee.Emusic/EmusicImport.cs:60
+#: ../src/Extensions/Banshee.Emusic/Banshee.Emusic/EmusicImport.cs:59
 msgid "Import eMusic Downloads to Library"
 msgstr "eMusic-Downloads in Bibliothek importieren"
 
-#: ../src/Extensions/Banshee.Emusic/Banshee.Emusic/EmusicImport.cs:62
+#: ../src/Extensions/Banshee.Emusic/Banshee.Emusic/EmusicImport.cs:61
 msgid "eMusic Files"
 msgstr "eMusic-Dateien"
 
-#: ../src/Extensions/Banshee.Emusic/Banshee.Emusic/EmusicImport.cs:78
+#: ../src/Extensions/Banshee.Emusic/Banshee.Emusic/EmusicImport.cs:77
 msgid "eMusic Tracks"
 msgstr "eMusic-Titel"
 
@@ -5209,7 +5249,7 @@ msgstr "Dateisystem-Warteschlange"
 
 # CHECK
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:72
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:93
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:94
 msgid "Clear"
 msgstr "Leeren"
 
@@ -5218,7 +5258,7 @@ msgid "Remove all tracks from the file system queue"
 msgstr "Alle Titel aus der Dateisystem-Warteschlange entfernen"
 
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:79
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:102
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:103
 msgid "Clear on Quit"
 msgstr "Beim Beenden leeren"
 
@@ -5305,18 +5345,33 @@ msgstr ", {0}"
 msgid "Fix?"
 msgstr "Korrigieren?"
 
-#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:48
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:51
 msgid "View Item Details"
 msgstr "Details zur Folge"
 
-#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:57
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:60
 msgid "Open Webpage"
 msgstr "Webseite öffnen"
 
-#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:76
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:79
 msgid "Visit Archive.org"
 msgstr "Archive.org besuchen"
 
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:83
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:64
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:147
+msgid "Subscribe"
+msgstr "Abonnieren"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:84
+msgid "Subscribe to this search as a podcast"
+msgstr "Diese Suche als Podcast abonnieren"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:88
+#, csharp-format
+msgid "Internet Archive: {0}"
+msgstr "Internet-Archiv: {0}"
+
 #: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs:78
 msgid "Close Item"
 msgstr "Objekt schließen"
@@ -5342,8 +5397,8 @@ msgstr "Fehler beim Abrufen der Details der Folge aus dem Online-Archiv"
 #: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:205
 #: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:130
 #: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:66
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:138
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:286
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:136
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:281
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:89
 msgid "Description"
 msgstr "Beschreibung"
@@ -5375,6 +5430,7 @@ msgid "Publisher:"
 msgstr "Veröffentlicher:"
 
 #: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:230
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:173
 msgid "Keywords:"
 msgstr "Stichworte:"
 
@@ -5560,10 +5616,6 @@ msgstr ""
 msgid "Visit the Internet Archive online at archive.org"
 msgstr "Das Online-Archiv unter archive.org besuchen"
 
-#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:307
-msgid "Audiobooks"
-msgstr "Hörbücher"
-
 #: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:308
 #: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:78
 msgid "Movies"
@@ -5620,7 +5672,7 @@ msgstr "Weitere holen"
 #: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:128
 #: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:61
 #: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:98
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:137
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:135
 msgid "Creator"
 msgstr "Urheber"
 
@@ -5850,26 +5902,26 @@ msgstr "Ihre Sender durchsuchen"
 msgid "Edit Station"
 msgstr "Sender bearbeiten"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:136
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:134
 msgid "Station"
 msgstr "Sender"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:157
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:155
 #, csharp-format
 msgid "{0} station"
 msgid_plural "{0} stations"
 msgstr[0] "{0} Sender"
 msgstr[1] "{0} Sender"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:243
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:241
 msgid "Please provide a valid station URI"
 msgstr "Bitte geben Sie eine gültige Adresse für den Sender ein"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:256
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:254
 msgid "Please provide a station genre"
 msgstr "Bitte geben Sie ein Genre für den Sender ein"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:264
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:262
 msgid "Please provide a station title"
 msgstr "Bitte geben Sie einen Titel für den Sender ein"
 
@@ -5906,7 +5958,7 @@ msgid "Station Creator:"
 msgstr "Urheber des Senders:"
 
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs:123
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:81
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:171
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:89
 msgid "Description:"
 msgstr "Beschreibung:"
@@ -6336,15 +6388,15 @@ msgstr "lastfm://-Adresse"
 msgid "lastfm://"
 msgstr "lastfm://"
 
-#: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/MediaPanelContents.cs:109
+#: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/MediaPanelContents.cs:113
 msgid "Media"
 msgstr "Medien"
 
-#: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/MediaPanelContents.cs:119
+#: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/MediaPanelContents.cs:123
 msgid "Library"
 msgstr "Bibliothek"
 
-#: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/MediaPanelContents.cs:131
+#: ../src/Extensions/Banshee.MeeGo/Banshee.MeeGo/MediaPanelContents.cs:135
 msgid "Launch the Banshee Media Player"
 msgstr "Banshee Medien-Wiedergabeprogramm starten"
 
@@ -6403,6 +6455,7 @@ msgid "Show notifications when item changes"
 msgstr "Benachrichtigungen bei Elementwechsel anzeigen"
 
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:344
+#: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:209
 msgid "Still Running"
 msgstr "Läuft noch"
 
@@ -6412,9 +6465,10 @@ msgid ""
 "end your session."
 msgstr ""
 "Banshee wurde im Benachrichtigungsfeld verborgen. Benutzen Sie <i>Beenden</"
-"i>, um Ihre Sitzung zu Beenden."
+"i>, um Ihre Sitzung zu beenden."
 
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:480
+#: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:340
 msgid "Skip this item"
 msgstr "Dieses Element überspringen"
 
@@ -6448,22 +6502,22 @@ msgstr ""
 "Vereinfachen der »Jetzt wiedergegeben«-Schnittstelle durch Verbergen der "
 "Quellenliste u.a."
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:144
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:143
 #, csharp-format
 msgid "Unable to import track: {0}"
 msgstr "Import des Titels fehlgeschlagen: {0}"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:178
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:177
 msgid "Importing from Amarok failed"
 msgstr "Import aus Amarok fehlgeschlagen"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:189
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:188
 msgid "Amarok"
 msgstr "Amarok"
 
 #. TODO add Help button and dialog/tooltip
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:68
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:384
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:383
 msgid "iTunes Importer"
 msgstr "iTunes-Importer"
 
@@ -6480,24 +6534,24 @@ msgid "Import playlists"
 msgstr "Wiedergabelisten importieren"
 
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:120
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:387
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:386
 #, csharp-format
 msgid "Locate your \"{0}\" file..."
 msgstr "Finden Sie Ihre »{0}« Datei …"
 
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:138
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:388
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:387
 #, csharp-format
 msgid "Locate \"{0}\""
 msgstr "»{0}« finden"
 
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:167
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:389
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:388
 msgid "Locate iTunes Music Directory"
 msgstr "iTunes-Musikordner finden"
 
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:196
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:391
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:390
 #, csharp-format
 msgid ""
 "The iTunes library refers to your music directory as \"{0}\" but Banshee was "
@@ -6507,13 +6561,13 @@ msgstr ""
 "war nicht imstande, den Ort dieses Ordners zu bestimmen. Bitte machen Sie ihn "
 "ausfindig."
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:75
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:393
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:74
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:392
 msgid "iTunes Media Player"
 msgstr "iTunes Medien-Wiedergabeprogramm"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:135
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:395
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:134
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:394
 msgid ""
 "Banshee is not familiar with this version of the iTunes library format. "
 "Importing may or may not work as expected, or at all. Would you like to "
@@ -6523,17 +6577,17 @@ msgstr ""
 "Importieren kann wie erwartet funktionieren oder auch nicht. Möchten Sie "
 "versuchen, den Import trotzdem zu starten?"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:440
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:236
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:397
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:439
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:235
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:396
 msgid "Unable to import song."
 msgstr "Import des Titels fehlgeschlagen."
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:370
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:369
 msgid "Rhythmbox Music Player"
 msgstr "Rhythmbox Music Player"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:386
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
 msgid "Import _playlists"
 msgstr "_Wiedergabelisten importieren"
 
@@ -6545,76 +6599,76 @@ msgstr "_Füllen"
 msgid "f_rom"
 msgstr "_aus"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:51
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:52
 msgid "Add to Play Queue"
 msgstr "Zur Warteschlange hinzufügen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:52
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:53
 msgid "Append selected songs to the play queue"
 msgstr "Ausgewählte Titel zur Warteschlange hinzufügen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:56
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:57
 msgid "Play After"
 msgstr "Wiedergeben nach"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:57
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:58
 msgid "Add selected songs after the currently playing track, album, or artist"
 msgstr ""
 "Ausgewählte Lieder nach dem aktuell abgespielten Titel, Album oder Künstler "
 "einfügen"
 
 # CHECK
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:61
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:62
 msgid "Current Track"
 msgstr "Aktueller Titel"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:62
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:63
 msgid "Add selected songs to the play queue after the currently playing song"
 msgstr ""
 "Ausgewählte Lieder in die Wiedergabe-Warteschlange nach dem aktuell "
 "abgespielten Titel einfügen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:66
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:67
 msgid "Current Album"
 msgstr "Aktuelles Album"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:67
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:68
 msgid "Add selected songs to the play queue after the currently playing album"
 msgstr ""
 "Ausgewählte Lieder in die Wiedergabe-Warteschlange nach dem aktuell "
 "abgespielten Album einfügen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:71
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:72
 msgid "Current Artist"
 msgstr "Aktueller Künstler"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:72
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:73
 msgid "Add selected songs to the play queue after the currently playing artist"
 msgstr ""
 "Ausgewählte Lieder in die Wiedergabe-Warteschlange nach dem aktuell "
 "abgespielten Künstler einfügen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:79
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:80
 msgid "Refresh random tracks in the play queue"
 msgstr "Zufällige Titel in der Wiedergabeliste aktualisieren"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:84
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:85
 msgid "Randomize the playback order of items in the play queue"
 msgstr "Zufällige Reihenfolge der Einträge in der Wiedergabe-Warteschlange"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:88
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:89
 msgid "Add More"
 msgstr "Weitere hinzufügen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:89
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:90
 msgid "Add more random tracks to the play queue"
 msgstr "Weitere zufällige Titel der Wiedergabeliste hinzufügen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:94
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:95
 msgid "Remove all tracks from the play queue"
 msgstr "Alle Titel aus der Warteschlange entfernen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:103
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:104
 msgid "Clear the play queue when quitting"
 msgstr "Die Warteschlange beim Beenden leeren"
 
@@ -6622,16 +6676,16 @@ msgstr "Die Warteschlange beim Beenden leeren"
 msgid "Remove From Play Queue"
 msgstr "Aus der Warteschlange entfernen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:952
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:967
 msgid "Number of _played songs to show"
 msgstr "Anzahl _gespielter Titel, die angezeigt werden sollen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:958
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:973
 msgid "Number of _upcoming songs to show"
 msgstr "Anzahl _kommender Titel, die angezeigt werden sollen"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs:47
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:285
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:280
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:89
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:86
 msgid "Podcast"
@@ -6642,73 +6696,67 @@ msgstr "Podcast"
 msgid "All Podcasts ({0})"
 msgstr "Alle Podcasts ({0})"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:104
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:102
 msgid "Podcasts Folder"
 msgstr "Podcasts-Ordner"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:131
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:129
 msgid "Remove Podcast"
 msgstr "Podcast entfernen"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:136
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:134
 msgid "Disable Auto Updates"
 msgstr "Automatische Aktualisierungen deaktivieren"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:154
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:152
 #, csharp-format
 msgid "Network error updating {0}"
 msgstr "Netzwerkfehler beim Aktualisieren von {0}"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:160
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
 #, csharp-format
 msgid "Parsing error updating {0}"
 msgstr "Verarbeitungsfehler beim Aktualisieren von {0}"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:163
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:161
 #, csharp-format
 msgid "Authentication error updating {0}"
 msgstr "Legitimierungsfehler beim Aktualisieren von {0}"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:166
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:164
 #, csharp-format
 msgid "Error updating {0}"
 msgstr "Fehler beim Aktualisieren von {0}"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:222
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:220
 msgid "Search your podcasts"
 msgstr "Ihre Podcasts durchsuchen"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:285
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:222
+msgid "Episode Properties"
+msgstr "Eigenschaften der Folge"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:280
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:88
 msgid "Published"
 msgstr "Veröffentlicht"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:285
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:280
 msgid "New"
 msgstr "Neu"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:286
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs:57
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:281
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs:66
 msgid "Downloaded"
 msgstr "Heruntergeladen"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:312
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:307
 #, csharp-format
 msgid "{0} episode"
 msgid_plural "{0} episodes"
 msgstr[0] "{0} Folge"
 msgstr[1] "{0} Folgen"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs:58
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs:58
-msgid "All Items"
-msgstr "Alle Elemente"
-
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs:59
-msgid "Not Downloaded"
-msgstr "Nicht heruntergeladen"
-
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs:113
 msgid "Never updated"
 msgstr "Niemals aktualisiert"
@@ -6732,9 +6780,9 @@ msgstr "Wird heruntergeladen"
 msgid "New Items"
 msgstr "Neue Elemente"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs:59
-msgid "Old Items"
-msgstr "Alte Elemente"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs:58
+msgid "All Items"
+msgstr "Alle Elemente"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:50
 msgid "Downloading Podcast(s)"
@@ -6774,42 +6822,46 @@ msgid "Visit Podcast Homepage"
 msgstr "Podcast-Startseite besuchen"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:123
+msgid "Podcast Properties"
+msgstr "Eigenschaften des Podcasts"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:128
 msgid "Mark as New"
 msgstr "Als neu markieren"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:129
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:134
 msgid "Archive"
 msgstr "Archiv"
 
 #. Translators: this is a verb used as a button name, not a noun
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:135
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:140
 msgid "Download"
 msgstr "Downloads"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:141
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:146
 msgid "Cancel Download"
 msgstr "Herunterladen abbrechen"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:153
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:158
 msgid "Visit Website"
 msgstr "Website besuchen"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:165
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:170
 msgid "Add Podcast"
 msgstr "Podcast hinzufügen"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:262
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:268
 #, csharp-format
 msgid "Delete File"
 msgid_plural "Delete Files"
 msgstr[0] "Datei löschen"
 msgstr[1] "Dateien löschen"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:343
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:350
 msgid "Invalid URL"
 msgstr "Ungültige Adresse"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:344
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:351
 msgid "Podcast URL is invalid."
 msgstr "Podcast-Adresse ist ungültig"
 
@@ -6817,52 +6869,85 @@ msgstr "Podcast-Adresse ist ungültig"
 msgid "Episode Details"
 msgstr "Details zur Folge"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:85
-msgid "Last updated:"
-msgstr "Zuletzt aktualisiert:"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:105
+msgid "Check periodically for new episodes"
+msgstr "Regelmäßig auf neue Folgen überprüfen"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:89
-msgid "Podcast Name:"
-msgstr "Name des Podcasts:"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:106
+msgid ""
+"If checked, Banshee will check every hour to see if this podcast has new "
+"episodes"
+msgstr ""
+"Falls aktiviert, sucht Banshee stündlich nach neuen Folgen dieses Podcasts"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:99
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:85
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:146
-msgid "URL:"
-msgstr "Adresse:"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:109
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:136
+msgid "Download new episodes"
+msgstr "Neue Folgen herunterladen"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:103
-msgid "When feed is updated:"
-msgstr "Wann wird der Feed aktualisiert:"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:112
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:137
+msgid "Archive all episodes except the newest one"
+msgstr "Alle Folgen außer der neuesten archivieren"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:119
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:135
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:105
 msgid "No description available"
 msgstr "Keine Beschreibung verfügbar"
 
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:155
+msgid "Name:"
+msgstr "Name:"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:156
+msgid "Website:"
+msgstr "Webseite:"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:158
+msgid "Visit"
+msgstr "Besuchen"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:166
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:133
+msgid "Subscription Options"
+msgstr "Abonnement-Optionen"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:169
+msgid "Feed URL:"
+msgstr "Quellenadresse:"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:170
+msgid "Last Refreshed:"
+msgstr "Zuletzt aktualisiert"
+
+# CHECK
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:172
+msgid "Category:"
+msgstr "Kategorie:"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:174
+msgid "Copyright:"
+msgstr "Urheberrecht:"
+
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:77
 msgid "Podcast:"
 msgstr "Podcast:"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:61
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:170
-msgid "Subscribe"
-msgstr "Abonnieren"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:85
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:128
+msgid "URL:"
+msgstr "Adresse:"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:92
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:95
 msgid "Subscribe to New Podcast"
 msgstr "Neuen Podcast abonnieren"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:100
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:103
 msgid ""
 "Please enter the URL of the podcast to which you would like to subscribe."
 msgstr ""
 "Bitte geben Sie die Adresse des Podcasts ein, den Sie abonnieren möchten."
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:112
-msgid "When new episodes are available:  "
-msgstr "Wenn neue Folgen verfügbar sind: "
-
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/SyncPreferenceComboBox.cs:41
 msgid "Download all episodes"
 msgstr "Alle Folgen herunterladen"
@@ -6879,6 +6964,44 @@ msgstr "Mich entscheiden lassen, welche Folgen heruntergeladen werden"
 msgid "_Speaker:"
 msgstr "Laut_sprecher:"
 
+#: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:211
+msgid ""
+"Banshee was closed to the sound menu. Use the <i>Quit</i> option to end your "
+"session."
+msgstr ""
+"Banshee wurde im Sound Menu verborgen. Benutzen Sie <i>Beenden</i>, um Ihre "
+"Sitzung zu Beenden."
+
+#. Translators: {0} and {1} are Artist Name and
+#. Album Title, respectively;
+#. e.g. 'by Parkway Drive from Killing with a Smile'
+#: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:257
+#, csharp-format
+msgid "by '{0}' from '{1}'"
+msgstr "von »{0}« aus »{1}«"
+
+#. Translators: {0} is for Album Title;
+#. e.g. 'from Killing with a Smile'
+#: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:262
+#, csharp-format
+msgid "from '{0}'"
+msgstr "von »{0}«"
+
+#. Translators: {0} is for Artist Name;
+#. e.g. 'by Parkway Drive'
+#: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:267
+#, csharp-format
+msgid "by '{0}'"
+msgstr "von »{0}«"
+
+#: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:376
+msgid "_Show Banshee in the sound menu"
+msgstr "Banshee im _Sound Menu anzeigen"
+
+#: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:377
+msgid "Control Banshee through the sound menu"
+msgstr "Banshee über das Sound Menu bedienen"
+
 #: ../src/Extensions/Banshee.SqlDebugConsole/Banshee.SqlDebugConsole/SqlActions.cs:59
 msgid "Show SQL Console"
 msgstr "SQL-Konsole anzeigen"
@@ -6891,6 +7014,10 @@ msgstr "SQL-Überwachung starten"
 msgid "Stop SQL Monitoring"
 msgstr "SQL-Überwachung stoppen"
 
+#: ../src/Extensions/Banshee.UbuntuOneMusicStore/Banshee.UbuntuOneMusicStore/UbuntuOneMusicStoreSource.cs:89
+msgid "Track Preview"
+msgstr "Titelvorschau"
+
 #: ../src/Extensions/Banshee.YouTube/Banshee.YouTube.Gui/VideoStreamTile.cs:136
 msgid "Uploaded by"
 msgstr "Hochgeladen von"
@@ -7203,42 +7330,9 @@ msgstr "Verbindung mit Last.fm wird hergestellt."
 msgid "Connected to Last.fm."
 msgstr "Verbunden mit Last.fm."
 
-#: ../src/Libraries/Migo/Migo.Syndication/Feed.cs:147
+#: ../src/Libraries/Migo/Migo.Syndication/Feed.cs:151
 #: ../src/Libraries/Migo/Migo.Syndication/RssParser.cs:97
 #: ../src/Libraries/Migo/Migo.Syndication/RssParser.cs:100
 msgid "Unknown Podcast"
 msgstr "Unbekannter Podcast"
 
-#~ msgid "Manage _Extensions"
-#~ msgstr "_Erweiterungen verwalten"
-
-#~ msgid "Manage extensions to add new features to Banshee"
-#~ msgstr ""
-#~ "Die Erweiterungen verwalten, um Banshee um neue Fähigkeiten zu ergänzen"
-
-#~ msgid "Mark as Old"
-#~ msgstr "Als alt markieren"
-
-#~ msgid "Download Podcast(s)"
-#~ msgstr "Podcast(s) herunterladen"
-
-#~ msgid "Remove Downloaded File(s)"
-#~ msgstr "Heruntergeladene Datei(en) entfernen"
-
-#~ msgid "_Cover Art"
-#~ msgstr "_Alben-Cover"
-
-#~ msgid "Manage cover art"
-#~ msgstr "Alben-Cover verwalten"
-
-#~ msgid "_Download Cover Art"
-#~ msgstr "Alben-Cover _herunterladen"
-
-#~ msgid "Download cover art for all tracks"
-#~ msgstr "Alben-Cover für alle Titel herunterladen"
-
-#~ msgid "Sign out of Amazon"
-#~ msgstr "Amazon-Registrierung löschen"
-
-#~ msgid "MTP Support Ignoring Device"
-#~ msgstr "MTP-Unterstützung ignoriert das Gerät"
diff --git a/po/es.po b/po/es.po
index c700db5..ddefb48 100644
--- a/po/es.po
+++ b/po/es.po
@@ -15,8 +15,8 @@ msgstr ""
 "Project-Id-Version: banshee.master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
 "product=banshee&component=general\n"
-"POT-Creation-Date: 2010-12-11 15:15+0000\n"
-"PO-Revision-Date: 2010-12-08 21:26+0100\n"
+"POT-Creation-Date: 2010-12-11 17:20+0000\n"
+"PO-Revision-Date: 2010-12-11 20:48+0100\n"
 "Last-Translator: Benjamín Valero Espinosa <benjavalero@gmail.com>\n"
 "Language-Team: Español <gnome-es-list@gnome.org>\n"
 "MIME-Version: 1.0\n"
@@ -463,13 +463,11 @@ msgstr "Recursos"
 #. ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu.addin.xml
 #: ../data/addin-xml-strings.cs:207
 msgid "Sound Menu integration for Banshee"
-msgstr ""
+msgstr "Integración de Banshee con el menú de sonido"
 
 #: ../data/addin-xml-strings.cs:208
-#, fuzzy
-#| msgid "Control Banshee using the MPRIS D-Bus interface."
 msgid "Control Banshee from the Sound Menu."
-msgstr "Controlar Banshee usando la interfaz D-Bus MPRIS"
+msgstr "Controlar Banshee desde el menú de sonido."
 
 #. ../src/Extensions/Banshee.SqlDebugConsole/Banshee.SqlDebugConsole.addin.xml
 #: ../data/addin-xml-strings.cs:212
@@ -499,15 +497,17 @@ msgstr "Soporte para descargar archivos BitTorrent desde podcasts."
 #: ../data/addin-xml-strings.cs:222
 #: ../src/Extensions/Banshee.UbuntuOneMusicStore/Banshee.UbuntuOneMusicStore/UbuntuOneMusicStoreSource.cs:49
 #: ../src/Extensions/Banshee.UbuntuOneMusicStore/Banshee.UbuntuOneMusicStore/UbuntuOneMusicStoreSource.cs:50
-#: ../src/Extensions/Banshee.UbuntuOneMusicStore/Banshee.UbuntuOneMusicStore/UbuntuOneMusicStoreSource.cs:92
+#: ../src/Extensions/Banshee.UbuntuOneMusicStore/Banshee.UbuntuOneMusicStore/UbuntuOneMusicStoreSource.cs:90
 msgid "Ubuntu One Music Store"
-msgstr ""
+msgstr "Ubuntu One Music Store"
 
 #: ../data/addin-xml-strings.cs:223
 msgid ""
 "This extension grants access to the Ubuntu One Music Store, powered by "
 "7digital."
 msgstr ""
+"Esta extensión proporciona acceso a Ubuntu One Music Store, gracias a "
+"7digital."
 
 #. ../src/Extensions/Banshee.Wikipedia/Banshee.Wikipedia.addin.xml
 #: ../data/addin-xml-strings.cs:227
@@ -6859,50 +6859,42 @@ msgid "_Speaker:"
 msgstr "_Altavoz:"
 
 #: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:211
-#, fuzzy
-#| msgid ""
-#| "Banshee was closed to the notification area. Use the <i>Quit</i> option "
-#| "to end your session."
 msgid ""
 "Banshee was closed to the sound menu. Use the <i>Quit</i> option to end your "
 "session."
 msgstr ""
-"Banshee se cerró en el área de notificación. Use la opción <i>Salir</i> para "
+"Banshee se cerró en el menú de sonido. Use la opción <i>Salir</i> para "
 "finalizar la sesión."
 
 #. Translators: {0} and {1} are Artist Name and
 #. Album Title, respectively;
 #. e.g. 'by Parkway Drive from Killing with a Smile'
 #: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:257
-#, fuzzy, csharp-format
-#| msgid "{0} of {1}"
+#, csharp-format
 msgid "by '{0}' from '{1}'"
-msgstr "{0} de {1}"
+msgstr "por «{0}» de «{1}»"
 
 #. Translators: {0} is for Album Title;
 #. e.g. 'from Killing with a Smile'
 #: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:262
 #, csharp-format
 msgid "from '{0}'"
-msgstr ""
+msgstr "de «{0}»"
 
 #. Translators: {0} is for Artist Name;
 #. e.g. 'by Parkway Drive'
 #: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:267
-#, fuzzy, csharp-format
-#| msgid "Sync {0}"
+#, csharp-format
 msgid "by '{0}'"
-msgstr "Sincronizar {0}"
+msgstr "por «{0}»"
 
 #: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:376
 msgid "_Show Banshee in the sound menu"
-msgstr ""
+msgstr "_Mostrar Banshee en el menú de sonido"
 
 #: ../src/Extensions/Banshee.SoundMenu/Banshee.SoundMenu/SoundMenuService.cs:377
-#, fuzzy
-#| msgid "Control Banshee using the MPRIS D-Bus interface."
 msgid "Control Banshee through the sound menu"
-msgstr "Controlar Banshee usando la interfaz D-Bus MPRIS"
+msgstr "Controlar Banshee a través del menú de sonido"
 
 #: ../src/Extensions/Banshee.SqlDebugConsole/Banshee.SqlDebugConsole/SqlActions.cs:59
 msgid "Show SQL Console"
@@ -6916,11 +6908,9 @@ msgstr "Iniciar la monitorización SQL"
 msgid "Stop SQL Monitoring"
 msgstr "Parar la monitorización SQL"
 
-#: ../src/Extensions/Banshee.UbuntuOneMusicStore/Banshee.UbuntuOneMusicStore/UbuntuOneMusicStoreSource.cs:91
-#, fuzzy
-#| msgid "Track Properties"
+#: ../src/Extensions/Banshee.UbuntuOneMusicStore/Banshee.UbuntuOneMusicStore/UbuntuOneMusicStoreSource.cs:89
 msgid "Track Preview"
-msgstr "Propiedades de la pista"
+msgstr "Vista previa de la pista"
 
 #: ../src/Extensions/Banshee.YouTube/Banshee.YouTube.Gui/VideoStreamTile.cs:136
 msgid "Uploaded by"
diff --git a/po/sl.po b/po/sl.po
index 3f7481f..30d465b 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -9,8 +9,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: banshee\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=banshee&component=general\n"
-"POT-Creation-Date: 2010-12-02 22:56+0000\n"
-"PO-Revision-Date: 2010-12-03 12:57+0100\n"
+"POT-Creation-Date: 2010-12-09 09:51+0000\n"
+"PO-Revision-Date: 2010-12-10 09:35+0100\n"
 "Last-Translator: Andrej Žnidaršič <andrej.znidarsic@gmail.com>\n"
 "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
 "Language: \n"
@@ -1130,7 +1130,7 @@ msgstr "_Razvrsti"
 
 #: ../src/Clients/Muinshee/Muinshee/BaseDialog.cs:86
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:73
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:208
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:210
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:126
 msgid "_Play"
 msgstr "_Predvajaj"
@@ -3058,15 +3058,15 @@ msgstr "Zaustavitev predvajanja po končanem predvajanju trenutne skladbe"
 msgid "_Playback"
 msgstr "_Predvajanje"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:201
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:203
 msgid "_Pause"
 msgstr "_Premor"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:203
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:205
 msgid "Pause the current item"
 msgstr "Naredi premor trenutnega predmeta"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:215
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:217
 msgid "Sto_p"
 msgstr "_Zaustavi"
 
@@ -3111,16 +3111,16 @@ msgid "Subtitle"
 msgstr "PodnapisPodnaslov"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:65
-msgid "Load subtitle"
-msgstr "Naloži podnapis"
+msgid "Load File..."
+msgstr "Naloži datoteko ..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:66
 msgid "Load subtitle file"
 msgstr "Naloži datoteko podnapisa"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:79
-msgid "Load Subtitle"
-msgstr "Naloži podnapis"
+msgid "Load Subtitle File"
+msgstr "Naloži datoteko s podnapisi"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs:88
 msgid "L_oad"
@@ -3677,40 +3677,40 @@ msgstr "Urejevalnik skladb"
 msgid "Track Properties"
 msgstr "Lastnosti skladbe"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:149
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:151
 msgid "Show the previous track"
 msgstr "Pokaži predhodno skladbo"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:155
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:157
 msgid "Show the next track"
 msgstr "Pokaži naslednjo skladbo"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:185
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:187
 msgid "Title:"
 msgstr "Naslov:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:186
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:188
 msgid "Artist:"
 msgstr "Izvajalec:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:187
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:189
 msgid "Album:"
 msgstr "Album:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:311
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:313
 msgid "Sync all field _values"
 msgstr "Usklajevanje vseh vrednosti _polj"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:316
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:318
 msgid "Apply the values of all common fields set for this track to all of the tracks selected in this editor"
 msgstr "Uveljavi vrednosti vseh nastavljenih skupnih polj te skladbe za vse skladbe izbrane v urejevalniku"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:416
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:418
 #, csharp-format
 msgid "<i>Editing {0} of {1} items</i>"
 msgstr "<i>Urejanje {0} od {1} predmetov</i>"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:678
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:698
 #, csharp-format
 msgid "Save the changes made to the open track?"
 msgid_plural "Save the changes made to {0} of {1} open tracks?"
@@ -3719,11 +3719,11 @@ msgstr[1] "Ali naj bodo spremembe {0} od {1} odprte skladbe shranjene?"
 msgstr[2] "Ali naj bodo spremembe {0} od {1} odprtih skladb shranjene?"
 msgstr[3] "Ali naj bodo spremembe {0} od {1} odprtih skladb shranjene?"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:695
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:715
 msgid "Close _without Saving"
 msgstr "Zapri _brez shranjevanja"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:732
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:752
 #, csharp-format
 msgid "If you don't save, changes from the last {0} will be permanently lost."
 msgstr "V primeru, da datoteke ne shranite, bo zadnjih {0} sprememb trajno izgubljenih."
@@ -6920,6 +6920,10 @@ msgstr "Povezano z Last.fm "
 msgid "Unknown Podcast"
 msgstr "Neznan Podcast"
 
+#~ msgid "Load subtitle"
+#~ msgstr "Naloži podnapis"
+#~ msgid "Load Subtitle"
+#~ msgstr "Naloži podnapis"
 #~ msgid "Average Bitrate"
 #~ msgstr "Povprečna bitna hitrost"
 #~ msgid "Extreme"
diff --git a/po/sort-potfiles b/po/sort-potfiles
index 2d71849..119bd74 100755
--- a/po/sort-potfiles
+++ b/po/sort-potfiles
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 head -n 4 < POTFILES.in > POTFILES.in.tmp 
 grep -v "^[\\[#]" < POTFILES.in | sort >> POTFILES.in.tmp
diff --git a/release-rc b/release-rc
index 27ff1c0..6e8a951 100644
--- a/release-rc
+++ b/release-rc
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 
 WEB_USER=banshee
 WEB_HOST=banshee.fm
diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
index 426bbfc..f8c8f79 100644
--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
+++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
@@ -298,6 +298,61 @@ namespace Banshee.GStreamer
             return null;
         }
 
+        public override void NotifyMouseMove (double x, double y)
+        {
+            bp_dvd_mouse_move_notify (handle, x, y);
+        }
+
+        public override void NotifyMouseButtonPressed (int button, double x, double y)
+        {
+            bp_dvd_mouse_button_pressed_notify (handle, button, x, y);
+        }
+
+        public override void NotifyMouseButtonReleased (int button, double x, double y)
+        {
+            bp_dvd_mouse_button_released_notify (handle, button, x, y);
+        }
+
+        public override void NavigateToLeftMenu ()
+        {
+            bp_dvd_left_notify (handle);
+        }
+
+        public override void NavigateToRightMenu ()
+        {
+            bp_dvd_right_notify (handle);
+        }
+
+        public override void NavigateToUpMenu ()
+        {
+            bp_dvd_up_notify (handle);
+        }
+
+        public override void NavigateToDownMenu ()
+        {
+            bp_dvd_down_notify (handle);
+        }
+
+        public override void NavigateToMenu ()
+        {
+            bp_dvd_go_to_menu (handle);
+        }
+
+        public override void ActivateCurrentMenu ()
+        {
+            bp_dvd_activate_notify (handle);
+        }
+
+        public override void GoToNextChapter ()
+        {
+            bp_dvd_go_to_next_chapter (handle);
+        }
+
+        public override void GoToPreviousChapter ()
+        {
+            bp_dvd_go_to_previous_chapter (handle);
+        }
+
         private void OnEos (IntPtr player)
         {
             Close (false);
@@ -659,7 +714,7 @@ namespace Banshee.GStreamer
             bp_equalizer_set_gain (handle, band, gain);
         }
 
-        private static string [] source_capabilities = { "file", "http", "cdda" };
+        private static string [] source_capabilities = { "file", "http", "cdda", "dvd", "vcd" };
         public override IEnumerable SourceCapabilities {
             get { return source_capabilities; }
         }
@@ -733,6 +788,10 @@ namespace Banshee.GStreamer
             }
         }
 
+        public override bool IsMenu {
+            get { return bp_dvd_is_menu (handle); }
+        }
+
 #region ISupportClutter
 
         private IntPtr clutter_video_sink;
@@ -1005,5 +1064,41 @@ namespace Banshee.GStreamer
 
         [DllImport ("libbanshee.dll")]
         private static extern IntPtr bp_get_subtitle_description (HandleRef player, int index);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern bool bp_dvd_is_menu (HandleRef player);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern void bp_dvd_mouse_move_notify (HandleRef player, double x, double y);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern void bp_dvd_mouse_button_pressed_notify (HandleRef player, int button, double x, double y);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern void bp_dvd_mouse_button_released_notify (HandleRef player, int button, double x, double y);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern void bp_dvd_left_notify (HandleRef player);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern void bp_dvd_right_notify (HandleRef player);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern void bp_dvd_up_notify (HandleRef player);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern void bp_dvd_down_notify (HandleRef player);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern void bp_dvd_activate_notify (HandleRef player);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern void bp_dvd_go_to_menu (HandleRef player);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern void bp_dvd_go_to_next_chapter (HandleRef player);
+
+        [DllImport ("libbanshee.dll")]
+        private static extern void bp_dvd_go_to_previous_chapter (HandleRef player);
    }
 }
diff --git a/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs b/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs
index e60320f..e232065 100644
--- a/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs
+++ b/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs
@@ -249,6 +249,10 @@ namespace Banshee.GStreamerSharp
             }
         }
 
+        public override bool IsMenu {
+            get { return false; }
+        }
+
         public override SafeUri SubtitleUri {
             set { playbin.Suburi = value.AbsoluteUri; }
             get { return playbin.Suburi; }
diff --git a/src/Backends/Banshee.Gio/Banshee.Gio.csproj b/src/Backends/Banshee.Gio/Banshee.Gio.csproj
index 36d1bf5..63a7efd 100644
--- a/src/Backends/Banshee.Gio/Banshee.Gio.csproj
+++ b/src/Backends/Banshee.Gio/Banshee.Gio.csproj
@@ -58,13 +58,16 @@
       <Package>glib-sharp-2.0</Package>
     </Reference>
     <Reference Include="gio-sharp, Version=2.14.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+      <Package>gio-sharp-2.0</Package>
     </Reference>
     <Reference Include="gtk-sharp-beans">
       <SpecificVersion>False</SpecificVersion>
+      <Package>gtk-sharp-beans-2.0</Package>
     </Reference>
     <Reference Include="Mono.Posix" />
     <Reference Include="gkeyfile-sharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e886e4e52ee77480">
       <SpecificVersion>False</SpecificVersion>
+      <Package>gkeyfile-sharp</Package>
     </Reference>
     <Reference Include="libgudev, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3565e728cafab25e">
       <SpecificVersion>False</SpecificVersion>
@@ -81,7 +84,6 @@
     <Compile Include="Banshee.Hardware.Gio\Device.cs" />
     <Compile Include="Banshee.Hardware.Gio\DeviceMediaCapabilities.cs" />
     <Compile Include="Banshee.Hardware.Gio\DiscVolume.cs" />
-    <Compile Include="Banshee.Hardware.Gio\DiskDevice.cs" />
     <Compile Include="Banshee.Hardware.Gio\HardwareManager.cs" />
     <Compile Include="Banshee.Hardware.Gio\LowLevel\GioDriveMetadetaSource.cs" />
     <Compile Include="Banshee.Hardware.Gio\LowLevel\GioMetadataSource.cs" />
diff --git a/src/Backends/Banshee.Gio/Banshee.Hardware.Gio/DiscVolume.cs b/src/Backends/Banshee.Gio/Banshee.Hardware.Gio/DiscVolume.cs
index 96a2767..e5b3921 100644
--- a/src/Backends/Banshee.Gio/Banshee.Hardware.Gio/DiscVolume.cs
+++ b/src/Backends/Banshee.Gio/Banshee.Hardware.Gio/DiscVolume.cs
@@ -26,6 +26,8 @@
 
 #if ENABLE_GIO_HARDWARE
 using System;
+using System.Linq;
+using GLib;
 
 using Banshee.Hardware;
 
@@ -33,6 +35,8 @@ namespace Banshee.Hardware.Gio
 {
     class DiscVolume : Volume, IDiscVolume
     {
+        private static string[] video_mime_types;
+
         public static new IDiscVolume Resolve (IDevice device)
         {
             var raw = device as IRawDevice;
@@ -43,6 +47,14 @@ namespace Banshee.Hardware.Gio
             return null;
         }
 
+        static DiscVolume ()
+        {
+            video_mime_types = new string[] {"x-content/video-dvd",
+                "x-content/video-vcd",
+                "x-content/video-svcd"
+            };
+        }
+
         public bool HasAudio {
             get {
                 return PropertyExists ("ID_CDROM_MEDIA_TRACK_COUNT_AUDIO");
@@ -55,6 +67,14 @@ namespace Banshee.Hardware.Gio
             }
         }
 
+        public bool HasVideo {
+            get {
+                return ((GioVolumeMetadataSource) this.device.GioMetadata).MediaContentTypes
+                    .Intersect (video_mime_types)
+                    .Any ();
+            }
+        }
+
         public bool IsBlank {
             get {
                 return GetPropertyString ("ID_CDROM_MEDIA_STATE") == "blank";
diff --git a/src/Backends/Banshee.Gio/Banshee.Hardware.Gio/LowLevel/GioVolumeMetadataSource.cs b/src/Backends/Banshee.Gio/Banshee.Hardware.Gio/LowLevel/GioVolumeMetadataSource.cs
index 9a861fc..459a97f 100644
--- a/src/Backends/Banshee.Gio/Banshee.Hardware.Gio/LowLevel/GioVolumeMetadataSource.cs
+++ b/src/Backends/Banshee.Gio/Banshee.Hardware.Gio/LowLevel/GioVolumeMetadataSource.cs
@@ -26,6 +26,7 @@
 
 #if ENABLE_GIO_HARDWARE
 using System;
+using System.Linq;
 
 namespace Banshee.Hardware.Gio
 {
@@ -74,6 +75,19 @@ namespace Banshee.Hardware.Gio
         {
             throw new NotImplementedException ();
         }
+
+        private string[] content_types;
+        public string[] MediaContentTypes {
+            get {
+                if (Volume.MountInstance == null) {
+                    content_types = new string[] {};
+                } else if (content_types == null) {
+                    content_types = Volume.MountInstance.GuessContentTypeSync (false, null);
+                }
+
+                return content_types;
+            }
+        }
     }
 }
 
diff --git a/src/Backends/Banshee.Hal/Banshee.HalBackend/DiscVolume.cs b/src/Backends/Banshee.Hal/Banshee.HalBackend/DiscVolume.cs
index 1798984..e8cfbae 100644
--- a/src/Backends/Banshee.Hal/Banshee.HalBackend/DiscVolume.cs
+++ b/src/Backends/Banshee.Hal/Banshee.HalBackend/DiscVolume.cs
@@ -51,6 +51,10 @@ namespace Banshee.HalBackend
             get { return HalDevice.GetPropertyBoolean ("volume.disc.has_data"); }
         }
 
+        public bool HasVideo {
+            get { return HalDevice.GetPropertyBoolean ("volume.disc.is_videodvd"); }
+        }
+
         public bool IsBlank {
             get { return HalDevice.GetPropertyBoolean ("volume.disc.is_blank"); }
         }
diff --git a/src/Core/Banshee.Core/Resources/contributors.xml b/src/Core/Banshee.Core/Resources/contributors.xml
index ede6c3c..5b392a1 100644
--- a/src/Core/Banshee.Core/Resources/contributors.xml
+++ b/src/Core/Banshee.Core/Resources/contributors.xml
@@ -17,6 +17,7 @@
   <contributor>Andrew Conkling</contributor>
   <contributor>Andrés G. Aragoneses</contributor>
   <contributor>Andy Midgette</contributor>
+  <contributor>Aran Cox</contributor>
   <contributor>Arthur Carli</contributor>
   <contributor>Arun Raghavan</contributor>
   <contributor>Aurélien Mino</contributor>
@@ -115,7 +116,7 @@
   <contributor>Nicolò Chieffo</contributor>
   <contributor>Nils Naumann</contributor>
   <contributor>Oben Sonne</contributor>
-  <contributor>Olivier Duff</contributor>
+  <contributor>Olivier Dufour</contributor>
   <contributor>Oscar Forero</contributor>
   <contributor>Pacho Ramos</contributor>
   <contributor>Patrick van Staveren</contributor>
@@ -130,8 +131,10 @@
   <contributor>Raimo Radczewski</contributor>
   <contributor>Robin Stocker</contributor>
   <contributor>Roderich Schupp</contributor>
+  <contributor>Rodney Dawes</contributor>
   <contributor>Romain Tartière</contributor>
   <contributor>Ruben Vermeersch</contributor>
+  <contributor>Samuel Gyger</contributor>
   <contributor>Sandy Armstrong</contributor>
   <contributor>Scott Peterson</contributor>
   <contributor>Sebastian Dröge</contributor>
@@ -145,6 +148,7 @@
   <contributor>Trey Ethridge</contributor>
   <contributor>Valentin Sawadski</contributor>
   <contributor>Will Farrington</contributor>
+  <contributor>William Friesen</contributor>
   <contributor>William Pettersson</contributor>
   <contributor>Wouter Bolsterlee</contributor>
   <contributor>Zhou Ting</contributor>
diff --git a/src/Core/Banshee.Services/Banshee.Hardware/IDiscVolume.cs b/src/Core/Banshee.Services/Banshee.Hardware/IDiscVolume.cs
index d5fb215..c9e86f3 100644
--- a/src/Core/Banshee.Services/Banshee.Hardware/IDiscVolume.cs
+++ b/src/Core/Banshee.Services/Banshee.Hardware/IDiscVolume.cs
@@ -34,6 +34,7 @@ namespace Banshee.Hardware
     {
         bool HasAudio { get; }
         bool HasData { get; }
+        bool HasVideo { get; }
         bool IsRewritable { get; }
         bool IsBlank { get; }
         ulong MediaCapacity { get; }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/NullPlayerEngine.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/NullPlayerEngine.cs
index 5dd3a6a..34092ad 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/NullPlayerEngine.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/NullPlayerEngine.cs
@@ -106,9 +106,58 @@ namespace Banshee.MediaEngine
             get { return null; }
         }
 
+        public override bool IsMenu {
+            get { return false; }
+        }
+
         public override string GetSubtitleDescription (int index)
         {
             return string.Empty;
         }
+
+        public override void NotifyMouseMove (double x, double y)
+        {
+        }
+
+        public override void NotifyMouseButtonPressed (int button, double x, double y)
+        {
+        }
+
+        public override void NotifyMouseButtonReleased (int button, double x, double y)
+        {
+        }
+
+        public override void NavigateToLeftMenu ()
+        {
+        }
+
+        public override void NavigateToRightMenu ()
+        {
+        }
+
+        public override void NavigateToUpMenu ()
+        {
+        }
+
+        public override void NavigateToDownMenu ()
+        {
+        }
+
+        public override void NavigateToMenu ()
+        {
+        }
+
+        public override void ActivateCurrentMenu ()
+        {
+        }
+
+        public override void GoToNextChapter ()
+        {
+        }
+
+        public override void GoToPreviousChapter ()
+        {
+        }
+
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
index 5365747..b0aa5f6 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
@@ -333,5 +333,25 @@ namespace Banshee.MediaEngine
             set;
             get;
         }
+
+        public abstract bool IsMenu {
+            get;
+        }
+
+        public abstract void NotifyMouseMove (double x, double y);
+        public abstract void NotifyMouseButtonPressed (int button, double x, double y);
+        public abstract void NotifyMouseButtonReleased (int button, double x, double y);
+
+        public abstract void NavigateToLeftMenu ();
+        public abstract void NavigateToRightMenu ();
+        public abstract void NavigateToUpMenu ();
+        public abstract void NavigateToDownMenu ();
+        public abstract void NavigateToMenu ();
+
+        public abstract void ActivateCurrentMenu ();
+
+        public abstract void GoToNextChapter ();
+        public abstract void GoToPreviousChapter ();
+
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
index 8d30711..d36e74c 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
@@ -539,6 +539,61 @@ namespace Banshee.MediaEngine
             return active_engine.GetSubtitleDescription (index);
         }
 
+        public void NotifyMouseMove (double x, double y)
+        {
+            active_engine.NotifyMouseMove (x, y);
+        }
+
+        public void NotifyMouseButtonPressed (int button, double x, double y)
+        {
+            active_engine.NotifyMouseButtonPressed (button, x, y);
+        }
+
+        public void NotifyMouseButtonReleased (int button, double x, double y)
+        {
+            active_engine.NotifyMouseButtonReleased (button, x, y);
+        }
+
+        public void NavigateToLeftMenu ()
+        {
+            active_engine.NavigateToLeftMenu ();
+        }
+
+        public void NavigateToRightMenu ()
+        {
+            active_engine.NavigateToRightMenu ();
+        }
+
+        public void NavigateToUpMenu ()
+        {
+            active_engine.NavigateToUpMenu ();
+        }
+
+        public void NavigateToDownMenu ()
+        {
+            active_engine.NavigateToDownMenu ();
+        }
+
+        public void NavigateToMenu ()
+        {
+            active_engine.NavigateToMenu ();
+        }
+
+        public void ActivateCurrentMenu ()
+        {
+            active_engine.ActivateCurrentMenu ();
+        }
+
+        public void GoToNextChapter ()
+        {
+            active_engine.GoToNextChapter ();
+        }
+
+        public void GoToPreviousChapter ()
+        {
+            active_engine.GoToPreviousChapter ();
+        }
+
         private void CheckPending ()
         {
             if (pending_engine != null && pending_engine != active_engine) {
@@ -644,6 +699,10 @@ namespace Banshee.MediaEngine
             get { return active_engine.SubtitleUri; }
         }
 
+        public bool IsMenu {
+            get { return active_engine.IsMenu; }
+        }
+
         public VideoDisplayContextType VideoDisplayContextType {
             get { return active_engine.VideoDisplayContextType; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs
index ca6ccff..d49b99a 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs
@@ -71,7 +71,7 @@ namespace Banshee.Collection.Gui
 
         protected override bool OnPopupMenu ()
         {
-            if (!HasTrackContextMenu || (Selection is SelectAllSelection && Selection.AllSelected)) {
+            if (!HasTrackContextMenu) {
                 return false;
             }
 
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs
index 8552df2..3ac3fef 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs
@@ -69,16 +69,19 @@ namespace Banshee.Gui.TrackEditor
             view.HasTooltip = true;
             view.QueryTooltip += HandleQueryTooltip;
 
-            name_renderer = new CellRendererText ();
-            name_renderer.Alignment = Pango.Alignment.Right;
-            name_renderer.Weight = (int)Pango.Weight.Bold;
-            name_renderer.Xalign = 1.0f;
-            name_renderer.Scale = Pango.Scale.Small;
+            name_renderer = new CellRendererText () {
+                Alignment = Pango.Alignment.Right,
+                Weight = (int)Pango.Weight.Bold,
+                Xalign = 1.0f,
+                Yalign = 0.0f,
+                Scale = Pango.Scale.Small
+            };
 
             value_renderer = new CellRendererText ();
-            value_renderer.Ellipsize = Pango.EllipsizeMode.End;
             value_renderer.Editable = true;
             value_renderer.Scale = Pango.Scale.Small;
+            value_renderer.Ellipsize = Pango.EllipsizeMode.End;
+            value_renderer.WrapMode = Pango.WrapMode.Word;
             value_renderer.EditingStarted += delegate(object o, EditingStartedArgs args) {
                 var entry = args.Editable as Entry;
                 if (entry != null) {
@@ -86,13 +89,30 @@ namespace Banshee.Gui.TrackEditor
                 }
             };
 
+            view.SizeAllocated += delegate { UpdateWrapWidth (); };
+            view.Realized += delegate { UpdateWrapWidth (); };
+
             view.AppendColumn (Catalog.GetString ("Name"), name_renderer, "text", 0);
-            view.AppendColumn (Catalog.GetString ("Value"), value_renderer, "text", 1);
+            view.AppendColumn (Catalog.GetString ("Value"), value_renderer, "text", 1, "ellipsize", 3, "ellipsize-set", 4, "wrap-width", 5);
 
             Add (view);
             ShowAll ();
         }
 
+        public void UpdateWrapWidth ()
+        {
+            if (view.IsRealized) {
+                var width = GetValueWidth ();
+
+                model.Foreach ((TreeModel m, TreePath path, TreeIter iter) => {
+                    if ((Pango.EllipsizeMode) model.GetValue (iter, 3) != Pango.EllipsizeMode.End) {
+                        model.SetValue (iter, 5, width);
+                    }
+                    return false;
+                });
+            }
+        }
+
         public CellRendererText NameRenderer { get { return name_renderer; } }
         public CellRendererText ValueRenderer { get { return value_renderer; } }
 
@@ -101,6 +121,15 @@ namespace Banshee.Gui.TrackEditor
             return (bool)model.GetValue (iter, 2);
         }
 
+        private int GetValueWidth ()
+        {
+            var column = view.GetColumn (1);
+            var column_width = column.Width - 2 * value_renderer.Xpad -
+                (int)view.StyleGetProperty ("horizontal-separator") -
+                2 * (int)view.StyleGetProperty ("focus-line-width");
+            return (int) column_width;
+        }
+
         private void HandleQueryTooltip(object o, QueryTooltipArgs args)
         {
             TreePath path;
@@ -117,12 +146,9 @@ namespace Banshee.Gui.TrackEditor
                         int width, height;
                         layout.GetPixelSize (out width, out height);
 
-                        var column = view.GetColumn (1);
-                        var column_width = column.Width - 2 * value_renderer.Xpad -
-                            (int)view.StyleGetProperty ("horizontal-separator") -
-                            2 * (int)view.StyleGetProperty ("focus-line-width");
-
+                        var column_width = GetValueWidth ();
                         if (width > column_width) {
+                            var column = view.GetColumn (1);
                             args.Tooltip.Text = text;
                             view.SetTooltipCell (args.Tooltip, path, column, value_renderer);
                             args.RetVal = true;
@@ -225,23 +251,28 @@ namespace Banshee.Gui.TrackEditor
         private void CreateModel ()
         {
             if (model == null) {
-                model = new ListStore (typeof (string), typeof (string), typeof (bool));
+                model = new ListStore (typeof (string), typeof (string), typeof (bool), typeof (Pango.EllipsizeMode), typeof(bool), typeof (int));
                 view.Model = model;
             }
         }
 
         public void AddItem (string name, object value)
         {
+            AddItem (name, value, false);
+        }
+
+        public void AddItem (string name, object value, bool wrapText)
+        {
             CreateModel ();
             if (name != null && value != null) {
-                model.AppendValues (name, value.ToString (), false);
+                model.AppendValues (name, value.ToString (), false, wrapText ? Pango.EllipsizeMode.None : Pango.EllipsizeMode.End, true, wrapText ? 10 : -1);
             }
         }
 
         public void AddSeparator ()
         {
             CreateModel ();
-            model.AppendValues (String.Empty, String.Empty, true);
+            model.AppendValues (String.Empty, String.Empty, true, Pango.EllipsizeMode.End, false, -1);
         }
 
         public int Order {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceModel.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceModel.cs
index 2190aa9..f2ce25e 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceModel.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceModel.cs
@@ -194,6 +194,7 @@ namespace Banshee.Sources.Gui
 
         public void AddSource (Source source, TreeIter parent)
         {
+            ThreadAssist.AssertInMainThread ();
             lock (sync) {
                 if (Filter != null && !Filter (source)) {
                     return;
@@ -211,10 +212,13 @@ namespace Banshee.Sources.Gui
 
                 int position = source.Order;
 
-                var type = source is SourceManager.GroupSource ? EntryType.Group : EntryType.Source;
                 TreeIter iter = parent.Equals (TreeIter.Zero)
-                    ? InsertWithValues (position, source, source.Order, type)
-                    : InsertWithValues (parent, position, source, source.Order, type);
+                    ? InsertNode (position)
+                    : InsertNode (parent, position);
+
+                SetValue (iter, 0, source);
+                SetValue (iter, 1, source.Order);
+                SetValue (iter, 2, source is SourceManager.GroupSource ? EntryType.Group : EntryType.Source);
 
                 lock (source.Children) {
                     foreach (Source child in source.Children) {
@@ -231,6 +235,7 @@ namespace Banshee.Sources.Gui
 
         public void RemoveSource (Source source)
         {
+            ThreadAssist.AssertInMainThread ();
             lock (sync) {
                 TreeIter iter = FindSource (source);
                 if (!iter.Equals (TreeIter.Zero)) {
@@ -246,6 +251,7 @@ namespace Banshee.Sources.Gui
 
         public void Refresh ()
         {
+            ThreadAssist.AssertInMainThread ();
             Clear ();
             foreach (Source source in ServiceManager.SourceManager.Sources) {
                 AddSource (source);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs
index b8337ac..e08e8ed 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs
@@ -49,8 +49,8 @@ namespace Banshee.Sources.Gui
                 return;
             }
 
-            var type = (SourceModel.EntryType) model.GetValue (iter, (int)SourceModel.Columns.Type);
-            if (type != SourceModel.EntryType.Source) {
+            var type = model.GetValue (iter, (int)SourceModel.Columns.Type);
+            if (type == null || (SourceModel.EntryType) type != SourceModel.EntryType.Source) {
                 renderer.Visible = false;
                 return;
             }
diff --git a/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml b/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml
index 8c60550..547fe75 100644
--- a/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml
+++ b/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml
@@ -183,6 +183,7 @@
       <menuitem name="SearchForSameAlbum" action="SearchForSameAlbumAction"/>
     </menu>
     <separator/>
+    <placeholder name="AboveTrackProperties"/>
     <menuitem name="TrackProperties" action="TrackPropertiesAction"/>
     <menuitem name="TrackEditor" action="TrackEditorAction"/>
   </popup>
diff --git a/src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs b/src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs
index 6cf6dcc..8b1ee2d 100644
--- a/src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs
+++ b/src/Dap/Banshee.Dap.AppleDevice/Banshee.Dap.AppleDevice/AppleDeviceSource.cs
@@ -92,6 +92,7 @@ namespace Banshee.Dap.AppleDevice
             SupportsVideo = Device.SupportsVideo;
 
             Initialize ();
+            GPod.ITDB.InitIpod (Volume.MountPoint, Device.IpodInfo == null ? null : Device.IpodInfo.ModelNumber, Name);
 
             // FIXME: Properly parse the device, color and generation and don't use the fallback strings
 
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd.addin.xml b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd.addin.xml
deleted file mode 100644
index f7351a8..0000000
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd.addin.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Addin 
-    id="Banshee.AudioCd"
-    version="1.0"
-    compatVersion="1.0"
-    copyright="© 2008 Novell Inc. Licensed under the MIT X11 license."
-    name="Audio CD Support"
-    category="Core"
-    description="Listen to and rip Audio CDs."
-    author="Aaron Bockover"
-    url="http://banshee.fm/"
-    defaultEnabled="true">
-
-  <Dependencies>
-    <Addin id="Banshee.Services" version="1.0"/>
-  </Dependencies>
-
-  <Extension path="/Banshee/ServiceManager/Service">
-    <Service class="Banshee.AudioCd.AudioCdService"/>
-  </Extension>
-
-</Addin>
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd.csproj b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd.csproj
deleted file mode 100644
index 1dd0ef7..0000000
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd.csproj
+++ /dev/null
@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <ProjectGuid>{F38B53BA-8F85-4DC6-9B94-029C1CF96F24}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <UseParentDirectoryAsNamespace>true</UseParentDirectoryAsNamespace>
-    <AssemblyName>Banshee.AudioCd</AssemblyName>
-    <SchemaVersion>2.0</SchemaVersion>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-    <Optimize>true</Optimize>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <ReleaseVersion>1.3</ReleaseVersion>
-    <RootNamespace>Banshee.AudioCd</RootNamespace>
-    <AssemblyOriginatorKeyFile>.</AssemblyOriginatorKeyFile>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <WarningLevel>4</WarningLevel>
-    <Optimize>false</Optimize>
-    <OutputPath>..\..\..\bin</OutputPath>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Windows|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <WarningLevel>4</WarningLevel>
-    <Optimize>false</Optimize>
-    <OutputPath>..\..\..\bin</OutputPath>
-  </PropertyGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\Core\Banshee.Core\Banshee.Core.csproj">
-      <Project>{2ADB831A-A050-47D0-B6B9-9C19D60233BB}</Project>
-      <Name>Banshee.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\Core\Banshee.Services\Banshee.Services.csproj">
-      <Project>{B28354F0-BA87-44E8-989F-B864A3C7C09F}</Project>
-      <Name>Banshee.Services</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\Libraries\MusicBrainz\MusicBrainz.csproj">
-      <Project>{C5DD02DE-4F0E-4DC0-ABC7-035A8217CD50}</Project>
-      <Name>MusicBrainz</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\Core\Banshee.ThickClient\Banshee.ThickClient.csproj">
-      <Project>{AC839523-7BDF-4AB6-8115-E17921B96EC6}</Project>
-      <Name>Banshee.ThickClient</Name>
-    </ProjectReference>
-    <Reference Include="atk-sharp">
-      <SpecificVersion>False</SpecificVersion>
-      <Package>gtk-sharp-2.0</Package>
-    </Reference>
-    <Reference Include="glib-sharp">
-      <SpecificVersion>False</SpecificVersion>
-      <Package>glib-sharp-2.0</Package>
-    </Reference>
-    <Reference Include="taglib-sharp">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\bin\taglib-sharp.dll</HintPath>
-      <Package>taglib-sharp</Package>
-    </Reference>
-    <Reference Include="Mono.Addins">
-      <HintPath>..\..\..\bin\Mono.Addins.dll</HintPath>
-      <Package>mono-addins</Package>
-    </Reference>
-    <Reference Include="Mono.Posix">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\bin\Mono.Posix.dll</HintPath>
-    </Reference>
-    <ProjectReference Include="..\..\Hyena\Hyena.Data.Sqlite\Hyena.Data.Sqlite.csproj">
-      <Project>{95374549-9553-4C1E-9D89-667755F90E13}</Project>
-      <Name>Hyena.Data.Sqlite</Name>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\Hyena\Hyena\Hyena.csproj">
-      <Project>{95374549-9553-4C1E-9D89-667755F90E12}</Project>
-      <Name>Hyena</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\Hyena\Hyena.Gui\Hyena.Gui.csproj">
-      <Project>{C856EFD8-E812-4E61-8B76-E3583D94C233}</Project>
-      <Name>Hyena.Gui</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="gtk-sharp">
-      <SpecificVersion>False</SpecificVersion>
-      <Package>gtk-sharp-2.0</Package>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="Banshee.AudioCd.addin.xml">
-      <LogicalName>Banshee.AudioCd.addin.xml</LogicalName>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Resources\ActiveSourceUI.xml">
-      <LogicalName>ActiveSourceUI.xml</LogicalName>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Resources\GlobalUI.xml">
-      <LogicalName>GlobalUI.xml</LogicalName>
-    </EmbeddedResource>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Banshee.AudioCd\AudioCdService.cs" />
-    <Compile Include="Banshee.AudioCd\AudioCdSource.cs" />
-    <Compile Include="Banshee.AudioCd\AudioCdDiscModel.cs" />
-    <Compile Include="Banshee.AudioCd\AudioCdTrackInfo.cs" />
-    <Compile Include="Banshee.AudioCd\AudioCdRipper.cs" />
-    <Compile Include="Banshee.AudioCd\AudioCdDuplicator.cs" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <ProjectExtensions>
-    <MonoDevelop>
-      <Properties>
-        <MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="true" RelativeMakefileName="./Makefile.am">
-          <BuildFilesVar Sync="true" Name="SOURCES" />
-          <DeployFilesVar />
-          <ResourcesVar Sync="true" Name="RESOURCES" />
-          <OthersVar />
-          <GacRefVar />
-          <AsmRefVar />
-          <ProjectRefVar />
-        </MonoDevelop.Autotools.MakefileInfo>
-      </Properties>
-    </MonoDevelop>
-  </ProjectExtensions>
-</Project>
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs
deleted file mode 100644
index 24b6972..0000000
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs
+++ /dev/null
@@ -1,299 +0,0 @@
-//
-// AudioCdDisc.cs
-//
-// Author:
-//   Aaron Bockover <abockover@novell.com>
-//
-// Copyright (C) 2008 Novell, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using System.Threading;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-
-using Mono.Unix;
-using MusicBrainz;
-
-using Hyena;
-using Banshee.Base;
-using Banshee.Hardware;
-using Banshee.Collection;
-using Banshee.Collection.Database;
-
-namespace Banshee.AudioCd
-{
-    public class AudioCdDiscModel : MemoryTrackListModel
-    {
-        // 44.1 kHz sample rate * 16 bit channel resolution * 2 channels (stereo)
-        private const long PCM_FACTOR = 176400;
-
-        private IDiscVolume volume;
-
-        public event EventHandler MetadataQueryStarted;
-        public event EventHandler MetadataQueryFinished;
-        public event EventHandler EnabledCountChanged;
-
-        private bool metadata_query_success;
-        private DateTime metadata_query_start_time;
-
-        public bool MetadataQuerySuccess {
-            get { return metadata_query_success; }
-        }
-
-        private TimeSpan duration;
-        public TimeSpan Duration {
-            get { return duration; }
-        }
-
-        private long file_size;
-        public long FileSize {
-            get { return file_size; }
-        }
-
-        public AudioCdDiscModel (IDiscVolume volume)
-        {
-            this.volume = volume;
-            disc_title = Catalog.GetString ("Audio CD");
-        }
-
-        public void NotifyUpdated ()
-        {
-            OnReloaded ();
-        }
-
-        public void LoadModelFromDisc ()
-        {
-            Clear ();
-
-            LocalDisc mb_disc = LocalDisc.GetFromDevice (volume.DeviceNode);
-            if (mb_disc == null) {
-                throw new ApplicationException ("Could not read contents of the disc. Platform may not be supported.");
-            }
-
-            TimeSpan[] durations = mb_disc.GetTrackDurations ();
-            for (int i = 0, n = durations.Length; i < n; i++) {
-                AudioCdTrackInfo track = new AudioCdTrackInfo (this, volume.DeviceNode, i);
-                track.TrackNumber = i + 1;
-                track.TrackCount = n;
-                track.DiscNumber = 1;
-                track.Duration = durations[i];
-                track.ArtistName = Catalog.GetString ("Unknown Artist");
-                track.AlbumTitle = Catalog.GetString ("Unknown Album");
-                track.TrackTitle = String.Format (Catalog.GetString ("Track {0}"), track.TrackNumber);
-                track.FileSize = PCM_FACTOR * (uint)track.Duration.TotalSeconds;
-                Add (track);
-
-                duration += track.Duration;
-                file_size += track.FileSize;
-            }
-
-            EnabledCount = Count;
-
-            Reload ();
-
-            ThreadPool.QueueUserWorkItem (LoadDiscMetadata, mb_disc);
-        }
-
-        private void LoadDiscMetadata (object state)
-        {
-            try {
-                LocalDisc mb_disc = (LocalDisc)state;
-
-                OnMetadataQueryStarted (mb_disc);
-
-                Release release = Release.Query (mb_disc).PerfectMatch ();
-
-                var tracks = release.GetTracks ();
-                if (release == null || tracks.Count != Count) {
-                    OnMetadataQueryFinished (false);
-                    return;
-                }
-
-                disc_title = release.GetTitle ();
-
-                int disc_number = 1;
-                int i = 0;
-
-                foreach (Disc disc in release.GetDiscs ()) {
-                    i++;
-                    if (disc.Id == mb_disc.Id) {
-                        disc_number = i;
-                    }
-                }
-
-                DateTime release_date = DateTime.MaxValue;
-
-                foreach (Event release_event in release.GetEvents ()) {
-                    if (release_event.Date != null) {
-                        try {
-                            // Handle "YYYY" dates
-                            var date_str = release_event.Date;
-                            DateTime date = DateTime.Parse (
-                                date_str.Length > 4 ? date_str : date_str + "-01",
-                                ApplicationContext.InternalCultureInfo
-                            );
-
-                            if (date < release_date) {
-                                release_date = date;
-                            }
-                        } catch {
-                        }
-                    }
-                }
-
-                DatabaseArtistInfo artist = new DatabaseArtistInfo ();
-                var mb_artist = release.GetArtist ();
-                artist.Name = mb_artist.GetName ();
-                artist.NameSort = mb_artist.GetSortName ();
-                artist.MusicBrainzId = mb_artist.Id;
-                bool is_compilation = false;
-
-                DatabaseAlbumInfo album = new DatabaseAlbumInfo ();
-                album.Title = disc_title;
-                album.ArtistName = artist.Name;
-                album.MusicBrainzId = release.Id;
-                album.ReleaseDate = release_date == DateTime.MaxValue ? DateTime.MinValue : release_date;
-
-                i = 0;
-                foreach (Track track in tracks) {
-                    AudioCdTrackInfo model_track = (AudioCdTrackInfo)this[i++];
-                    var mb_track_artist = track.GetArtist ();
-
-                    model_track.MusicBrainzId = track.Id;
-                    model_track.TrackTitle = track.GetTitle ();
-                    model_track.ArtistName = mb_track_artist.GetName ();
-                    model_track.AlbumTitle = disc_title;
-                    model_track.DiscNumber = disc_number;
-                    model_track.Album = album;
-
-                    model_track.Artist = new DatabaseArtistInfo ();
-                    model_track.Artist.Name = model_track.ArtistName;
-                    model_track.Artist.NameSort = mb_track_artist.GetSortName ();
-                    model_track.Artist.MusicBrainzId = mb_track_artist.Id;
-
-                    if (release_date != DateTime.MinValue) {
-                        model_track.Year = release_date.Year;
-                    }
-
-                    if (!is_compilation && mb_track_artist.Id != artist.MusicBrainzId) {
-                        is_compilation = true;
-                    }
-                }
-
-                if (is_compilation) {
-                    album.IsCompilation = true;
-                    for (i = 0; i < tracks.Count; i++) {
-                        AudioCdTrackInfo model_track = (AudioCdTrackInfo)this[i];
-                        model_track.IsCompilation = true;
-                        model_track.AlbumArtist = artist.Name;
-                        model_track.AlbumArtistSort = artist.NameSort;
-                    }
-                }
-
-                OnMetadataQueryFinished (true);
-            } catch (Exception ex) {
-                Log.DebugException (ex);
-                OnMetadataQueryFinished (false);
-            }
-        }
-
-        private void OnMetadataQueryStarted (LocalDisc mb_disc)
-        {
-            metadata_query_success = false;
-            metadata_query_start_time = DateTime.Now;
-            Log.InformationFormat ("Querying MusicBrainz for Disc Release ({0})", mb_disc.Id);
-
-            ThreadAssist.ProxyToMain (delegate {
-                EventHandler handler = MetadataQueryStarted;
-                if (handler != null) {
-                    handler (this, EventArgs.Empty);
-                }
-            });
-        }
-
-        private void OnMetadataQueryFinished (bool success)
-        {
-            metadata_query_success = success;
-            Log.InformationFormat ("Query finished (success: {0}, {1} seconds)",
-                success, (DateTime.Now - metadata_query_start_time).TotalSeconds);
-
-            ThreadAssist.ProxyToMain (delegate {
-                Reload ();
-
-                EventHandler handler = MetadataQueryFinished;
-                if (handler != null) {
-                    handler (this, EventArgs.Empty);
-                }
-            });
-        }
-
-        private void OnEnabledCountChanged ()
-        {
-            EventHandler handler = EnabledCountChanged;
-            if (handler != null) {
-                handler (this, EventArgs.Empty);
-            }
-        }
-
-        private ICdromDevice Drive {
-            get { return Volume == null ? null : (Volume.Parent as ICdromDevice); }
-        }
-
-        public bool LockDoor ()
-        {
-            ICdromDevice drive = Drive;
-            return drive != null ? drive.LockDoor () : false;
-        }
-
-        public bool UnlockDoor ()
-        {
-            ICdromDevice drive = Drive;
-            return drive != null ? drive.UnlockDoor () : false;
-        }
-
-        public bool IsDoorLocked {
-            get {
-                ICdromDevice drive = Drive;
-                return drive != null ? drive.IsDoorLocked : false;
-            }
-        }
-
-        public IDiscVolume Volume {
-            get { return volume; }
-        }
-
-        private string disc_title;
-        public string Title {
-            get { return disc_title; }
-        }
-
-        private int enabled_count;
-        public int EnabledCount {
-            get { return enabled_count; }
-            internal set {
-                enabled_count = value;
-                OnEnabledCountChanged ();
-            }
-        }
-    }
-}
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDuplicator.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDuplicator.cs
deleted file mode 100644
index 6cc8dd9..0000000
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDuplicator.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-// AudioCdDuplicator.cs
-//
-// Author:
-//   Aaron Bockover <abockover@novell.com>
-//
-// Copyright (C) 2008 Novell, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using Mono.Addins;
-
-using Banshee.Hardware;
-
-namespace Banshee.AudioCd
-{
-    public static class AudioCdDuplicator
-    {
-        private static bool duplicator_extension_queried = false;
-        private static TypeExtensionNode duplicator_extension_node = null;
-
-        public static bool Supported {
-            get {
-                if (duplicator_extension_queried) {
-                    return duplicator_extension_node != null;
-                }
-
-                duplicator_extension_queried = true;
-
-                foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (
-                    "/Banshee/Platform/DiscDuplicator")) {
-                    duplicator_extension_node = node;
-                    break;
-                }
-
-                return duplicator_extension_node != null;
-            }
-        }
-
-        public static void Duplicate (AudioCdDiscModel model)
-        {
-            if (Supported && model != null && model.Volume != null) {
-                ((IDiscDuplicator)duplicator_extension_node.CreateInstance ()).Duplicate (model.Volume);
-            }
-        }
-    }
-}
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs
deleted file mode 100644
index 0f748c1..0000000
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs
+++ /dev/null
@@ -1,288 +0,0 @@
-//
-// AudioCdRipper.cs
-//
-// Author:
-//   Aaron Bockover <abockover@novell.com>
-//
-// Copyright (C) 2008 Novell, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using System.Collections.Generic;
-
-using Mono.Unix;
-using Mono.Addins;
-
-using Hyena;
-using Hyena.Jobs;
-
-using Banshee.Library;
-using Banshee.ServiceStack;
-using Banshee.Streaming;
-using Banshee.Collection;
-using Banshee.Collection.Database;
-using Banshee.MediaEngine;
-
-namespace Banshee.AudioCd
-{
-    public class AudioCdRipper : IDisposable
-    {
-        private static bool ripper_extension_queried = false;
-        private static TypeExtensionNode ripper_extension_node = null;
-
-        public static bool Supported {
-            get {
-                if (ripper_extension_queried) {
-                    return ripper_extension_node != null;
-                }
-
-                ripper_extension_queried = true;
-
-                foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (
-                    "/Banshee/MediaEngine/AudioCdRipper")) {
-                    ripper_extension_node = node;
-                    break;
-                }
-
-                return ripper_extension_node != null;
-            }
-        }
-
-        public event EventHandler Finished;
-
-        // State that does real work
-        private IAudioCdRipper ripper;
-        private AudioCdSource source;
-        private UserJob user_job;
-
-        // State to process the rip operation
-        private Queue<AudioCdTrackInfo> queue = new Queue<AudioCdTrackInfo> ();
-
-        private TimeSpan ripped_duration;
-        private TimeSpan total_duration;
-        private int track_index;
-
-        // State to compute/display the rip speed (i.e. 24x)
-        private TimeSpan last_speed_poll_duration;
-        private DateTime last_speed_poll_time;
-        private double last_speed_poll_factor;
-        private string status;
-
-        public AudioCdRipper (AudioCdSource source)
-        {
-            if (ripper_extension_node != null) {
-                ripper = (IAudioCdRipper)ripper_extension_node.CreateInstance ();
-                ripper.TrackFinished += OnTrackFinished;
-                ripper.Progress += OnProgress;
-                ripper.Error += OnError;
-            } else {
-                throw new ApplicationException ("No AudioCdRipper extension is installed");
-            }
-
-            this.source = source;
-        }
-
-        public void Start ()
-        {
-            ResetState ();
-
-            foreach (AudioCdTrackInfo track in source.DiscModel) {
-                if (track.RipEnabled) {
-                    total_duration += track.Duration;
-                    queue.Enqueue (track);
-                }
-            }
-
-            if (queue.Count == 0) {
-                return;
-            }
-
-            source.LockAllTracks ();
-
-            user_job = new UserJob (Catalog.GetString ("Importing Audio CD"),
-                Catalog.GetString ("Initializing Drive"), "media-import-audio-cd");
-            user_job.CancelMessage = String.Format (Catalog.GetString (
-                "<i>{0}</i> is still being imported into the music library. Would you like to stop it?"
-                ), GLib.Markup.EscapeText (source.DiscModel.Title));
-            user_job.SetResources (Resource.Cpu);
-            user_job.PriorityHints = PriorityHints.SpeedSensitive | PriorityHints.DataLossIfStopped;
-            user_job.CanCancel = true;
-            user_job.CancelRequested += OnCancelRequested;
-            user_job.Finished += OnFinished;
-            user_job.Register ();
-
-            if (source != null && source.DiscModel != null) {
-                if (!source.DiscModel.LockDoor ()) {
-                    Hyena.Log.Warning ("Could not lock CD-ROM door", false);
-                }
-            }
-
-            ripper.Begin (source.DiscModel.Volume.DeviceNode, AudioCdService.ErrorCorrection.Get ());
-
-            RipNextTrack ();
-        }
-
-        public void Dispose ()
-        {
-            ResetState ();
-
-            if (source != null && source.DiscModel != null) {
-                source.DiscModel.UnlockDoor ();
-            }
-
-            if (ripper != null) {
-                ripper.Finish ();
-                ripper = null;
-            }
-
-            if (user_job != null) {
-                user_job.Finish ();
-                user_job = null;
-            }
-        }
-
-        private void ResetState ()
-        {
-            track_index = 0;
-            ripped_duration = TimeSpan.Zero;
-            total_duration = TimeSpan.Zero;
-            last_speed_poll_duration = TimeSpan.Zero;
-            last_speed_poll_time = DateTime.MinValue;
-            last_speed_poll_factor = 0;
-            status = null;
-            queue.Clear ();
-        }
-
-        private void RipNextTrack ()
-        {
-            if (queue.Count == 0) {
-                OnFinished ();
-                Dispose ();
-                return;
-            }
-
-            AudioCdTrackInfo track = queue.Dequeue ();
-
-            user_job.Title = String.Format (Catalog.GetString ("Importing {0} of {1}"),
-                ++track_index, source.DiscModel.EnabledCount);
-            status = String.Format("{0} - {1}", track.ArtistName, track.TrackTitle);
-            user_job.Status = status;
-
-            SafeUri uri = new SafeUri (MusicLibrarySource.MusicFileNamePattern.BuildFull (
-                ServiceManager.SourceManager.MusicLibrary.BaseDirectory, track, null));
-            bool tagging_supported;
-            ripper.RipTrack (track.IndexOnDisc, track, uri, out tagging_supported);
-        }
-
-#region Ripper Event Handlers
-
-        private void OnTrackFinished (object o, AudioCdRipperTrackFinishedArgs args)
-        {
-            if (user_job == null || ripper == null) {
-                return;
-            }
-
-            AudioCdTrackInfo track = (AudioCdTrackInfo)args.Track;
-
-            ripped_duration += track.Duration;
-            track.PrimarySource = ServiceManager.SourceManager.MusicLibrary;
-            track.Uri = args.Uri;
-
-            track.FileSize = Banshee.IO.File.GetSize (track.Uri);
-            track.FileModifiedStamp = Banshee.IO.File.GetModifiedTime (track.Uri);
-            track.LastSyncedStamp = DateTime.Now;
-
-            using (var file = StreamTagger.ProcessUri (track.Uri)) {
-                StreamTagger.TrackInfoMerge (track, file, true);
-            }
-
-            track.Save ();
-
-            source.UnlockTrack (track);
-            RipNextTrack ();
-        }
-
-        private void OnProgress (object o, AudioCdRipperProgressArgs args)
-        {
-            if (user_job == null) {
-                return;
-            }
-
-            TimeSpan total_ripped_duration = ripped_duration + args.EncodedTime;
-            user_job.Progress = total_ripped_duration.TotalMilliseconds / total_duration.TotalMilliseconds;
-
-            TimeSpan poll_diff = DateTime.Now - last_speed_poll_time;
-            double factor = 0;
-
-            if (poll_diff.TotalMilliseconds >= 1000) {
-                factor = ((total_ripped_duration - last_speed_poll_duration).TotalMilliseconds
-                    * (poll_diff.TotalMilliseconds / 1000.0)) / 1000.0;
-
-                last_speed_poll_duration = total_ripped_duration;
-                last_speed_poll_time = DateTime.Now;
-                last_speed_poll_factor = factor > 1 ? factor : 0;
-            }
-
-            // Make sure the speed factor is between 1 and 200 to allow it to ramp and settle
-            user_job.Status = last_speed_poll_factor > 1 && last_speed_poll_factor <= 200
-                ? String.Format ("{0} ({1:0.0}x)", status, last_speed_poll_factor)
-                : status;
-        }
-
-        private void OnError (object o, AudioCdRipperErrorArgs args)
-        {
-            Dispose ();
-            Hyena.Log.Error (Catalog.GetString ("Cannot Import CD"), args.Message, true);
-        }
-
-#endregion
-
-        private void OnFinished ()
-        {
-            EventHandler handler = Finished;
-            if (handler != null) {
-                handler (this, EventArgs.Empty);
-            }
-        }
-
-#region User Job Event Handlers
-
-        private void OnCancelRequested (object o, EventArgs args)
-        {
-            Dispose ();
-        }
-
-        private void OnFinished (object o, EventArgs args)
-        {
-            if (user_job != null) {
-                user_job.CancelRequested -= OnCancelRequested;
-                user_job.Finished -= OnFinished;
-                user_job = null;
-            }
-
-            source.UnlockAllTracks ();
-        }
-
-#endregion
-
-    }
-}
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs
deleted file mode 100644
index d8eb5cc..0000000
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs
+++ /dev/null
@@ -1,380 +0,0 @@
-//
-// AudioCdService.cs
-//
-// Author:
-//   Aaron Bockover <abockover@novell.com>
-//
-// Copyright (C) 2008 Novell, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using System.Collections.Generic;
-using Mono.Unix;
-
-using Hyena;
-
-using Banshee.ServiceStack;
-using Banshee.Configuration;
-using Banshee.Preferences;
-using Banshee.Hardware;
-using Banshee.Gui;
-
-namespace Banshee.AudioCd
-{
-    public class AudioCdService : IExtensionService, IDisposable
-    {
-        private Dictionary<string, AudioCdSource> sources;
-        private List<DeviceCommand> unhandled_device_commands;
-        private SourcePage pref_page;
-        private Section pref_section;
-        private uint global_interface_id;
-
-        public AudioCdService ()
-        {
-        }
-
-        public void Initialize ()
-        {
-            lock (this) {
-                InstallPreferences ();
-
-                sources = new Dictionary<string, AudioCdSource> ();
-
-                foreach (ICdromDevice device in ServiceManager.HardwareManager.GetAllCdromDevices ()) {
-                    MapCdromDevice (device);
-                }
-
-                ServiceManager.HardwareManager.DeviceAdded += OnHardwareDeviceAdded;
-                ServiceManager.HardwareManager.DeviceRemoved += OnHardwareDeviceRemoved;
-                ServiceManager.HardwareManager.DeviceCommand += OnDeviceCommand;
-
-                SetupActions ();
-            }
-        }
-
-        public void Dispose ()
-        {
-            lock (this) {
-                UninstallPreferences ();
-
-                ServiceManager.HardwareManager.DeviceAdded -= OnHardwareDeviceAdded;
-                ServiceManager.HardwareManager.DeviceRemoved -= OnHardwareDeviceRemoved;
-                ServiceManager.HardwareManager.DeviceCommand -= OnDeviceCommand;
-
-                foreach (AudioCdSource source in sources.Values) {
-                    source.Dispose ();
-                    ServiceManager.SourceManager.RemoveSource (source);
-                }
-
-                sources.Clear ();
-                sources = null;
-
-                DisposeActions ();
-            }
-        }
-
-        private void MapCdromDevice (ICdromDevice device)
-        {
-            lock (this) {
-                foreach (IVolume volume in device) {
-                    if (volume is IDiscVolume) {
-                        MapDiscVolume ((IDiscVolume)volume);
-                    }
-                }
-            }
-        }
-
-        private void MapDiscVolume (IDiscVolume volume)
-        {
-            lock (this) {
-                if (!sources.ContainsKey (volume.Uuid) && volume.HasAudio) {
-                    AudioCdSource source = new AudioCdSource (this, new AudioCdDiscModel (volume));
-                    sources.Add (volume.Uuid, source);
-                    ServiceManager.SourceManager.AddSource (source);
-
-                    // If there are any queued device commands, see if they are to be
-                    // handled by this new volume (e.g. --device-activate-play=cdda://sr0/)
-                    try {
-                        if (unhandled_device_commands != null) {
-                            foreach (DeviceCommand command in unhandled_device_commands) {
-                                if (DeviceCommandMatchesSource (source, command)) {
-                                    HandleDeviceCommand (source, command.Action);
-                                    unhandled_device_commands.Remove (command);
-                                    if (unhandled_device_commands.Count == 0) {
-                                        unhandled_device_commands = null;
-                                    }
-                                    break;
-                                }
-                            }
-                        }
-                    } catch (Exception e) {
-                        Log.Exception (e);
-                    }
-
-                    Log.DebugFormat ("Mapping audio CD ({0})", volume.Uuid);
-                }
-            }
-        }
-
-        internal void UnmapDiscVolume (string uuid)
-        {
-            lock (this) {
-                if (sources.ContainsKey (uuid)) {
-                    AudioCdSource source = sources[uuid];
-                    source.StopPlayingDisc ();
-                    ServiceManager.SourceManager.RemoveSource (source);
-                    sources.Remove (uuid);
-                    Log.DebugFormat ("Unmapping audio CD ({0})", uuid);
-                }
-            }
-        }
-
-        private void OnHardwareDeviceAdded (object o, DeviceAddedArgs args)
-        {
-            lock (this) {
-                if (args.Device is ICdromDevice) {
-                    MapCdromDevice ((ICdromDevice)args.Device);
-                } else if (args.Device is IDiscVolume) {
-                    MapDiscVolume ((IDiscVolume)args.Device);
-                }
-            }
-        }
-
-        private void OnHardwareDeviceRemoved (object o, DeviceRemovedArgs args)
-        {
-            lock (this) {
-                UnmapDiscVolume (args.DeviceUuid);
-            }
-        }
-
-#region DeviceCommand Handling
-
-        private bool DeviceCommandMatchesSource (AudioCdSource source, DeviceCommand command)
-        {
-            if (command.DeviceId.StartsWith ("cdda:")) {
-                try {
-                    Uri uri = new Uri (command.DeviceId);
-                    string match_device_node = String.Format ("{0}{1}", uri.Host,
-                        uri.AbsolutePath).TrimEnd ('/', '\\');
-                    string device_node = source.DiscModel.Volume.DeviceNode;
-                    return device_node.EndsWith (match_device_node);
-                } catch {
-                }
-            }
-
-            return false;
-        }
-
-        private void HandleDeviceCommand (AudioCdSource source, DeviceCommandAction action)
-        {
-            if ((action & DeviceCommandAction.Activate) != 0) {
-                ServiceManager.SourceManager.SetActiveSource (source);
-            }
-
-            if ((action & DeviceCommandAction.Play) != 0) {
-                ServiceManager.PlaybackController.NextSource = source;
-                if (!ServiceManager.PlayerEngine.IsPlaying ()) {
-                    ServiceManager.PlaybackController.Next ();
-                }
-            }
-        }
-
-        private void OnDeviceCommand (object o, DeviceCommand command)
-        {
-            lock (this) {
-                // Check to see if we have an already mapped disc volume that should
-                // handle this incoming command; if not, queue it for later discs
-                foreach (AudioCdSource source in sources.Values) {
-                    if (DeviceCommandMatchesSource (source, command)) {
-                        HandleDeviceCommand (source, command.Action);
-                        return;
-                    }
-                }
-
-                if (unhandled_device_commands == null) {
-                    unhandled_device_commands = new List<DeviceCommand> ();
-                }
-                unhandled_device_commands.Add (command);
-            }
-        }
-
-#endregion
-
-#region Preferences
-
-        private void InstallPreferences ()
-        {
-            PreferenceService service = ServiceManager.Get<PreferenceService> ();
-            if (service == null) {
-                return;
-            }
-
-            service.InstallWidgetAdapters += OnPreferencesServiceInstallWidgetAdapters;
-
-            pref_page = new Banshee.Preferences.SourcePage ("audio-cd", Catalog.GetString ("Audio CDs"), "media-cdrom", 400);
-
-            pref_section = pref_page.Add (new Section ("audio-cd", Catalog.GetString ("Audio CD Importing"), 20));
-            pref_section.ShowLabel = false;
-
-            pref_section.Add (new VoidPreference ("import-profile",  Catalog.GetString ("_Import format")));
-            pref_section.Add (new VoidPreference ("import-profile-desc"));
-
-            pref_section.Add (new SchemaPreference<bool> (AutoRip,
-                Catalog.GetString ("_Automatically import audio CDs when inserted"),
-                Catalog.GetString ("When an audio CD is inserted, automatically begin importing it " +
-                    "if metadata can be found and it is not already in the library.")));
-
-            pref_section.Add (new SchemaPreference<bool> (EjectAfterRipped,
-                Catalog.GetString ("_Eject when done importing"),
-                Catalog.GetString ("When an audio CD has been imported, automatically eject it.")));
-
-            pref_section.Add (new SchemaPreference<bool> (ErrorCorrection,
-                Catalog.GetString ("Use error correction when importing"),
-                Catalog.GetString ("Error correction tries to work around problem areas on a disc, such " +
-                    "as surface scratches, but will slow down importing substantially.")));
-        }
-
-        private void UninstallPreferences ()
-        {
-            PreferenceService service = ServiceManager.Get<PreferenceService> ();
-            if (service == null || pref_page == null) {
-                return;
-            }
-
-            service.InstallWidgetAdapters -= OnPreferencesServiceInstallWidgetAdapters;
-
-            pref_page.Dispose ();
-            pref_page = null;
-            pref_section = null;
-        }
-
-        private void OnPreferencesServiceInstallWidgetAdapters (object o, EventArgs args)
-        {
-            if (pref_section == null) {
-                return;
-            }
-
-            Gtk.HBox description_box = new Gtk.HBox ();
-            Banshee.MediaProfiles.Gui.ProfileComboBoxConfigurable chooser
-                = new Banshee.MediaProfiles.Gui.ProfileComboBoxConfigurable (ServiceManager.MediaProfileManager,
-                    "cd-importing", description_box);
-
-            pref_section["import-profile"].DisplayWidget = chooser;
-            pref_section["import-profile"].MnemonicWidget = chooser.Combo;
-            pref_section["import-profile-desc"].DisplayWidget = description_box;
-        }
-
-        public static readonly SchemaEntry<bool> ErrorCorrection = new SchemaEntry<bool> (
-            "import", "audio_cd_error_correction",
-            false,
-            "Enable error correction",
-            "When importing an audio CD, enable error correction (paranoia mode)"
-        );
-
-        public static readonly SchemaEntry<bool> AutoRip = new SchemaEntry<bool> (
-            "import", "auto_rip_cds",
-            false,
-            "Enable audio CD auto ripping",
-            "When an audio CD is inserted, automatically begin ripping it."
-        );
-
-        public static readonly SchemaEntry<bool> EjectAfterRipped = new SchemaEntry<bool> (
-            "import", "eject_after_ripped",
-            false,
-            "Eject audio CD after ripped",
-            "After an audio CD has been ripped, automatically eject it."
-        );
-
-#endregion
-
-#region UI Actions
-
-        private void SetupActions ()
-        {
-            InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
-            if (uia_service == null) {
-                return;
-            }
-
-            uia_service.GlobalActions.AddImportant (new Gtk.ActionEntry [] {
-                new Gtk.ActionEntry ("RipDiscAction", null,
-                    Catalog.GetString ("Import CD"), null,
-                    Catalog.GetString ("Import this audio CD to the library"),
-                    OnImportDisc)
-            });
-
-            uia_service.GlobalActions.AddImportant (
-                new Gtk.ActionEntry ("DuplicateDiscAction", null,
-                    Catalog.GetString ("Duplicate CD"), null,
-                    Catalog.GetString ("Duplicate this audio CD"),
-                    OnDuplicateDisc)
-            );
-
-            global_interface_id = uia_service.UIManager.AddUiFromResource ("GlobalUI.xml");
-        }
-
-        private void DisposeActions ()
-        {
-            InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
-            if (uia_service == null) {
-                return;
-            }
-
-            uia_service.GlobalActions.Remove ("RipDiscAction");
-            uia_service.GlobalActions.Remove ("DuplicateDiscAction");
-            uia_service.UIManager.RemoveUi (global_interface_id);
-        }
-
-        private void OnImportDisc (object o, EventArgs args)
-        {
-            ImportOrDuplicateDisc (true);
-        }
-
-        private void OnDuplicateDisc (object o, EventArgs args)
-        {
-            ImportOrDuplicateDisc (false);
-        }
-
-        private void ImportOrDuplicateDisc (bool import)
-        {
-            InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
-            if (uia_service == null) {
-                return;
-            }
-
-            AudioCdSource source = uia_service.SourceActions.ActionSource as AudioCdSource;
-            if (source != null) {
-                if (import) {
-                    source.ImportDisc ();
-                } else {
-                    source.DuplicateDisc ();
-                }
-            }
-        }
-
-#endregion
-
-        string IService.ServiceName {
-            get { return "AudioCdService"; }
-        }
-    }
-}
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs
deleted file mode 100644
index 5b99ba8..0000000
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs
+++ /dev/null
@@ -1,490 +0,0 @@
-//
-// AudioCdSource.cs
-//
-// Author:
-//   Aaron Bockover <abockover@novell.com>
-//
-// Copyright (C) 2008 Novell, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using Mono.Unix;
-
-using Hyena;
-using Banshee.Base;
-using Banshee.ServiceStack;
-using Banshee.Sources;
-using Banshee.Library;
-using Banshee.Collection;
-using Banshee.Collection.Database;
-
-using Gtk;
-using Banshee.Gui;
-using Selection = Hyena.Collections.Selection;
-
-namespace Banshee.AudioCd
-{
-    public class AudioCdSource : Source, ITrackModelSource, IUnmapableSource,
-        IImportSource, IDurationAggregator, IFileSizeAggregator, IDisposable
-    {
-        private AudioCdService service;
-        private AudioCdDiscModel disc_model;
-        private SourceMessage query_message;
-
-        public AudioCdSource (AudioCdService service, AudioCdDiscModel discModel)
-            : base (Catalog.GetString ("Audio CD"), discModel.Title, 400)
-        {
-            this.service = service;
-            this.disc_model = discModel;
-
-            TypeUniqueId = "";
-
-            Properties.SetString ("TrackView.ColumnControllerXml", String.Format (@"
-                <column-controller>
-                  <column>
-                    <renderer type=""Hyena.Data.Gui.ColumnCellCheckBox"" property=""RipEnabled""/>
-                  </column>
-                  <add-all-defaults />
-                </column-controller>
-            "));
-
-            disc_model.MetadataQueryStarted += OnMetadataQueryStarted;
-            disc_model.MetadataQueryFinished += OnMetadataQueryFinished;
-            disc_model.EnabledCountChanged += OnEnabledCountChanged;
-            disc_model.LoadModelFromDisc ();
-
-            SetupGui ();
-        }
-
-        public TimeSpan Duration {
-            get { return disc_model.Duration; }
-        }
-
-        public long FileSize {
-            get { return disc_model.FileSize; }
-        }
-
-        public bool DiscIsPlaying {
-            get {
-                AudioCdTrackInfo playing_track = ServiceManager.PlayerEngine.CurrentTrack as AudioCdTrackInfo;
-                return playing_track != null && playing_track.Model == disc_model;
-            }
-        }
-
-        public void StopPlayingDisc ()
-        {
-            if (DiscIsPlaying) {
-                ServiceManager.PlayerEngine.Close (true);
-            }
-        }
-
-        public void Dispose ()
-        {
-            ClearMessages ();
-            disc_model.MetadataQueryStarted -= OnMetadataQueryStarted;
-            disc_model.MetadataQueryFinished -= OnMetadataQueryFinished;
-            disc_model.EnabledCountChanged -= OnEnabledCountChanged;
-            service = null;
-            disc_model = null;
-        }
-
-        public AudioCdDiscModel DiscModel {
-            get { return disc_model; }
-        }
-
-        private void OnEnabledCountChanged (object o, EventArgs args)
-        {
-            UpdateActions ();
-        }
-
-        private void OnMetadataQueryStarted (object o, EventArgs args)
-        {
-            if (query_message != null) {
-                DestroyQueryMessage ();
-            }
-
-            query_message = new SourceMessage (this);
-            query_message.FreezeNotify ();
-            query_message.CanClose = false;
-            query_message.IsSpinning = true;
-            query_message.Text = Catalog.GetString ("Searching for track information...");
-            query_message.ThawNotify ();
-
-            PushMessage (query_message);
-        }
-
-        private void OnMetadataQueryFinished (object o, EventArgs args)
-        {
-            if (disc_model.Title != Name) {
-                Name = disc_model.Title;
-                OnUpdated ();
-            }
-
-            if (disc_model.MetadataQuerySuccess) {
-                DestroyQueryMessage ();
-                if (DiscIsPlaying) {
-                    ServiceManager.PlayerEngine.TrackInfoUpdated ();
-                }
-
-                if (AudioCdService.AutoRip.Get ()) {
-                    BeginAutoRip ();
-                }
-
-                return;
-            }
-
-            if (query_message == null) {
-                return;
-            }
-
-            query_message.FreezeNotify ();
-            query_message.IsSpinning = false;
-            query_message.SetIconName ("dialog-error");
-            query_message.Text = Catalog.GetString ("Could not fetch track information");
-            query_message.CanClose = true;
-            query_message.ThawNotify ();
-        }
-
-        private void DestroyQueryMessage ()
-        {
-            if (query_message != null) {
-                RemoveMessage (query_message);
-                query_message = null;
-            }
-        }
-
-        private void BeginAutoRip ()
-        {
-            // Make sure the album isn't already in the Library
-            TrackInfo track = disc_model[0];
-            int count = ServiceManager.DbConnection.Query<int> (
-                @"SELECT Count(*) FROM CoreTracks, CoreArtists, CoreAlbums WHERE
-                    CoreTracks.PrimarySourceID = ? AND
-                    CoreTracks.ArtistID = CoreArtists.ArtistID AND
-                    CoreTracks.AlbumID = CoreAlbums.AlbumID AND
-                    CoreArtists.Name = ? AND CoreAlbums.Title = ? AND (CoreTracks.Disc = ? OR CoreTracks.Disc = 0)",
-                    ServiceManager.SourceManager.MusicLibrary.DbId,
-                    track.ArtistName, track.AlbumTitle, track.DiscNumber
-            );
-
-            if (count > 0) {
-                SetStatus (Catalog.GetString ("Automatic import off since this album is already in the Music Library."), true, false, null);
-                return;
-            }
-
-            Log.DebugFormat ("Beginning auto rip of {0}", Name);
-            ImportDisc ();
-        }
-
-        internal void ImportDisc ()
-        {
-            AudioCdRipper ripper = null;
-
-            try {
-                if (AudioCdRipper.Supported) {
-                    ripper = new AudioCdRipper (this);
-                    ripper.Finished += OnRipperFinished;
-                    ripper.Start ();
-                }
-            } catch (Exception e) {
-                if (ripper != null) {
-                    ripper.Dispose ();
-                }
-
-                Log.Error (Catalog.GetString ("Could not import CD"), e.Message, true);
-                Log.Exception (e);
-            }
-        }
-
-        private void OnRipperFinished (object o, EventArgs args)
-        {
-            if (AudioCdService.EjectAfterRipped.Get ()) {
-                Unmap ();
-            }
-        }
-
-        internal void DuplicateDisc ()
-        {
-            try {
-                AudioCdDuplicator.Duplicate (disc_model);
-            } catch (Exception e) {
-                Hyena.Log.Error (Catalog.GetString ("Could not duplicate audio CD"), e.Message, true);
-                Hyena.Log.Exception (e);
-            }
-        }
-
-        internal void LockAllTracks ()
-        {
-            StopPlayingDisc ();
-
-            foreach (AudioCdTrackInfo track in disc_model) {
-                track.CanPlay = false;
-            }
-
-            disc_model.NotifyUpdated ();
-        }
-
-        internal void UnlockAllTracks ()
-        {
-            foreach (AudioCdTrackInfo track in disc_model) {
-                track.CanPlay = true;
-            }
-
-            disc_model.NotifyUpdated ();
-        }
-
-        internal void UnlockTrack (AudioCdTrackInfo track)
-        {
-            track.CanPlay = true;
-            disc_model.NotifyUpdated ();
-        }
-
-#region Source Overrides
-
-        public override int Count {
-            get { return disc_model.Count; }
-        }
-
-        public override string PreferencesPageId {
-            get { return "audio-cd"; }
-        }
-
-        public override bool HasEditableTrackProperties {
-            get { return true; }
-        }
-
-        public override bool HasViewableTrackProperties {
-            get { return true; }
-        }
-
-#endregion
-
-#region ITrackModelSource Implementation
-
-        public TrackListModel TrackModel {
-            get { return disc_model; }
-        }
-
-        public AlbumListModel AlbumModel {
-            get { return null; }
-        }
-
-        public ArtistListModel ArtistModel {
-            get { return null; }
-        }
-
-        public void Reload ()
-        {
-            disc_model.Reload ();
-        }
-
-        public void RemoveTracks (Selection selection)
-        {
-        }
-
-        public void DeleteTracks (Selection selection)
-        {
-        }
-
-        public bool CanAddTracks {
-            get { return false; }
-        }
-
-        public bool CanRemoveTracks {
-            get { return false; }
-        }
-
-        public bool CanDeleteTracks {
-            get { return false; }
-        }
-
-        public bool ConfirmRemoveTracks {
-            get { return false; }
-        }
-
-        public virtual bool CanRepeat {
-            get { return true; }
-        }
-
-        public virtual bool CanShuffle {
-            get { return true; }
-        }
-
-        public bool ShowBrowser {
-            get { return false; }
-        }
-
-        public bool HasDependencies {
-            get { return false; }
-        }
-
-        public bool Indexable {
-            get { return false; }
-        }
-
-#endregion
-
-#region IUnmapableSource Implementation
-
-        public bool Unmap ()
-        {
-            StopPlayingDisc ();
-
-            foreach (TrackInfo track in disc_model) {
-                track.CanPlay = false;
-            }
-
-            OnUpdated ();
-
-            SourceMessage eject_message = new SourceMessage (this);
-            eject_message.FreezeNotify ();
-            eject_message.IsSpinning = true;
-            eject_message.CanClose = false;
-            eject_message.Text = Catalog.GetString ("Ejecting audio CD...");
-            eject_message.ThawNotify ();
-            PushMessage (eject_message);
-
-            ThreadPool.QueueUserWorkItem (delegate {
-                try {
-                    disc_model.Volume.Unmount ();
-                    disc_model.Volume.Eject ();
-
-                    ThreadAssist.ProxyToMain (delegate {
-                        service.UnmapDiscVolume (disc_model.Volume.Uuid);
-                        Dispose ();
-                    });
-                } catch (Exception e) {
-                    ThreadAssist.ProxyToMain (delegate {
-                        ClearMessages ();
-                        eject_message.IsSpinning = false;
-                        eject_message.SetIconName ("dialog-error");
-                        eject_message.Text = String.Format (Catalog.GetString ("Could not eject audio CD: {0}"), e.Message);
-                        PushMessage (eject_message);
-
-                        foreach (TrackInfo track in disc_model) {
-                            track.CanPlay = true;
-                        }
-                        OnUpdated ();
-                    });
-
-                    Log.Exception (e);
-                }
-            });
-
-            return true;
-        }
-
-        public bool CanUnmap {
-            get { return DiscModel != null ? !DiscModel.IsDoorLocked : true; }
-        }
-
-        public bool ConfirmBeforeUnmap {
-            get { return false; }
-        }
-
-#endregion
-
-#region GUI/ThickClient
-
-        private bool actions_loaded = false;
-
-        private void SetupGui ()
-        {
-            Properties.SetStringList ("Icon.Name", "media-cdrom", "gnome-dev-cdrom-audio", "source-cd-audio");
-            Properties.SetString ("SourcePreferencesActionLabel", Catalog.GetString ("Audio CD Preferences"));
-            Properties.SetString ("UnmapSourceActionLabel", Catalog.GetString ("Eject Disc"));
-            Properties.SetString ("UnmapSourceActionIconName", "media-eject");
-            Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
-            Properties.SetString ("GtkActionPath", "/AudioCdContextMenu");
-
-            actions_loaded = true;
-
-            UpdateActions ();
-        }
-
-        private void UpdateActions ()
-        {
-            InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
-            if (uia_service == null) {
-                return;
-            }
-
-            Gtk.Action rip_action = uia_service.GlobalActions["RipDiscAction"];
-            if (rip_action != null) {
-                string title = disc_model.Title;
-                int max_title_length = 20;
-                title = title.Length > max_title_length
-                    ? String.Format ("{0}\u2026", title.Substring (0, max_title_length).Trim ())
-                    : title;
-                rip_action.Label = String.Format (Catalog.GetString ("Import \u201f{0}\u201d"), title);
-                rip_action.ShortLabel = Catalog.GetString ("Import CD");
-                rip_action.IconName = "media-import-audio-cd";
-                rip_action.Sensitive = AudioCdRipper.Supported && disc_model.EnabledCount > 0;
-            }
-
-            Gtk.Action duplicate_action = uia_service.GlobalActions["DuplicateDiscAction"];
-            if (duplicate_action != null) {
-                duplicate_action.IconName = "media-cdrom";
-                duplicate_action.Visible = AudioCdDuplicator.Supported;
-            }
-        }
-
-        protected override void OnUpdated ()
-        {
-            if (actions_loaded) {
-                UpdateActions ();
-            }
-
-            base.OnUpdated ();
-        }
-
-#endregion
-
-#region IImportSource
-
-        void IImportSource.Import ()
-        {
-            ImportDisc ();
-        }
-
-        string [] IImportSource.IconNames {
-            get { return Properties.GetStringList ("Icon.Name"); }
-        }
-
-        bool IImportSource.CanImport {
-            get { return true; }
-        }
-
-        int IImportSource.SortOrder {
-            get { return -10; }
-        }
-
-        string IImportSource.ImportLabel {
-            get { return null; }
-        }
-
-#endregion
-
-    }
-}
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs
deleted file mode 100644
index 68e6a26..0000000
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-//
-// AudioCdTrackInfo.cs
-//
-// Author:
-//   Aaron Bockover <abockover@novell.com>
-//
-// Copyright (C) 2008 Novell, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-
-using Hyena;
-
-using Banshee.Collection;
-using Banshee.Collection.Database;
-
-namespace Banshee.AudioCd
-{
-    public class AudioCdTrackInfo : DatabaseTrackInfo
-    {
-        public AudioCdTrackInfo (AudioCdDiscModel model, string deviceNode, int index)
-        {
-            this.model = model;
-            this.index_on_disc = index;
-
-            Uri = new SafeUri (String.Format ("cdda://{0}#{1}", index_on_disc + 1, deviceNode));
-        }
-
-        public override bool TrackEqual (TrackInfo track)
-        {
-            AudioCdTrackInfo cd_track = track as AudioCdTrackInfo;
-            return cd_track == null ? false : (cd_track.Model == Model && cd_track.IndexOnDisc == IndexOnDisc);
-        }
-
-        private AudioCdDiscModel model;
-        public AudioCdDiscModel Model {
-            get { return model; }
-        }
-
-        private int index_on_disc;
-        public int IndexOnDisc {
-            get { return index_on_disc; }
-        }
-
-        private DatabaseAlbumInfo album_info;
-        public new DatabaseAlbumInfo Album {
-            get { return album_info; }
-            set { album_info = value; }
-        }
-
-        public DatabaseArtistInfo artist_info;
-        public new DatabaseArtistInfo Artist {
-            get { return artist_info; }
-            set { artist_info = value; }
-        }
-
-        public override string AlbumMusicBrainzId {
-            get { return Album == null ? null : Album.MusicBrainzId; }
-        }
-
-        public override string ArtistMusicBrainzId {
-            get { return Artist == null ? null : Artist.MusicBrainzId; }
-        }
-
-        public override DateTime ReleaseDate {
-            get { return Album == null ? base.ReleaseDate : Album.ReleaseDate; }
-            set {
-                if (Album == null) {
-                    base.ReleaseDate = value;
-                } else {
-                    Album.ReleaseDate = value;
-                }
-            }
-        }
-
-        private bool rip_enabled = true;
-        public bool RipEnabled {
-            get { return rip_enabled; }
-            set {
-                if (rip_enabled == value) {
-                    return;
-                }
-
-                rip_enabled = value;
-                model.EnabledCount += rip_enabled ? 1 : -1;
-            }
-        }
-    }
-}
diff --git a/src/Extensions/Banshee.AudioCd/Makefile.am b/src/Extensions/Banshee.AudioCd/Makefile.am
deleted file mode 100644
index 7ad475a..0000000
--- a/src/Extensions/Banshee.AudioCd/Makefile.am
+++ /dev/null
@@ -1,20 +0,0 @@
-ASSEMBLY = Banshee.AudioCd
-TARGET = library
-LINK = $(REF_EXTENSION_AUDIOCD)
-INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
-
-SOURCES =  \
-	Banshee.AudioCd/AudioCdDiscModel.cs \
-	Banshee.AudioCd/AudioCdDuplicator.cs \
-	Banshee.AudioCd/AudioCdRipper.cs \
-	Banshee.AudioCd/AudioCdService.cs \
-	Banshee.AudioCd/AudioCdSource.cs \
-	Banshee.AudioCd/AudioCdTrackInfo.cs
-
-RESOURCES =  \
-	Banshee.AudioCd.addin.xml \
-	Resources/ActiveSourceUI.xml \
-	Resources/GlobalUI.xml
-
-include $(top_srcdir)/build/build.mk
-
diff --git a/src/Extensions/Banshee.AudioCd/Resources/ActiveSourceUI.xml b/src/Extensions/Banshee.AudioCd/Resources/ActiveSourceUI.xml
deleted file mode 100644
index 038665e..0000000
--- a/src/Extensions/Banshee.AudioCd/Resources/ActiveSourceUI.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<ui>
-    <toolbar name="HeaderToolbar">
-        <placeholder name="SourceActions">
-            <toolitem action="DuplicateDiscAction"/>
-            <toolitem action="RipDiscAction"/>
-        </placeholder>
-    </toolbar>
-</ui>
diff --git a/src/Extensions/Banshee.AudioCd/Resources/GlobalUI.xml b/src/Extensions/Banshee.AudioCd/Resources/GlobalUI.xml
deleted file mode 100644
index eec6c5f..0000000
--- a/src/Extensions/Banshee.AudioCd/Resources/GlobalUI.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<ui>
-    <popup name="AudioCdContextMenu">
-        <menuitem name="RipDisc" action="RipDiscAction"/>
-        <menuitem name="DuplicateDisc" action="DuplicateDiscAction"/>
-        <menuitem name="SourcePreferences" action="SourcePreferencesAction"/>
-        <separator/>
-        <menuitem name="UnmapSource" action="UnmapSourceAction"/>
-    </popup>
-</ui>
diff --git a/src/Extensions/Banshee.AudioCd/ThemeIcons/16x16/actions/media-import-audio-cd.png b/src/Extensions/Banshee.AudioCd/ThemeIcons/16x16/actions/media-import-audio-cd.png
deleted file mode 100644
index e637fea..0000000
Binary files a/src/Extensions/Banshee.AudioCd/ThemeIcons/16x16/actions/media-import-audio-cd.png and /dev/null differ
diff --git a/src/Extensions/Banshee.AudioCd/ThemeIcons/22x22/actions/media-import-audio-cd.png b/src/Extensions/Banshee.AudioCd/ThemeIcons/22x22/actions/media-import-audio-cd.png
deleted file mode 100644
index ee0d170..0000000
Binary files a/src/Extensions/Banshee.AudioCd/ThemeIcons/22x22/actions/media-import-audio-cd.png and /dev/null differ
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdDiscModel.cs b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdDiscModel.cs
new file mode 100644
index 0000000..5e8b6a8
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdDiscModel.cs
@@ -0,0 +1,271 @@
+//
+// AudioCdDisc.cs
+//
+// Author:
+//   Aaron Bockover <abockover@novell.com>
+//   Alex Launi <alex.launi@canonical.com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Threading;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+
+using Mono.Unix;
+using MusicBrainz;
+
+using Hyena;
+using Banshee.Base;
+using Banshee.Hardware;
+using Banshee.Collection;
+using Banshee.Collection.Database;
+
+namespace Banshee.Discs.AudioCd
+{
+    public class AudioCdDiscModel : DiscModel
+    {
+        // 44.1 kHz sample rate * 16 bit channel resolution * 2 channels (stereo)
+        private const long PCM_FACTOR = 176400;
+
+        public event EventHandler MetadataQueryStarted;
+        public event EventHandler MetadataQueryFinished;
+        public event EventHandler EnabledCountChanged;
+
+        private bool metadata_query_success;
+        private DateTime metadata_query_start_time;
+
+        public bool MetadataQuerySuccess {
+            get { return metadata_query_success; }
+        }
+
+        private TimeSpan duration;
+        public TimeSpan Duration {
+            get { return duration; }
+        }
+
+        private long file_size;
+        public long FileSize {
+            get { return file_size; }
+        }
+
+        public AudioCdDiscModel (IDiscVolume volume)
+            : base (volume)
+        {
+            disc_title = Catalog.GetString ("Audio CD");
+        }
+
+        public void NotifyUpdated ()
+        {
+            OnReloaded ();
+        }
+
+        public override void LoadModelFromDisc ()
+        {
+            Clear ();
+
+            LocalDisc mb_disc = LocalDisc.GetFromDevice (Volume.DeviceNode);
+            if (mb_disc == null) {
+                throw new ApplicationException ("Could not read contents of the disc. Platform may not be supported.");
+            }
+
+            TimeSpan[] durations = mb_disc.GetTrackDurations ();
+            for (int i = 0, n = durations.Length; i < n; i++) {
+                AudioCdTrackInfo track = new AudioCdTrackInfo (this, Volume.DeviceNode, i);
+                track.TrackNumber = i + 1;
+                track.TrackCount = n;
+                track.DiscNumber = 1;
+                track.Duration = durations[i];
+                track.ArtistName = Catalog.GetString ("Unknown Artist");
+                track.AlbumTitle = Catalog.GetString ("Unknown Album");
+                track.TrackTitle = String.Format (Catalog.GetString ("Track {0}"), track.TrackNumber);
+                track.FileSize = PCM_FACTOR * (uint)track.Duration.TotalSeconds;
+                Add (track);
+
+                duration += track.Duration;
+                file_size += track.FileSize;
+            }
+
+            EnabledCount = Count;
+
+            Reload ();
+
+            ThreadPool.QueueUserWorkItem (LoadDiscMetadata, mb_disc);
+        }
+
+        private void LoadDiscMetadata (object state)
+        {
+            try {
+                LocalDisc mb_disc = (LocalDisc)state;
+
+                OnMetadataQueryStarted (mb_disc);
+
+                Release release = Release.Query (mb_disc).PerfectMatch ();
+
+                var tracks = release.GetTracks ();
+                if (release == null || tracks.Count != Count) {
+                    OnMetadataQueryFinished (false);
+                    return;
+                }
+
+                disc_title = release.GetTitle ();
+
+                int disc_number = 1;
+                int i = 0;
+
+                foreach (Disc disc in release.GetDiscs ()) {
+                    i++;
+                    if (disc.Id == mb_disc.Id) {
+                        disc_number = i;
+                    }
+                }
+
+                DateTime release_date = DateTime.MaxValue;
+
+                foreach (Event release_event in release.GetEvents ()) {
+                    if (release_event.Date != null) {
+                        try {
+                            // Handle "YYYY" dates
+                            var date_str = release_event.Date;
+                            DateTime date = DateTime.Parse (
+                                date_str.Length > 4 ? date_str : date_str + "-01",
+                                ApplicationContext.InternalCultureInfo
+                            );
+
+                            if (date < release_date) {
+                                release_date = date;
+                            }
+                        } catch {
+                        }
+                    }
+                }
+
+                DatabaseArtistInfo artist = new DatabaseArtistInfo ();
+                var mb_artist = release.GetArtist ();
+                artist.Name = mb_artist.GetName ();
+                artist.NameSort = mb_artist.GetSortName ();
+                artist.MusicBrainzId = mb_artist.Id;
+                bool is_compilation = false;
+
+                DatabaseAlbumInfo album = new DatabaseAlbumInfo ();
+                album.Title = disc_title;
+                album.ArtistName = artist.Name;
+                album.MusicBrainzId = release.Id;
+                album.ReleaseDate = release_date == DateTime.MaxValue ? DateTime.MinValue : release_date;
+
+                i = 0;
+                foreach (Track track in tracks) {
+                    AudioCdTrackInfo model_track = (AudioCdTrackInfo)this[i++];
+                    var mb_track_artist = track.GetArtist ();
+
+                    model_track.MusicBrainzId = track.Id;
+                    model_track.TrackTitle = track.GetTitle ();
+                    model_track.ArtistName = mb_track_artist.GetName ();
+                    model_track.AlbumTitle = disc_title;
+                    model_track.DiscNumber = disc_number;
+                    model_track.Album = album;
+
+                    model_track.Artist = new DatabaseArtistInfo ();
+                    model_track.Artist.Name = model_track.ArtistName;
+                    model_track.Artist.NameSort = mb_track_artist.GetSortName ();
+                    model_track.Artist.MusicBrainzId = mb_track_artist.Id;
+
+                    if (release_date != DateTime.MinValue) {
+                        model_track.Year = release_date.Year;
+                    }
+
+                    if (!is_compilation && mb_track_artist.Id != artist.MusicBrainzId) {
+                        is_compilation = true;
+                    }
+                }
+
+                if (is_compilation) {
+                    album.IsCompilation = true;
+                    for (i = 0; i < tracks.Count; i++) {
+                        AudioCdTrackInfo model_track = (AudioCdTrackInfo)this[i];
+                        model_track.IsCompilation = true;
+                        model_track.AlbumArtist = artist.Name;
+                        model_track.AlbumArtistSort = artist.NameSort;
+                    }
+                }
+
+                OnMetadataQueryFinished (true);
+            } catch (Exception ex) {
+                Log.DebugException (ex);
+                OnMetadataQueryFinished (false);
+            }
+        }
+
+        private void OnMetadataQueryStarted (LocalDisc mb_disc)
+        {
+            metadata_query_success = false;
+            metadata_query_start_time = DateTime.Now;
+            Log.InformationFormat ("Querying MusicBrainz for Disc Release ({0})", mb_disc.Id);
+
+            ThreadAssist.ProxyToMain (delegate {
+                EventHandler handler = MetadataQueryStarted;
+                if (handler != null) {
+                    handler (this, EventArgs.Empty);
+                }
+            });
+        }
+
+        private void OnMetadataQueryFinished (bool success)
+        {
+            metadata_query_success = success;
+            Log.InformationFormat ("Query finished (success: {0}, {1} seconds)",
+                success, (DateTime.Now - metadata_query_start_time).TotalSeconds);
+
+            ThreadAssist.ProxyToMain (delegate {
+                Reload ();
+
+                EventHandler handler = MetadataQueryFinished;
+                if (handler != null) {
+                    handler (this, EventArgs.Empty);
+                }
+            });
+        }
+
+        private void OnEnabledCountChanged ()
+        {
+            EventHandler handler = EnabledCountChanged;
+            if (handler != null) {
+                handler (this, EventArgs.Empty);
+            }
+        }
+
+        private string disc_title;
+        public override string Title {
+            get { return disc_title; }
+        }
+
+        private int enabled_count;
+        public int EnabledCount {
+            get { return enabled_count; }
+            internal set {
+                enabled_count = value;
+                OnEnabledCountChanged ();
+            }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdDuplicator.cs b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdDuplicator.cs
new file mode 100644
index 0000000..60db596
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdDuplicator.cs
@@ -0,0 +1,66 @@
+//
+// AudioCdDuplicator.cs
+//
+// Author:
+//   Aaron Bockover <abockover@novell.com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using Mono.Addins;
+
+using Banshee.Hardware;
+
+namespace Banshee.Discs.AudioCd
+{
+    public static class AudioCdDuplicator
+    {
+        private static bool duplicator_extension_queried = false;
+        private static TypeExtensionNode duplicator_extension_node = null;
+
+        public static bool Supported {
+            get {
+                if (duplicator_extension_queried) {
+                    return duplicator_extension_node != null;
+                }
+
+                duplicator_extension_queried = true;
+
+                foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (
+                    "/Banshee/Platform/DiscDuplicator")) {
+                    duplicator_extension_node = node;
+                    break;
+                }
+
+                return duplicator_extension_node != null;
+            }
+        }
+
+        public static void Duplicate (AudioCdDiscModel model)
+        {
+            if (Supported && model != null && model.Volume != null) {
+                ((IDiscDuplicator)duplicator_extension_node.CreateInstance ()).Duplicate (model.Volume);
+            }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdRipper.cs b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdRipper.cs
new file mode 100644
index 0000000..73718a6
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdRipper.cs
@@ -0,0 +1,288 @@
+//
+// AudioCdRipper.cs
+//
+// Author:
+//   Aaron Bockover <abockover@novell.com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+
+using Mono.Unix;
+using Mono.Addins;
+
+using Hyena;
+using Hyena.Jobs;
+
+using Banshee.Library;
+using Banshee.ServiceStack;
+using Banshee.Streaming;
+using Banshee.Collection;
+using Banshee.Collection.Database;
+using Banshee.MediaEngine;
+
+namespace Banshee.Discs.AudioCd
+{
+    public class AudioCdRipper : IDisposable
+    {
+        private static bool ripper_extension_queried = false;
+        private static TypeExtensionNode ripper_extension_node = null;
+
+        public static bool Supported {
+            get {
+                if (ripper_extension_queried) {
+                    return ripper_extension_node != null;
+                }
+
+                ripper_extension_queried = true;
+
+                foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (
+                    "/Banshee/MediaEngine/AudioCdRipper")) {
+                    ripper_extension_node = node;
+                    break;
+                }
+
+                return ripper_extension_node != null;
+            }
+        }
+
+        public event EventHandler Finished;
+
+        // State that does real work
+        private IAudioCdRipper ripper;
+        private AudioCdSource source;
+        private UserJob user_job;
+
+        // State to process the rip operation
+        private Queue<AudioCdTrackInfo> queue = new Queue<AudioCdTrackInfo> ();
+
+        private TimeSpan ripped_duration;
+        private TimeSpan total_duration;
+        private int track_index;
+
+        // State to compute/display the rip speed (i.e. 24x)
+        private TimeSpan last_speed_poll_duration;
+        private DateTime last_speed_poll_time;
+        private double last_speed_poll_factor;
+        private string status;
+
+        public AudioCdRipper (AudioCdSource source)
+        {
+            if (ripper_extension_node != null) {
+                ripper = (IAudioCdRipper)ripper_extension_node.CreateInstance ();
+                ripper.TrackFinished += OnTrackFinished;
+                ripper.Progress += OnProgress;
+                ripper.Error += OnError;
+            } else {
+                throw new ApplicationException ("No AudioCdRipper extension is installed");
+            }
+
+            this.source = source;
+        }
+
+        public void Start ()
+        {
+            ResetState ();
+
+            foreach (AudioCdTrackInfo track in source.Model) {
+                if (track.RipEnabled) {
+                    total_duration += track.Duration;
+                    queue.Enqueue (track);
+                }
+            }
+
+            if (queue.Count == 0) {
+                return;
+            }
+
+            source.LockAllTracks ();
+
+            user_job = new UserJob (Catalog.GetString ("Importing Audio CD"),
+                Catalog.GetString ("Initializing Drive"), "media-import-audio-cd");
+            user_job.CancelMessage = String.Format (Catalog.GetString (
+                "<i>{0}</i> is still being imported into the music library. Would you like to stop it?"
+                ), GLib.Markup.EscapeText (source.Model.Title));
+            user_job.SetResources (Resource.Cpu);
+            user_job.PriorityHints = PriorityHints.SpeedSensitive | PriorityHints.DataLossIfStopped;
+            user_job.CanCancel = true;
+            user_job.CancelRequested += OnCancelRequested;
+            user_job.Finished += OnFinished;
+            user_job.Register ();
+
+            if (source != null && source.Model != null) {
+                if (!source.Model.LockDoor ()) {
+                    Hyena.Log.Warning ("Could not lock CD-ROM door", false);
+                }
+            }
+
+            ripper.Begin (source.Model.Volume.DeviceNode, AudioCdService.ErrorCorrection.Get ());
+
+            RipNextTrack ();
+        }
+
+        public void Dispose ()
+        {
+            ResetState ();
+
+            if (source != null && source.Model != null) {
+                source.Model.UnlockDoor ();
+            }
+
+            if (ripper != null) {
+                ripper.Finish ();
+                ripper = null;
+            }
+
+            if (user_job != null) {
+                user_job.Finish ();
+                user_job = null;
+            }
+        }
+
+        private void ResetState ()
+        {
+            track_index = 0;
+            ripped_duration = TimeSpan.Zero;
+            total_duration = TimeSpan.Zero;
+            last_speed_poll_duration = TimeSpan.Zero;
+            last_speed_poll_time = DateTime.MinValue;
+            last_speed_poll_factor = 0;
+            status = null;
+            queue.Clear ();
+        }
+
+        private void RipNextTrack ()
+        {
+            if (queue.Count == 0) {
+                OnFinished ();
+                Dispose ();
+                return;
+            }
+
+            AudioCdTrackInfo track = queue.Dequeue ();
+
+            user_job.Title = String.Format (Catalog.GetString ("Importing {0} of {1}"),
+                ++track_index, source.Model.EnabledCount);
+            status = String.Format("{0} - {1}", track.ArtistName, track.TrackTitle);
+            user_job.Status = status;
+
+            SafeUri uri = new SafeUri (MusicLibrarySource.MusicFileNamePattern.BuildFull (
+                ServiceManager.SourceManager.MusicLibrary.BaseDirectory, track, null));
+            bool tagging_supported;
+            ripper.RipTrack (track.IndexOnDisc, track, uri, out tagging_supported);
+        }
+
+#region Ripper Event Handlers
+
+        private void OnTrackFinished (object o, AudioCdRipperTrackFinishedArgs args)
+        {
+            if (user_job == null || ripper == null) {
+                return;
+            }
+
+            AudioCdTrackInfo track = (AudioCdTrackInfo)args.Track;
+
+            ripped_duration += track.Duration;
+            track.PrimarySource = ServiceManager.SourceManager.MusicLibrary;
+            track.Uri = args.Uri;
+
+            track.FileSize = Banshee.IO.File.GetSize (track.Uri);
+            track.FileModifiedStamp = Banshee.IO.File.GetModifiedTime (track.Uri);
+            track.LastSyncedStamp = DateTime.Now;
+
+            using (var file = StreamTagger.ProcessUri (track.Uri)) {
+                StreamTagger.TrackInfoMerge (track, file, true);
+            }
+
+            track.Save ();
+
+            source.UnlockTrack (track);
+            RipNextTrack ();
+        }
+
+        private void OnProgress (object o, AudioCdRipperProgressArgs args)
+        {
+            if (user_job == null) {
+                return;
+            }
+
+            TimeSpan total_ripped_duration = ripped_duration + args.EncodedTime;
+            user_job.Progress = total_ripped_duration.TotalMilliseconds / total_duration.TotalMilliseconds;
+
+            TimeSpan poll_diff = DateTime.Now - last_speed_poll_time;
+            double factor = 0;
+
+            if (poll_diff.TotalMilliseconds >= 1000) {
+                factor = ((total_ripped_duration - last_speed_poll_duration).TotalMilliseconds
+                    * (poll_diff.TotalMilliseconds / 1000.0)) / 1000.0;
+
+                last_speed_poll_duration = total_ripped_duration;
+                last_speed_poll_time = DateTime.Now;
+                last_speed_poll_factor = factor > 1 ? factor : 0;
+            }
+
+            // Make sure the speed factor is between 1 and 200 to allow it to ramp and settle
+            user_job.Status = last_speed_poll_factor > 1 && last_speed_poll_factor <= 200
+                ? String.Format ("{0} ({1:0.0}x)", status, last_speed_poll_factor)
+                : status;
+        }
+
+        private void OnError (object o, AudioCdRipperErrorArgs args)
+        {
+            Dispose ();
+            Hyena.Log.Error (Catalog.GetString ("Cannot Import CD"), args.Message, true);
+        }
+
+#endregion
+
+        private void OnFinished ()
+        {
+            EventHandler handler = Finished;
+            if (handler != null) {
+                handler (this, EventArgs.Empty);
+            }
+        }
+
+#region User Job Event Handlers
+
+        private void OnCancelRequested (object o, EventArgs args)
+        {
+            Dispose ();
+        }
+
+        private void OnFinished (object o, EventArgs args)
+        {
+            if (user_job != null) {
+                user_job.CancelRequested -= OnCancelRequested;
+                user_job.Finished -= OnFinished;
+                user_job = null;
+            }
+
+            source.UnlockAllTracks ();
+        }
+
+#endregion
+
+    }
+}
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdService.cs b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdService.cs
new file mode 100644
index 0000000..49e88a6
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdService.cs
@@ -0,0 +1,252 @@
+//
+// AudioCdService.cs
+//
+// Author:
+//   Aaron Bockover <abockover@novell.com>
+//   Alex Launi <alex.launi@canonical.com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using Mono.Unix;
+
+using Hyena;
+
+using Banshee.ServiceStack;
+using Banshee.Configuration;
+using Banshee.Preferences;
+using Banshee.Hardware;
+using Banshee.Gui;
+
+namespace Banshee.Discs.AudioCd
+{
+    public class AudioCdService : DiscService, IService
+    {
+        private SourcePage pref_page;
+        private Section pref_section;
+        private uint global_interface_id;
+
+        public AudioCdService ()
+        {
+        }
+
+        public override void Initialize ()
+        {
+            lock (this) {
+                InstallPreferences ();
+                base.Initialize ();
+                SetupActions ();
+            }
+        }
+
+        public override void Dispose ()
+        {
+            lock (this) {
+                UninstallPreferences ();
+                base.Dispose ();
+                DisposeActions ();
+            }
+        }
+
+#region DeviceCommand Handling
+
+        protected override bool DeviceCommandMatchesSource (DiscSource source, DeviceCommand command)
+        {
+            AudioCdSource cdSource = source as AudioCdSource;
+
+            if (cdSource != null && command.DeviceId.StartsWith ("cdda:")) {
+                try {
+                    Uri uri = new Uri (command.DeviceId);
+                    string match_device_node = String.Format ("{0}{1}", uri.Host,
+                        uri.AbsolutePath).TrimEnd ('/', '\\');
+                    string device_node = source.DiscModel.Volume.DeviceNode;
+                    return device_node.EndsWith (match_device_node);
+                } catch {
+                }
+            }
+
+            return false;
+        }
+
+#endregion
+
+#region Preferences
+
+        private void InstallPreferences ()
+        {
+            PreferenceService service = ServiceManager.Get<PreferenceService> ();
+            if (service == null) {
+                return;
+            }
+
+            service.InstallWidgetAdapters += OnPreferencesServiceInstallWidgetAdapters;
+
+            pref_page = new Banshee.Preferences.SourcePage ("audio-cd", Catalog.GetString ("Audio CDs"), "media-cdrom", 400);
+
+            pref_section = pref_page.Add (new Section ("audio-cd", Catalog.GetString ("Audio CD Importing"), 20));
+            pref_section.ShowLabel = false;
+
+            pref_section.Add (new VoidPreference ("import-profile",  Catalog.GetString ("_Import format")));
+            pref_section.Add (new VoidPreference ("import-profile-desc"));
+
+            pref_section.Add (new SchemaPreference<bool> (AutoRip,
+                Catalog.GetString ("_Automatically import audio CDs when inserted"),
+                Catalog.GetString ("When an audio CD is inserted, automatically begin importing it " +
+                    "if metadata can be found and it is not already in the library.")));
+
+            pref_section.Add (new SchemaPreference<bool> (EjectAfterRipped,
+                Catalog.GetString ("_Eject when done importing"),
+                Catalog.GetString ("When an audio CD has been imported, automatically eject it.")));
+
+            pref_section.Add (new SchemaPreference<bool> (ErrorCorrection,
+                Catalog.GetString ("Use error correction when importing"),
+                Catalog.GetString ("Error correction tries to work around problem areas on a disc, such " +
+                    "as surface scratches, but will slow down importing substantially.")));
+        }
+
+        private void UninstallPreferences ()
+        {
+            PreferenceService service = ServiceManager.Get<PreferenceService> ();
+            if (service == null || pref_page == null) {
+                return;
+            }
+
+            service.InstallWidgetAdapters -= OnPreferencesServiceInstallWidgetAdapters;
+
+            pref_page.Dispose ();
+            pref_page = null;
+            pref_section = null;
+        }
+
+        private void OnPreferencesServiceInstallWidgetAdapters (object o, EventArgs args)
+        {
+            if (pref_section == null) {
+                return;
+            }
+
+            Gtk.HBox description_box = new Gtk.HBox ();
+            Banshee.MediaProfiles.Gui.ProfileComboBoxConfigurable chooser
+                = new Banshee.MediaProfiles.Gui.ProfileComboBoxConfigurable (ServiceManager.MediaProfileManager,
+                    "cd-importing", description_box);
+
+            pref_section["import-profile"].DisplayWidget = chooser;
+            pref_section["import-profile"].MnemonicWidget = chooser.Combo;
+            pref_section["import-profile-desc"].DisplayWidget = description_box;
+        }
+
+        public static readonly SchemaEntry<bool> ErrorCorrection = new SchemaEntry<bool> (
+            "import", "audio_cd_error_correction",
+            false,
+            "Enable error correction",
+            "When importing an audio CD, enable error correction (paranoia mode)"
+        );
+
+        public static readonly SchemaEntry<bool> AutoRip = new SchemaEntry<bool> (
+            "import", "auto_rip_cds",
+            false,
+            "Enable audio CD auto ripping",
+            "When an audio CD is inserted, automatically begin ripping it."
+        );
+
+        public static readonly SchemaEntry<bool> EjectAfterRipped = new SchemaEntry<bool> (
+            "import", "eject_after_ripped",
+            false,
+            "Eject audio CD after ripped",
+            "After an audio CD has been ripped, automatically eject it."
+        );
+
+#endregion
+
+#region UI Actions
+
+        private void SetupActions ()
+        {
+            InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
+            if (uia_service == null) {
+                return;
+            }
+
+            uia_service.GlobalActions.AddImportant (new Gtk.ActionEntry [] {
+                new Gtk.ActionEntry ("RipDiscAction", null,
+                    Catalog.GetString ("Import CD"), null,
+                    Catalog.GetString ("Import this audio CD to the library"),
+                    OnImportDisc)
+            });
+
+            uia_service.GlobalActions.AddImportant (
+                new Gtk.ActionEntry ("DuplicateDiscAction", null,
+                    Catalog.GetString ("Duplicate CD"), null,
+                    Catalog.GetString ("Duplicate this audio CD"),
+                    OnDuplicateDisc)
+            );
+
+            global_interface_id = uia_service.UIManager.AddUiFromResource ("GlobalUI.xml");
+        }
+
+        private void DisposeActions ()
+        {
+            InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
+            if (uia_service == null) {
+                return;
+            }
+
+            uia_service.GlobalActions.Remove ("RipDiscAction");
+            uia_service.GlobalActions.Remove ("DuplicateDiscAction");
+            uia_service.UIManager.RemoveUi (global_interface_id);
+        }
+
+        private void OnImportDisc (object o, EventArgs args)
+        {
+            ImportOrDuplicateDisc (true);
+        }
+
+        private void OnDuplicateDisc (object o, EventArgs args)
+        {
+            ImportOrDuplicateDisc (false);
+        }
+
+        private void ImportOrDuplicateDisc (bool import)
+        {
+            InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
+            if (uia_service == null) {
+                return;
+            }
+
+            AudioCdSource source = uia_service.SourceActions.ActionSource as AudioCdSource;
+            if (source != null) {
+                if (import) {
+                    source.ImportDisc ();
+                } else {
+                    source.DuplicateDisc ();
+                }
+            }
+        }
+
+#endregion
+
+        string IService.ServiceName {
+            get { return "AudioCdService"; }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdSource.cs b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdSource.cs
new file mode 100644
index 0000000..f865323
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdSource.cs
@@ -0,0 +1,359 @@
+//
+// AudioCdSource.cs
+//
+// Author:
+//   Aaron Bockover <abockover@novell.com>
+//   Alex Launi <alex.launi@canonical.com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using Mono.Unix;
+
+using Hyena;
+using Banshee.Base;
+using Banshee.ServiceStack;
+using Banshee.Sources;
+using Banshee.Library;
+using Banshee.Collection;
+using Banshee.Collection.Database;
+
+using Gtk;
+using Banshee.Gui;
+
+namespace Banshee.Discs.AudioCd
+{
+    public class AudioCdSource : DiscSource, IImportSource,
+        IDurationAggregator, IFileSizeAggregator
+    {
+        private SourceMessage query_message;
+
+        public AudioCdSource (AudioCdService service, AudioCdDiscModel discModel)
+            : base ((DiscService) service, (DiscModel) discModel, Catalog.GetString ("Audio CD"), discModel.Title, 400)
+        {
+            TypeUniqueId = "";
+            Properties.SetString ("TrackView.ColumnControllerXml", String.Format (@"
+                <column-controller>
+                  <column>
+                    <renderer type=""Hyena.Data.Gui.ColumnCellCheckBox"" property=""RipEnabled""/>
+                  </column>
+                  <add-all-defaults />
+                </column-controller>
+            "));
+
+            Model.MetadataQueryStarted += OnMetadataQueryStarted;
+            Model.MetadataQueryFinished += OnMetadataQueryFinished;
+            Model.EnabledCountChanged += OnEnabledCountChanged;
+            Model.LoadModelFromDisc ();
+
+            SetupGui ();
+        }
+
+        public TimeSpan Duration {
+            get { return Model.Duration; }
+        }
+
+        public long FileSize {
+            get { return Model.FileSize; }
+        }
+
+        public new AudioCdDiscModel Model {
+            get { return (AudioCdDiscModel) base.DiscModel; }
+            set { base.DiscModel = value; }
+        }
+
+        public override void Dispose ()
+        {
+            StopPlayingDisc ();
+            ClearMessages ();
+            Model.MetadataQueryStarted -= OnMetadataQueryStarted;
+            Model.MetadataQueryFinished -= OnMetadataQueryFinished;
+            Model.EnabledCountChanged -= OnEnabledCountChanged;
+            Service = null;
+            Model = null;
+        }
+
+        private void OnEnabledCountChanged (object o, EventArgs args)
+        {
+            UpdateActions ();
+        }
+
+        private void OnMetadataQueryStarted (object o, EventArgs args)
+        {
+            if (query_message != null) {
+                DestroyQueryMessage ();
+            }
+
+            query_message = new SourceMessage (this);
+            query_message.FreezeNotify ();
+            query_message.CanClose = false;
+            query_message.IsSpinning = true;
+            query_message.Text = Catalog.GetString ("Searching for track information...");
+            query_message.ThawNotify ();
+
+            PushMessage (query_message);
+        }
+
+        private void OnMetadataQueryFinished (object o, EventArgs args)
+        {
+            if (Model.Title != Name) {
+                Name = Model.Title;
+                OnUpdated ();
+            }
+
+            if (Model.MetadataQuerySuccess) {
+                DestroyQueryMessage ();
+                if (DiscIsPlaying) {
+                    ServiceManager.PlayerEngine.TrackInfoUpdated ();
+                }
+
+                if (AudioCdService.AutoRip.Get ()) {
+                    BeginAutoRip ();
+                }
+
+                return;
+            }
+
+            if (query_message == null) {
+                return;
+            }
+
+            query_message.FreezeNotify ();
+            query_message.IsSpinning = false;
+            query_message.SetIconName ("dialog-error");
+            query_message.Text = Catalog.GetString ("Could not fetch track information");
+            query_message.CanClose = true;
+            query_message.ThawNotify ();
+        }
+
+        private void DestroyQueryMessage ()
+        {
+            if (query_message != null) {
+                RemoveMessage (query_message);
+                query_message = null;
+            }
+        }
+
+        private void BeginAutoRip ()
+        {
+            // Make sure the album isn't already in the Library
+            TrackInfo track = Model[0];
+            int count = ServiceManager.DbConnection.Query<int> (
+                @"SELECT Count(*) FROM CoreTracks, CoreArtists, CoreAlbums WHERE
+                    CoreTracks.PrimarySourceID = ? AND
+                    CoreTracks.ArtistID = CoreArtists.ArtistID AND
+                    CoreTracks.AlbumID = CoreAlbums.AlbumID AND
+                    CoreArtists.Name = ? AND CoreAlbums.Title = ? AND (CoreTracks.Disc = ? OR CoreTracks.Disc = 0)",
+                    ServiceManager.SourceManager.MusicLibrary.DbId,
+                    track.ArtistName, track.AlbumTitle, track.DiscNumber
+            );
+
+            if (count > 0) {
+                SetStatus (Catalog.GetString ("Automatic import off since this album is already in the Music Library."), true, false, null);
+                return;
+            }
+
+            Log.DebugFormat ("Beginning auto rip of {0}", Name);
+            ImportDisc ();
+        }
+
+        internal void ImportDisc ()
+        {
+            AudioCdRipper ripper = null;
+
+            try {
+                if (AudioCdRipper.Supported) {
+                    ripper = new AudioCdRipper (this);
+                    ripper.Finished += OnRipperFinished;
+                    ripper.Start ();
+                }
+            } catch (Exception e) {
+                if (ripper != null) {
+                    ripper.Dispose ();
+                }
+
+                Log.Error (Catalog.GetString ("Could not import CD"), e.Message, true);
+                Log.Exception (e);
+            }
+        }
+
+        private void OnRipperFinished (object o, EventArgs args)
+        {
+            if (AudioCdService.EjectAfterRipped.Get ()) {
+                Unmap ();
+            }
+        }
+
+        internal void DuplicateDisc ()
+        {
+            try {
+                AudioCdDuplicator.Duplicate (Model);
+            } catch (Exception e) {
+                Hyena.Log.Error (Catalog.GetString ("Could not duplicate audio CD"), e.Message, true);
+                Hyena.Log.Exception (e);
+            }
+        }
+
+        internal void LockAllTracks ()
+        {
+            StopPlayingDisc ();
+
+            foreach (AudioCdTrackInfo track in Model) {
+                track.CanPlay = false;
+            }
+
+            Model.NotifyUpdated ();
+        }
+
+        internal void UnlockAllTracks ()
+        {
+            foreach (AudioCdTrackInfo track in Model) {
+                track.CanPlay = true;
+            }
+
+            Model.NotifyUpdated ();
+        }
+
+        internal void UnlockTrack (AudioCdTrackInfo track)
+        {
+            track.CanPlay = true;
+            Model.NotifyUpdated ();
+        }
+
+#region DiscSource
+
+        public override bool CanRepeat {
+            get { return true;}
+        }
+
+        public override bool CanShuffle {
+            get { return true; }
+        }
+
+#endregion
+
+#region Source Overrides
+
+        public override int Count {
+            get { return Model.Count; }
+        }
+
+        public override string PreferencesPageId {
+            get { return "audio-cd"; }
+        }
+
+        public override bool HasEditableTrackProperties {
+            get { return true; }
+        }
+
+        public override bool HasViewableTrackProperties {
+            get { return true; }
+        }
+
+#endregion
+
+#region GUI/ThickClient
+
+        private bool actions_loaded = false;
+
+        private void SetupGui ()
+        {
+            Properties.SetStringList ("Icon.Name", "media-cdrom", "gnome-dev-cdrom-audio", "source-cd-audio");
+            Properties.SetString ("SourcePreferencesActionLabel", Catalog.GetString ("Audio CD Preferences"));
+            Properties.SetString ("UnmapSourceActionLabel", Catalog.GetString ("Eject Disc"));
+            Properties.SetString ("UnmapSourceActionIconName", "media-eject");
+            Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
+            Properties.SetString ("GtkActionPath", "/AudioCdContextMenu");
+
+            actions_loaded = true;
+
+            UpdateActions ();
+        }
+
+        private void UpdateActions ()
+        {
+            InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
+            if (uia_service == null) {
+                return;
+            }
+
+            Gtk.Action rip_action = uia_service.GlobalActions["RipDiscAction"];
+            if (rip_action != null) {
+                string title = Model.Title;
+                int max_title_length = 20;
+                title = title.Length > max_title_length
+                    ? String.Format ("{0}\u2026", title.Substring (0, max_title_length).Trim ())
+                    : title;
+                rip_action.Label = String.Format (Catalog.GetString ("Import \u201f{0}\u201d"), title);
+                rip_action.ShortLabel = Catalog.GetString ("Import CD");
+                rip_action.IconName = "media-import-audio-cd";
+                rip_action.Sensitive = AudioCdRipper.Supported && Model.EnabledCount > 0;
+            }
+
+            Gtk.Action duplicate_action = uia_service.GlobalActions["DuplicateDiscAction"];
+            if (duplicate_action != null) {
+                duplicate_action.IconName = "media-cdrom";
+                duplicate_action.Visible = AudioCdDuplicator.Supported;
+            }
+        }
+
+        protected override void OnUpdated ()
+        {
+            if (actions_loaded) {
+                UpdateActions ();
+            }
+
+            base.OnUpdated ();
+        }
+
+#endregion
+
+#region IImportSource
+
+        void IImportSource.Import ()
+        {
+            ImportDisc ();
+        }
+
+        string [] IImportSource.IconNames {
+            get { return Properties.GetStringList ("Icon.Name"); }
+        }
+
+        bool IImportSource.CanImport {
+            get { return true; }
+        }
+
+        int IImportSource.SortOrder {
+            get { return -10; }
+        }
+
+        string IImportSource.ImportLabel {
+            get { return null; }
+        }
+
+#endregion
+
+    }
+}
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdTrackInfo.cs b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdTrackInfo.cs
new file mode 100644
index 0000000..f359cf1
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.AudioCd/AudioCdTrackInfo.cs
@@ -0,0 +1,109 @@
+//
+// AudioCdTrackInfo.cs
+//
+// Author:
+//   Aaron Bockover <abockover@novell.com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+using Hyena;
+
+using Banshee.Collection;
+using Banshee.Collection.Database;
+
+namespace Banshee.Discs.AudioCd
+{
+    public class AudioCdTrackInfo : DiscTrackInfo
+    {
+        public AudioCdTrackInfo (AudioCdDiscModel model, string deviceNode, int index)
+            : base (model)
+        {
+            this.index_on_disc = index;
+
+            Uri = new SafeUri (String.Format ("cdda://{0}#{1}", index_on_disc + 1, deviceNode));
+        }
+
+        public override bool TrackEqual (TrackInfo track)
+        {
+            AudioCdTrackInfo cd_track = track as AudioCdTrackInfo;
+            return cd_track == null ? false : (cd_track.Model == Model && cd_track.IndexOnDisc == IndexOnDisc);
+        }
+
+        public new AudioCdDiscModel Model {
+            get {
+                return (AudioCdDiscModel) base.Model;
+            }
+        }
+
+        private int index_on_disc;
+        public int IndexOnDisc {
+            get { return index_on_disc; }
+        }
+
+        private DatabaseAlbumInfo album_info;
+        public new DatabaseAlbumInfo Album {
+            get { return album_info; }
+            set { album_info = value; }
+        }
+
+        public DatabaseArtistInfo artist_info;
+        public new DatabaseArtistInfo Artist {
+            get { return artist_info; }
+            set { artist_info = value; }
+        }
+
+        public override string AlbumMusicBrainzId {
+            get { return Album == null ? null : Album.MusicBrainzId; }
+        }
+
+        public override string ArtistMusicBrainzId {
+            get { return Artist == null ? null : Artist.MusicBrainzId; }
+        }
+
+        public override DateTime ReleaseDate {
+            get { return Album == null ? base.ReleaseDate : Album.ReleaseDate; }
+            set {
+                if (Album == null) {
+                    base.ReleaseDate = value;
+                } else {
+                    Album.ReleaseDate = value;
+                }
+            }
+        }
+
+        private bool rip_enabled = true;
+        public bool RipEnabled {
+            get { return rip_enabled; }
+            set {
+                if (rip_enabled == value) {
+                    return;
+                }
+
+                rip_enabled = value;
+                Model.EnabledCount += rip_enabled ? 1 : -1;
+            }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdModel.cs b/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdModel.cs
new file mode 100644
index 0000000..b51b6d7
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdModel.cs
@@ -0,0 +1,48 @@
+//
+// DvdModel.cs
+//
+// Author:
+//   Alex Launi <alex.launi@gmail.com>
+//
+// Copyright 2010 Alex Launi
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+using Mono.Unix;
+
+using Banshee.Collection;
+using Banshee.Hardware;
+
+namespace Banshee.Discs.Dvd
+{
+    public class DvdModel : DiscModel
+    {
+        public DvdModel (IDiscVolume volume) : base (volume)
+        {
+        }
+
+        public override void LoadModelFromDisc ()
+        {
+            Add (new DvdTrackInfo (this, Volume.DeviceNode));
+        }
+    }
+}
+
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdService.cs b/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdService.cs
new file mode 100644
index 0000000..9ffcf3d
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdService.cs
@@ -0,0 +1,106 @@
+//
+// DvdService.cs
+//
+// Author:
+//   Alex Launi <alex.launi@canonical.com>
+//
+// Copyright 2010 Alex Launi
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+using Banshee.Hardware;
+using Banshee.Gui;
+using Banshee.ServiceStack;
+using Mono.Unix;
+
+namespace Banshee.Discs.Dvd
+{
+    public class DvdService : DiscService, IService
+    {
+        private uint global_interface_id;
+        
+        public DvdService ()
+        {
+        }
+
+        // FIXME Implement DVD device command matching
+        protected override bool DeviceCommandMatchesSource (DiscSource source, DeviceCommand command)
+        {
+            return false;
+        }
+
+        public override void Initialize()
+        {
+            lock (this) {
+                //InstallPreferences ();
+                base.Initialize ();
+                SetupActions ();
+            }
+
+        }
+
+        public override void Dispose ()
+        {
+            lock (this) {
+                //UninstallPreferences ();
+                base.Dispose ();
+                DisposeActions ();
+            }
+        }
+
+        #region UI Actions
+
+        private void SetupActions ()
+        {
+            InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
+            if (uia_service == null) {
+                return;
+            }
+
+            uia_service.GlobalActions.AddImportant (new Gtk.ActionEntry [] {
+                new Gtk.ActionEntry ("GoToMenuAction", null,
+                    Catalog.GetString ("Go to Menu"), null,
+                    Catalog.GetString ("Naviguate to menu"),
+                    (object o, EventArgs args) => { ServiceManager.PlayerEngine.NavigateToMenu (); })
+            });
+
+            global_interface_id = uia_service.UIManager.AddUiFromResource ("GlobalUIDvd.xml");
+        }
+
+        private void DisposeActions ()
+        {
+            InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
+            if (uia_service == null) {
+                return;
+            }
+
+            uia_service.GlobalActions.Remove ("GoToMenuAction");
+            uia_service.UIManager.RemoveUi (global_interface_id);
+        }
+
+        #endregion
+
+        string IService.ServiceName {
+            get { return "DvdService"; }
+        }
+    }
+}
+
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdSource.cs b/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdSource.cs
new file mode 100644
index 0000000..bd2b662
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdSource.cs
@@ -0,0 +1,117 @@
+//
+// DvdSource.cs
+//
+// Author:
+//   Alex Launi <alex.launi@canonical.com>
+//
+// Copyright 2010 Alex Launi
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+using Mono.Unix;
+using Banshee.PlaybackController;
+using Banshee.ServiceStack;
+
+namespace Banshee.Discs.Dvd
+{
+    public class DvdSource : DiscSource, IBasicPlaybackController
+    {
+        public DvdSource (DiscService service, DvdModel model)
+            : base (service, (DiscModel) model, Catalog.GetString ("Dvd"), model.Title, 400)
+        {
+            TypeUniqueId = "";
+
+            SetupGui ();
+            model.LoadModelFromDisc ();
+        }
+
+#region DiscSource
+
+        public override bool CanRepeat {
+            get { return false;}
+        }
+
+        public override bool CanShuffle {
+            get { return false; }
+        }
+
+#endregion
+
+#region GUI/ThickClient
+
+        private bool actions_loaded = false;
+
+        private void SetupGui ()
+        {
+            Properties.SetStringList ("Icon.Name", "media-dvd", "gnome-dev-dvd");
+            Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
+            Properties.SetString ("GtkActionPath", "/DvdContextMenu");
+            actions_loaded = true;
+
+            UpdateActions ();
+        }
+
+        private void UpdateActions ()
+        {
+            // TODO Update dvd actions
+        }
+
+        protected override void OnUpdated ()
+        {
+            if (actions_loaded) {
+                UpdateActions ();
+            }
+
+            base.OnUpdated ();
+        }
+#endregion
+
+#region IBasicPlaybackController implementation
+
+        public bool First ()
+        {
+            // TODO expected behaviour ?
+            // Go to menu ?
+            ServiceManager.PlayerEngine.NavigateToMenu ();
+            return true;
+        }
+
+        public bool Next (bool restart, bool changeImmediately)
+        {
+            if (!ServiceManager.PlayerEngine.IsMenu) {
+                ServiceManager.PlayerEngine.GoToNextChapter ();
+            }
+            // Do nothing if not in menu
+            return true;
+        }
+
+        public bool Previous (bool restart)
+        {
+            if (!ServiceManager.PlayerEngine.IsMenu) {
+                ServiceManager.PlayerEngine.GoToPreviousChapter ();
+            }
+            // Do nothing if not in menu
+            return true;
+        }
+#endregion
+    }
+}
+
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdTrackInfo.cs b/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdTrackInfo.cs
new file mode 100644
index 0000000..8f34863
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.Dvd/DvdTrackInfo.cs
@@ -0,0 +1,49 @@
+//
+// DvdTrackInfo.cs
+//
+// Author:
+//   Alex Launi <alex.launi@gmail.com>
+//
+// Copyright 2010 Alex Launi
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+using Hyena;
+
+using Banshee.Collection;
+using Banshee.Collection.Database;
+
+namespace Banshee.Discs.Dvd
+{
+    public class DvdTrackInfo : DiscTrackInfo
+    {
+        public DvdTrackInfo (DiscModel model, string deviceNode)
+            : base (model)
+        {
+            Uri = new SafeUri (String.Format ("dvd://{0}", deviceNode));
+        }
+
+        public override TrackMediaAttributes MediaAttributes {
+            get { return TrackMediaAttributes.VideoStream; }
+        }
+    }
+}
+
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.addin.xml b/src/Extensions/Banshee.Discs/Banshee.Discs.addin.xml
new file mode 100644
index 0000000..560ca49
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.addin.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Addin 
+    id="Banshee.Discs"
+    version="1.0"
+    compatVersion="1.0"
+    copyright="© 2008 Novell Inc. Licensed under the MIT X11 license."
+    name="DVD and Audio CD Support"
+    category="Core"
+    description="Watch DVDs; listen to and rip Audio CDs."
+    author="Aaron Bockover"
+    url="http://banshee.fm/"
+    defaultEnabled="true">
+
+  <Dependencies>
+    <Addin id="Banshee.Services" version="1.0"/>
+  </Dependencies>
+
+  <Extension path="/Banshee/ServiceManager/Service">
+    <Service class="Banshee.Discs.AudioCd.AudioCdService"/>
+  </Extension>
+
+</Addin>
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs.csproj b/src/Extensions/Banshee.Discs/Banshee.Discs.csproj
new file mode 100644
index 0000000..b4c5d91
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs.csproj
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <ProjectGuid>{F38B53BA-8F85-4DC6-9B94-029C1CF96F24}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <UseParentDirectoryAsNamespace>true</UseParentDirectoryAsNamespace>
+    <AssemblyName>Banshee.Discs</AssemblyName>
+    <SchemaVersion>2.0</SchemaVersion>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <Optimize>true</Optimize>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ReleaseVersion>1.3</ReleaseVersion>
+    <RootNamespace>Banshee.Discs</RootNamespace>
+    <AssemblyOriginatorKeyFile>.</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\bin</OutputPath>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Windows|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\bin</OutputPath>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Core\Banshee.Core\Banshee.Core.csproj">
+      <Project>{2ADB831A-A050-47D0-B6B9-9C19D60233BB}</Project>
+      <Name>Banshee.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Core\Banshee.Services\Banshee.Services.csproj">
+      <Project>{B28354F0-BA87-44E8-989F-B864A3C7C09F}</Project>
+      <Name>Banshee.Services</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Libraries\MusicBrainz\MusicBrainz.csproj">
+      <Project>{C5DD02DE-4F0E-4DC0-ABC7-035A8217CD50}</Project>
+      <Name>MusicBrainz</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Core\Banshee.ThickClient\Banshee.ThickClient.csproj">
+      <Project>{AC839523-7BDF-4AB6-8115-E17921B96EC6}</Project>
+      <Name>Banshee.ThickClient</Name>
+    </ProjectReference>
+    <Reference Include="atk-sharp">
+      <SpecificVersion>False</SpecificVersion>
+      <Package>gtk-sharp-2.0</Package>
+    </Reference>
+    <Reference Include="glib-sharp">
+      <SpecificVersion>False</SpecificVersion>
+      <Package>glib-sharp-2.0</Package>
+    </Reference>
+    <Reference Include="taglib-sharp">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\bin\taglib-sharp.dll</HintPath>
+      <Package>taglib-sharp</Package>
+    </Reference>
+    <Reference Include="Mono.Posix">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\bin\Mono.Posix.dll</HintPath>
+    </Reference>
+    <ProjectReference Include="..\..\Hyena\Hyena\Hyena.csproj">
+      <Project>{95374549-9553-4C1E-9D89-667755F90E12}</Project>
+      <Name>Hyena</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Hyena\Hyena.Gui\Hyena.Gui.csproj">
+      <Project>{C856EFD8-E812-4E61-8B76-E3583D94C233}</Project>
+      <Name>Hyena.Gui</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="gtk-sharp">
+      <SpecificVersion>False</SpecificVersion>
+      <Package>gtk-sharp-2.0</Package>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Resources\ActiveSourceUI.xml">
+      <LogicalName>ActiveSourceUI.xml</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\GlobalUI.xml">
+      <LogicalName>GlobalUI.xml</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Banshee.Discs.addin.xml">
+      <LogicalName>Banshee.Discs.addin.xml</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\GlobalUIDvd.xml">
+      <LogicalName>GlobalUIDvd.xml</LogicalName>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Banshee.Discs.AudioCd\AudioCdDiscModel.cs" />
+    <Compile Include="Banshee.Discs.AudioCd\AudioCdDuplicator.cs" />
+    <Compile Include="Banshee.Discs.AudioCd\AudioCdRipper.cs" />
+    <Compile Include="Banshee.Discs.AudioCd\AudioCdService.cs" />
+    <Compile Include="Banshee.Discs.AudioCd\AudioCdSource.cs" />
+    <Compile Include="Banshee.Discs.AudioCd\AudioCdTrackInfo.cs" />
+    <Compile Include="Banshee.Discs.Dvd\DvdSource.cs" />
+    <Compile Include="Banshee.Discs\DiscService.cs" />
+    <Compile Include="Banshee.Discs\DiscSource.cs" />
+    <Compile Include="Banshee.Discs.Dvd\DvdService.cs" />
+    <Compile Include="Banshee.Discs.Dvd\DvdModel.cs" />
+    <Compile Include="Banshee.Discs\DiscModel.cs" />
+    <Compile Include="Banshee.Discs.Dvd\DvdTrackInfo.cs" />
+    <Compile Include="Banshee.Discs\DiscTrackInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ProjectExtensions>
+    <MonoDevelop>
+      <Properties>
+        <MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="true" RelativeMakefileName="./Makefile.am">
+          <BuildFilesVar Sync="true" Name="SOURCES" />
+          <DeployFilesVar />
+          <ResourcesVar Sync="true" Name="RESOURCES" />
+          <OthersVar />
+          <GacRefVar />
+          <AsmRefVar />
+          <ProjectRefVar />
+        </MonoDevelop.Autotools.MakefileInfo>
+      </Properties>
+    </MonoDevelop>
+  </ProjectExtensions>
+  <ItemGroup>
+    <Folder Include="Banshee.Discs\" />
+    <Folder Include="Banshee.Discs.Dvd\" />
+  </ItemGroup>
+</Project>
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs/DiscModel.cs b/src/Extensions/Banshee.Discs/Banshee.Discs/DiscModel.cs
new file mode 100644
index 0000000..ee695bd
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs/DiscModel.cs
@@ -0,0 +1,77 @@
+//
+// DiscModel.cs
+//
+// Author:
+//   Alex Launi <alex.launi@gmail.com>
+//
+// Copyright 2010 Alex Launi
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+using Banshee.Collection;
+using Banshee.Hardware;
+
+namespace Banshee.Discs
+{
+    public class DiscModel : MemoryTrackListModel
+    {
+        public DiscModel (IDiscVolume volume)
+        {
+           Volume = volume;
+        }
+
+        public IDiscVolume Volume { get; protected set;}
+
+        public virtual string Title {
+            get {
+                return Volume.Name;
+            }
+        }
+
+        public virtual void LoadModelFromDisc ()
+        {
+        }
+
+        private ICdromDevice Drive {
+            get { return Volume == null ? null : (Volume.Parent as ICdromDevice); }
+        }
+
+        public bool LockDoor ()
+        {
+            ICdromDevice drive = Drive;
+            return drive != null ? drive.LockDoor () : false;
+        }
+
+        public bool UnlockDoor ()
+        {
+            ICdromDevice drive = Drive;
+            return drive != null ? drive.UnlockDoor () : false;
+        }
+
+        public bool IsDoorLocked {
+            get {
+                ICdromDevice drive = Drive;
+                return drive != null ? drive.IsDoorLocked : false;
+            }
+        }
+    }
+}
+
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs/DiscService.cs b/src/Extensions/Banshee.Discs/Banshee.Discs/DiscService.cs
new file mode 100644
index 0000000..683a50a
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs/DiscService.cs
@@ -0,0 +1,216 @@
+//
+// DiscService.cs
+//
+// Author:
+//   Alex Launi <alex.launi@canonical.com>
+//
+// Copyright (C) 2010 Alex Launi
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using Mono.Unix;
+
+using Hyena;
+
+using Banshee.ServiceStack;
+using Banshee.Configuration;
+using Banshee.Preferences;
+using Banshee.Hardware;
+using Banshee.Gui;
+
+namespace Banshee.Discs
+{
+    public abstract class DiscService : IExtensionService, IDisposable
+    {
+        private List<DeviceCommand> unhandled_device_commands;
+
+        public DiscService ()
+        {
+        }
+
+        public virtual void Initialize ()
+        {
+            Sources = new Dictionary<string, DiscSource> ();
+
+            lock (this) {
+                // This says Cdrom, but really it means Cdrom in the general Disc device sense.
+                foreach (ICdromDevice device in ServiceManager.HardwareManager.GetAllCdromDevices ()) {
+                    MapDiscDevice (device);
+                }
+
+                ServiceManager.HardwareManager.DeviceAdded += OnHardwareDeviceAdded;
+                ServiceManager.HardwareManager.DeviceRemoved += OnHardwareDeviceRemoved;
+                ServiceManager.HardwareManager.DeviceCommand += OnDeviceCommand;
+            }
+        }
+
+        public virtual void Dispose ()
+        {
+            lock (this) {
+                ServiceManager.HardwareManager.DeviceAdded -= OnHardwareDeviceAdded;
+                ServiceManager.HardwareManager.DeviceRemoved -= OnHardwareDeviceRemoved;
+                ServiceManager.HardwareManager.DeviceCommand -= OnDeviceCommand;
+
+                foreach (DiscSource source in Sources.Values) {
+                    ServiceManager.SourceManager.RemoveSource (source);
+                    source.Dispose ();
+                }
+
+                Sources.Clear ();
+                Sources = null;
+            }
+        }
+
+        protected Dictionary<string, DiscSource> Sources {
+            get; private set;
+        }
+
+        protected virtual void MapDiscDevice (ICdromDevice device)
+        {
+            lock (this) {
+                foreach (IVolume volume in device) {
+                    if (volume is IDiscVolume) {
+                        MapDiscVolume ((IDiscVolume) volume);
+                    }
+                }
+            }
+        }
+
+        protected virtual void MapDiscVolume (IDiscVolume volume)
+        {
+            DiscSource source = null;
+
+            lock (this) {
+                if (Sources.ContainsKey (volume.Uuid)) {
+                    Log.Debug ("Already mapped");
+                    return;
+                } else if  (volume.HasAudio) {
+                    Log.Debug ("Mapping audio cd");
+                    source = new AudioCd.AudioCdSource (this as AudioCd.AudioCdService, new AudioCd.AudioCdDiscModel (volume));
+                } else if (volume.HasVideo) {
+                    Log.Debug ("Mapping dvd");
+                    source = new Dvd.DvdSource (this, new Dvd.DvdModel (volume));
+                } else {
+                    Log.Debug ("Neither :(");
+                    return;
+                }
+
+                Sources.Add (volume.Uuid, source);
+                ServiceManager.SourceManager.AddSource (source);
+
+                // If there are any queued device commands, see if they are to be
+                // handled by this new volume (e.g. --device-activate-play=cdda://sr0/)
+                try {
+                    if (unhandled_device_commands != null) {
+                        foreach (DeviceCommand command in unhandled_device_commands) {
+                            if (DeviceCommandMatchesSource (source, command)) {
+                                HandleDeviceCommand (source, command.Action);
+                                unhandled_device_commands.Remove (command);
+                                if (unhandled_device_commands.Count == 0) {
+                                    unhandled_device_commands = null;
+                                }
+                                break;
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+                    Log.Exception (e);
+                }
+
+                Log.DebugFormat ("Mapping disc ({0})", volume.Uuid);
+            }
+        }
+
+        internal void UnmapDiscVolume (string uuid)
+        {
+            lock (this) {
+                if (Sources.ContainsKey (uuid)) {
+                    DiscSource source = Sources[uuid];
+                    source.StopPlayingDisc ();
+                    ServiceManager.SourceManager.RemoveSource (source);
+                    Sources.Remove (uuid);
+                    Log.DebugFormat ("Unmapping disc ({0})", uuid);
+                }
+            }
+        }
+
+        private void OnHardwareDeviceAdded (object o, DeviceAddedArgs args)
+        {
+            lock (this) {
+                if (args.Device is ICdromDevice) {
+                    MapDiscDevice ((ICdromDevice)args.Device);
+                } else if (args.Device is IDiscVolume) {
+                    MapDiscVolume ((IDiscVolume)args.Device);
+                }
+            }
+        }
+
+        private void OnHardwareDeviceRemoved (object o, DeviceRemovedArgs args)
+        {
+            lock (this) {
+                UnmapDiscVolume (args.DeviceUuid);
+            }
+        }
+
+#region DeviceCommand Handling
+
+        protected abstract bool DeviceCommandMatchesSource (DiscSource source, DeviceCommand command);
+
+        protected virtual void OnDeviceCommand (object o, DeviceCommand command)
+        {
+            lock (this) {
+                // Check to see if we have an already mapped disc volume that should
+                // handle this incoming command; if not, queue it for later discs
+                foreach (var source in Sources.Values) {
+                    if (DeviceCommandMatchesSource (source, command)) {
+                        HandleDeviceCommand (source, command.Action);
+                        return;
+                    }
+                }
+
+                if (unhandled_device_commands == null) {
+                    unhandled_device_commands = new List<DeviceCommand> ();
+                }
+                unhandled_device_commands.Add (command);
+            }
+        }
+
+        protected virtual void HandleDeviceCommand (DiscSource source, DeviceCommandAction action)
+        {
+            if ((action & DeviceCommandAction.Activate) != 0) {
+                ServiceManager.SourceManager.SetActiveSource (source);
+            }
+
+            if ((action & DeviceCommandAction.Play) != 0) {
+                ServiceManager.PlaybackController.NextSource = source;
+                if (!ServiceManager.PlayerEngine.IsPlaying ()) {
+                    ServiceManager.PlaybackController.Next ();
+                }
+            }
+        }
+#endregion
+        string IService.ServiceName {
+            get { return "DiscService"; }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs/DiscSource.cs b/src/Extensions/Banshee.Discs/Banshee.Discs/DiscSource.cs
new file mode 100644
index 0000000..1893770
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs/DiscSource.cs
@@ -0,0 +1,200 @@
+//
+// DiscSource.cs
+//
+// Author:
+//   Alex Launi <alex.launi@canonical.com>
+//
+// Copyright 2010 Alex Launi
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Threading;
+
+using Hyena;
+using Mono.Unix;
+
+using Banshee.Collection;
+using Banshee.Collection.Database;
+using Banshee.ServiceStack;
+using Banshee.Sources;
+
+using Selection = Hyena.Collections.Selection;
+
+namespace Banshee.Discs
+{
+    public abstract class DiscSource : Source, ITrackModelSource, IUnmapableSource,
+        IDisposable
+    {
+        public DiscSource (DiscService service, DiscModel model, string genericName, string name, int order)
+            : base (genericName, name, order)
+        {
+            Service = service;
+            Model = model;
+        }
+
+        protected DiscService Service { get; set; }
+        protected DiscModel Model { get; set; }
+
+        public DiscModel DiscModel {
+            get { return Model; }
+            protected set { Model = value; }
+        }
+
+        public bool DiscIsPlaying {
+            get {
+                DiscTrackInfo playing_track = ServiceManager.PlayerEngine.CurrentTrack as DiscTrackInfo;
+                return playing_track != null && playing_track.Model == Model;
+            }
+        }
+
+        public virtual void StopPlayingDisc ()
+        {
+            if (DiscIsPlaying) {
+                ServiceManager.PlayerEngine.Close (true);
+            }
+        }
+
+        public virtual void Dispose ()
+        {
+        }
+
+#region ITrackModelSource Implementation
+
+        public TrackListModel TrackModel {
+            get { return Model; }
+        }
+
+        public AlbumListModel AlbumModel {
+            get { return null; }
+        }
+
+        public ArtistListModel ArtistModel {
+            get { return null; }
+        }
+
+        public void Reload ()
+        {
+            Model.Reload ();
+        }
+
+        public void RemoveTracks (Selection selection)
+        {
+        }
+
+        public void DeleteTracks (Selection selection)
+        {
+        }
+
+        public abstract bool CanRepeat { get; }
+
+        public abstract bool CanShuffle { get; }
+
+        public bool CanAddTracks {
+            get { return false; }
+        }
+
+        public bool CanRemoveTracks {
+            get { return false; }
+        }
+
+        public bool CanDeleteTracks {
+            get { return false; }
+        }
+
+        public bool ConfirmRemoveTracks {
+            get { return false; }
+        }
+
+        public bool ShowBrowser {
+            get { return false; }
+        }
+
+        public bool HasDependencies {
+            get { return false; }
+        }
+
+        public bool Indexable {
+            get { return false; }
+        }
+#endregion
+
+#region IUnmapableSource Implementation
+
+        public bool Unmap ()
+        {
+            StopPlayingDisc ();
+
+            foreach (TrackInfo track in DiscModel) {
+                track.CanPlay = false;
+            }
+
+            OnUpdated ();
+
+            SourceMessage eject_message = new SourceMessage (this);
+            eject_message.FreezeNotify ();
+            eject_message.IsSpinning = true;
+            eject_message.CanClose = false;
+            eject_message.Text = Catalog.GetString (String.Format ("Ejecting {0}...", GenericName.ToLower ()));
+            eject_message.ThawNotify ();
+            PushMessage (eject_message);
+
+            ThreadPool.QueueUserWorkItem (delegate {
+                try {
+                    DiscModel.Volume.Unmount ();
+                    DiscModel.Volume.Eject ();
+
+                    ThreadAssist.ProxyToMain (delegate {
+                        Service.UnmapDiscVolume (DiscModel.Volume.Uuid);
+                        Dispose ();
+                    });
+                } catch (Exception e) {
+                    ThreadAssist.ProxyToMain (delegate {
+                        ClearMessages ();
+                        eject_message.IsSpinning = false;
+                        eject_message.SetIconName ("dialog-error");
+                        eject_message.Text = String.Format (Catalog.GetString ("Could not eject {0}: {1}"), GenericName.ToLower (), e.Message);
+                        PushMessage (eject_message);
+
+                        foreach (TrackInfo track in Model) {
+                            track.CanPlay = true;
+                        }
+                        OnUpdated ();
+                    });
+
+                    Log.Exception (e);
+                }
+            });
+
+            return true;
+        }
+
+        public bool CanUnmap {
+            get { return DiscModel != null ? !DiscModel.IsDoorLocked : true; }
+        }
+
+        public bool ConfirmBeforeUnmap {
+            get { return false; }
+        }
+
+#endregion
+
+    }
+}
+
diff --git a/src/Extensions/Banshee.Discs/Banshee.Discs/DiscTrackInfo.cs b/src/Extensions/Banshee.Discs/Banshee.Discs/DiscTrackInfo.cs
new file mode 100644
index 0000000..a15e020
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Banshee.Discs/DiscTrackInfo.cs
@@ -0,0 +1,44 @@
+//
+// DiscTrackInfo.cs
+//
+// Author:
+//   Alex Launi <alex.launi@canonical.com>
+//
+// Copyright 2010 Alex Launi
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+using Banshee.Collection;
+using Banshee.Collection.Database;
+
+namespace Banshee.Discs
+{
+    public abstract class DiscTrackInfo : DatabaseTrackInfo
+    {
+        public DiscTrackInfo (DiscModel model)
+        {
+            Model = model;
+        }
+
+        public DiscModel Model { get; private set; }
+    }
+}
+
diff --git a/src/Extensions/Banshee.Discs/Makefile.am b/src/Extensions/Banshee.Discs/Makefile.am
new file mode 100644
index 0000000..7263b9b
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Makefile.am
@@ -0,0 +1,29 @@
+ASSEMBLY = Banshee.Discs
+TARGET = library
+LINK = $(REF_EXTENSION_DISCS)
+INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
+
+SOURCES =  \
+	Banshee.Discs.AudioCd/AudioCdDiscModel.cs \
+	Banshee.Discs.AudioCd/AudioCdDuplicator.cs \
+	Banshee.Discs.AudioCd/AudioCdRipper.cs \
+	Banshee.Discs.AudioCd/AudioCdService.cs \
+	Banshee.Discs.AudioCd/AudioCdSource.cs \
+	Banshee.Discs.AudioCd/AudioCdTrackInfo.cs \
+	Banshee.Discs.Dvd/DvdModel.cs \
+	Banshee.Discs.Dvd/DvdService.cs \
+	Banshee.Discs.Dvd/DvdSource.cs \
+	Banshee.Discs.Dvd/DvdTrackInfo.cs \
+	Banshee.Discs/DiscModel.cs \
+	Banshee.Discs/DiscService.cs \
+	Banshee.Discs/DiscSource.cs \
+	Banshee.Discs/DiscTrackInfo.cs
+
+RESOURCES =  \
+	Banshee.Discs.addin.xml \
+	Resources/ActiveSourceUI.xml \
+	Resources/GlobalUI.xml \
+	Resources/GlobalUIDvd.xml
+
+include $(top_srcdir)/build/build.mk
+
diff --git a/src/Extensions/Banshee.Discs/Resources/ActiveSourceUI.xml b/src/Extensions/Banshee.Discs/Resources/ActiveSourceUI.xml
new file mode 100644
index 0000000..038665e
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Resources/ActiveSourceUI.xml
@@ -0,0 +1,8 @@
+<ui>
+    <toolbar name="HeaderToolbar">
+        <placeholder name="SourceActions">
+            <toolitem action="DuplicateDiscAction"/>
+            <toolitem action="RipDiscAction"/>
+        </placeholder>
+    </toolbar>
+</ui>
diff --git a/src/Extensions/Banshee.Discs/Resources/GlobalUI.xml b/src/Extensions/Banshee.Discs/Resources/GlobalUI.xml
new file mode 100644
index 0000000..eec6c5f
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Resources/GlobalUI.xml
@@ -0,0 +1,9 @@
+<ui>
+    <popup name="AudioCdContextMenu">
+        <menuitem name="RipDisc" action="RipDiscAction"/>
+        <menuitem name="DuplicateDisc" action="DuplicateDiscAction"/>
+        <menuitem name="SourcePreferences" action="SourcePreferencesAction"/>
+        <separator/>
+        <menuitem name="UnmapSource" action="UnmapSourceAction"/>
+    </popup>
+</ui>
diff --git a/src/Extensions/Banshee.Discs/Resources/GlobalUIDvd.xml b/src/Extensions/Banshee.Discs/Resources/GlobalUIDvd.xml
new file mode 100644
index 0000000..f5bb25e
--- /dev/null
+++ b/src/Extensions/Banshee.Discs/Resources/GlobalUIDvd.xml
@@ -0,0 +1,7 @@
+<ui>
+    <popup name="DvdContextMenu">
+        <menuitem name="GoToMenu" action="GoToMenuAction"/>
+        <separator/>
+        <menuitem name="UnmapSource" action="UnmapSourceAction"/>
+    </popup>
+</ui>
\ No newline at end of file
diff --git a/src/Extensions/Banshee.Discs/ThemeIcons/16x16/actions/media-import-audio-cd.png b/src/Extensions/Banshee.Discs/ThemeIcons/16x16/actions/media-import-audio-cd.png
new file mode 100644
index 0000000..e637fea
Binary files /dev/null and b/src/Extensions/Banshee.Discs/ThemeIcons/16x16/actions/media-import-audio-cd.png differ
diff --git a/src/Extensions/Banshee.Discs/ThemeIcons/22x22/actions/media-import-audio-cd.png b/src/Extensions/Banshee.Discs/ThemeIcons/22x22/actions/media-import-audio-cd.png
new file mode 100644
index 0000000..ee0d170
Binary files /dev/null and b/src/Extensions/Banshee.Discs/ThemeIcons/22x22/actions/media-import-audio-cd.png differ
diff --git a/src/Extensions/Banshee.Fixup/Banshee.Fixup.csproj b/src/Extensions/Banshee.Fixup/Banshee.Fixup.csproj
index 608109f..d39a1e1 100644
--- a/src/Extensions/Banshee.Fixup/Banshee.Fixup.csproj
+++ b/src/Extensions/Banshee.Fixup/Banshee.Fixup.csproj
@@ -91,6 +91,7 @@
     <Compile Include="Banshee.Fixup\Solver.cs" />
     <Compile Include="Banshee.Fixup\Tests.cs" />
     <Compile Include="Banshee.Fixup\View.cs" />
+    <Compile Include="Banshee.Fixup\GenreDuplicateSolver.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ProjectExtensions>
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenWindow.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenWindow.cs
index 7a4134f..8a95d51 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenWindow.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenWindow.cs
@@ -83,8 +83,6 @@ namespace Banshee.NowPlaying
                 case Gdk.Key.c:
                 case Gdk.Key.V:
                 case Gdk.Key.v:
-                case Gdk.Key.Return:
-                case Gdk.Key.KP_Enter:
                 case Gdk.Key.Tab:
                     if (controls == null || !controls.Visible) {
                         ShowControls ();
@@ -92,17 +90,51 @@ namespace Banshee.NowPlaying
                         HideControls ();
                     }
                     return true;
+                case Gdk.Key.Return:
+                case Gdk.Key.KP_Enter:
+                    if (ServiceManager.PlayerEngine.IsMenu) {
+                       ServiceManager.PlayerEngine.ActivateCurrentMenu ();
+                    } else if (controls == null || !controls.Visible) {
+                        ShowControls ();
+                    } else {
+                        HideControls ();
+                    }
+                    return true;
                 case Gdk.Key.Right:
                 case Gdk.Key.rightarrow:
-                    player.Position += mod ? fast_seek : slow_seek;
-                    ShowControls ();
+                case Gdk.Key.KP_Right:
+                    if (ServiceManager.PlayerEngine.IsMenu) {
+                       ServiceManager.PlayerEngine.NavigateToRightMenu ();
+                    } else {
+                        player.Position += mod ? fast_seek : slow_seek;
+                        ShowControls ();
+                    }
                     break;
                 case Gdk.Key.Left:
                 case Gdk.Key.leftarrow:
-                    player.Position -= mod ? fast_seek : slow_seek;
-                    ShowControls ();
+                case Gdk.Key.KP_Left:
+                    if (ServiceManager.PlayerEngine.IsMenu) {
+                       ServiceManager.PlayerEngine.NavigateToLeftMenu ();
+                    } else {
+                        player.Position -= mod ? fast_seek : slow_seek;
+                        ShowControls ();
+                    }
                     break;
-            }
+                case Gdk.Key.uparrow:
+                case Gdk.Key.Up:
+                case Gdk.Key.KP_Up:
+                    if (ServiceManager.PlayerEngine.IsMenu) {
+                       ServiceManager.PlayerEngine.NavigateToUpMenu ();
+                    }
+                    break;
+                case Gdk.Key.downarrow:
+                case Gdk.Key.Down:
+                case Gdk.Key.KP_Down:
+                    if (ServiceManager.PlayerEngine.IsMenu) {
+                       ServiceManager.PlayerEngine.NavigateToDownMenu ();
+                    }
+                    break;
+                }
 
             return base.OnKeyPressEvent (evnt);
         }
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingContents.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingContents.cs
index 04721af..04adbe9 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingContents.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingContents.cs
@@ -56,6 +56,13 @@ namespace Banshee.NowPlaying
             Child = table = new Table (1, 1, false) { Visible = true };
 
             table.NoShowAll = true;
+            CanFocus = true;
+
+            this.Events = Gdk.EventMask.PointerMotionMask |
+                    Gdk.EventMask.ButtonPressMask |
+                    Gdk.EventMask.ButtonMotionMask |
+                    Gdk.EventMask.KeyPressMask |
+                    Gdk.EventMask.KeyReleaseMask;
 
             CreateVideoDisplay ();
 
@@ -108,7 +115,8 @@ namespace Banshee.NowPlaying
         protected override void OnShown ()
         {
             base.OnShown ();
-
+            this.GrabFocus ();
+            Console.WriteLine ("grabFocus");
             // Ugly hack to ensure the video window is mapped/realized
             if (!video_display_initial_shown) {
                 video_display_initial_shown = true;
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingInterface.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingInterface.cs
index b6ce7cb..6178559 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingInterface.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingInterface.cs
@@ -57,15 +57,37 @@ namespace Banshee.NowPlaying
 
             Contents = new NowPlayingContents ();
             Contents.ButtonPressEvent += (o, a) => {
-                if (a.Event.Type == Gdk.EventType.TwoButtonPress) {
+                switch (a.Event.Type) {
+                case Gdk.EventType.TwoButtonPress:
                     var iaservice = ServiceManager.Get<InterfaceActionService> ();
                     var action = iaservice.ViewActions["FullScreenAction"] as Gtk.ToggleAction;
                     if (action != null && action.Sensitive) {
                         action.Active = !action.Active;
                     }
+                    break;
+                case Gdk.EventType.ButtonPress:
+                    Contents.GrabFocus ();
+                    if (ServiceManager.PlayerEngine.IsMenu) {
+                        ServiceManager.PlayerEngine.NotifyMouseButtonPressed ((int)a.Event.Button, a.Event.X, a.Event.Y);
+                    }
+                    break;
+                case Gdk.EventType.ButtonRelease:
+                    if (ServiceManager.PlayerEngine.IsMenu) {
+                        ServiceManager.PlayerEngine.NotifyMouseButtonReleased ((int)a.Event.Button, a.Event.X, a.Event.Y);
+                    }
+                    break;
+                }
+            };
+
+            //TODO stop tracking mouse when no more in menu
+            Contents.MotionNotifyEvent += (o, args) => {
+                if (ServiceManager.PlayerEngine.IsMenu) {
+                    ServiceManager.PlayerEngine.NotifyMouseMove (args.Event.X, args.Event.Y);
                 }
             };
 
+            Contents.KeyPressEvent += OnKeyPress;
+
             // This is my really sweet hack - it's where the video widget
             // is sent when the source is not active. This keeps the video
             // widget from being completely destroyed, causing problems with
@@ -88,6 +110,46 @@ namespace Banshee.NowPlaying
             screensaver = new ScreensaverManager ();
         }
 
+        [GLib.ConnectBefore]
+        void OnKeyPress (object o, KeyPressEventArgs args)
+        {
+            if (!ServiceManager.PlayerEngine.IsMenu) {
+                    return;
+                }
+                switch (args.Event.Key) {
+                    case Gdk.Key.leftarrow:
+                    case Gdk.Key.KP_Left:
+                    case Gdk.Key.Left:
+                        ServiceManager.PlayerEngine.NavigateToLeftMenu ();
+                        args.RetVal = true;
+                        break;
+                    case Gdk.Key.rightarrow:
+                    case Gdk.Key.KP_Right:
+                    case Gdk.Key.Right:
+                        ServiceManager.PlayerEngine.NavigateToRightMenu ();
+                        args.RetVal = true;
+                        break;
+                    case Gdk.Key.uparrow:
+                    case Gdk.Key.KP_Up:
+                    case Gdk.Key.Up:
+                        ServiceManager.PlayerEngine.NavigateToUpMenu ();
+                        args.RetVal = true;
+                        break;
+                    case Gdk.Key.downarrow:
+                    case Gdk.Key.KP_Down:
+                    case Gdk.Key.Down:
+                        ServiceManager.PlayerEngine.NavigateToDownMenu ();
+                        args.RetVal = true;
+                        break;
+                    case Gdk.Key.Break:
+                    case Gdk.Key.KP_Enter:
+                    case Gdk.Key.Return:
+                        ServiceManager.PlayerEngine.ActivateCurrentMenu ();
+                        args.RetVal = true;
+                        break;
+                }
+        }
+
         public override void Dispose ()
         {
             base.Dispose ();
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs
index 2ce6110..9936962 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs
@@ -52,7 +52,7 @@ namespace Banshee.Podcasting.Gui
                         WHERE PodcastSyndications.FeedID = PodcastItems.FeedID AND
                           PodcastItems.ItemID = CoreTracks.ExternalID AND PodcastEnclosures.ItemID = PodcastItems.ItemID AND
                           CoreCache.ModelID = {1} AND CoreCache.ItemId = {2} {3})
-                    ORDER BY lower(Title)";
+                    ORDER BY HYENA_COLLATION_KEY(Title)";
         }
 
         public override string FilterColumn {
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs
index 2f8b9c8..f60b7b1 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs
@@ -219,6 +219,8 @@ namespace Banshee.Podcasting.Gui
             Properties.SetString ("Icon.Name", "podcast");
             Properties.Set<string> ("SearchEntryDescription", Catalog.GetString ("Search your podcasts"));
 
+            Properties.Set<string> ("TrackPropertiesActionLabel", Catalog.GetString ("Episode Properties"));
+
             Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
             Properties.Set<bool> ("ActiveSourceUIResourcePropagate", true);
             Properties.Set<System.Reflection.Assembly> ("ActiveSourceUIResource.Assembly", typeof(PodcastSource).Assembly);
@@ -314,7 +316,13 @@ namespace Banshee.Podcasting.Gui
 
         protected override DatabaseTrackListModel CreateTrackModelFor (DatabaseSource src)
         {
-            return PodcastTrackModel = new PodcastTrackListModel (ServiceManager.DbConnection, DatabaseTrackInfo.Provider, src);
+            var model = new PodcastTrackListModel (ServiceManager.DbConnection, DatabaseTrackInfo.Provider, src);
+
+            if (PodcastTrackModel == null) {
+                PodcastTrackModel = model;
+            }
+
+            return model;
         }
 
         protected override IEnumerable<IFilterListModel> CreateFiltersFor (DatabaseSource src)
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs
index 1b24771..619a4a0 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs
@@ -119,6 +119,11 @@ namespace Banshee.Podcasting.Gui
                      OnPodcastProperties
                 ),
                 new ActionEntry (
+                    "EpisodePodcastProperties", null,
+                     Catalog.GetString ("Podcast Properties"), null, String.Empty,
+                     OnEpisodePodcastProperties
+                ),
+                new ActionEntry (
                     "PodcastItemMarkNewAction", null,
                      Catalog.GetString ("Mark as New"),
                      null, String.Empty,
@@ -250,7 +255,8 @@ namespace Banshee.Podcasting.Gui
             if (IsPodcastSource) {
                 int count = ActiveDbSource.TrackModel.Selection.Count;
 
-                //bool has_single_podcast = podcast_source.PodcastTrackModel.SelectionPodcastCount == 1;
+                bool has_single_podcast = podcast_source.PodcastTrackModel.SelectionPodcastCount == 1;
+                UpdateAction ("EpisodePodcastProperties", true, has_single_podcast);
 
                 UpdateAction ("PodcastItemLinkAction", true, count == 1);
 
@@ -288,9 +294,9 @@ namespace Banshee.Podcasting.Gui
             }
         }
 
-        private void SubscribeToPodcast (Uri uri, FeedAutoDownload syncPreference)
+        private void SubscribeToPodcast (Uri uri, FeedAutoDownload syncPreference, int max_items)
         {
-            FeedsManager.Instance.FeedManager.CreateFeed (uri.ToString (), syncPreference);
+            FeedsManager.Instance.FeedManager.CreateFeed (uri.ToString (), syncPreference, max_items);
         }
 
         private IEnumerable<TrackInfo> GetSelectedItems ()
@@ -323,6 +329,7 @@ namespace Banshee.Podcasting.Gui
             ResponseType response = (ResponseType) subscribeDialog.Run ();
 
             syncPreference = subscribeDialog.SyncPreference;
+            int max_items = subscribeDialog.MaxItemCount;
 
             if (response == ResponseType.Ok) {
                 url = subscribeDialog.Url.Trim ().Trim ('/');
@@ -344,7 +351,7 @@ namespace Banshee.Podcasting.Gui
                     Catalog.GetString ("Podcast URL is invalid.")
                 );
             } else {
-                SubscribeToPodcast (feedUri, syncPreference);
+                SubscribeToPodcast (feedUri, syncPreference, max_items);
             }
         }
 
@@ -513,6 +520,17 @@ namespace Banshee.Podcasting.Gui
             }
         }
 
+        private void OnEpisodePodcastProperties (object sender, EventArgs e)
+        {
+            foreach (PodcastTrackInfo pi in PodcastTrackInfo.From (GetSelectedItems ())) {
+                var feed = pi.Feed;
+                if (feed != null) {
+                    new PodcastFeedPropertiesDialog (podcast_source, feed).Run ();
+                }
+                break;
+            }
+        }
+
         private void OnPodcastItemProperties (object sender, EventArgs e)
         {
                 /*ReadOnlyCollection<PodcastItem> items = itemModel.CopySelectedItems ();
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs
index f0cc048..a1e4618 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs
@@ -34,61 +34,67 @@ using Pango;
 
 using Migo.Syndication;
 using Banshee.Base;
+using Banshee.Collection;
 using Banshee.Podcasting.Data;
+using Banshee.Gui.TrackEditor;
+using Banshee.Collection.Gui;
+using Banshee.ServiceStack;
 
 namespace Banshee.Podcasting.Gui
 {
     internal class PodcastFeedPropertiesDialog : Dialog
     {
-        private PodcastSource source;
-        private Feed feed;
-        private SyncPreferenceComboBox new_episode_option_combo;
-        private Entry name_entry;
+        PodcastSource source;
+        Feed feed;
+        Entry name_entry;
+
+        Frame header_image_frame;
+        Image header_image;
+        FakeTrackInfo fake_track = new FakeTrackInfo ();
+
+        CheckButton subscribed_check, download_check, archive_check;
+
+        private VBox main_box;
 
         public PodcastFeedPropertiesDialog (PodcastSource source, Feed feed)
         {
             this.source = source;
             this.feed = feed;
+            fake_track.Feed = feed;
 
             Title = feed.Title;
+            HasSeparator = false;
+            BorderWidth = 12;
+            WidthRequest = 525;
             //IconThemeUtils.SetWindowIcon (this);
 
             BuildWindow ();
-        }
 
-        private void BuildWindow()
-        {
-            BorderWidth = 6;
-            VBox.Spacing = 12;
-            HasSeparator = false;
+            DefaultResponse = Gtk.ResponseType.Cancel;
+            ActionArea.Layout = Gtk.ButtonBoxStyle.End;
 
-            HBox box = new HBox();
-            box.BorderWidth = 6;
-            box.Spacing = 12;
+            Response += OnResponse;
 
-            Button save_button = new Button("gtk-save");
-            save_button.CanDefault = true;
-            save_button.Show();
+            ShowAll ();
+        }
 
-            // For later additions to the dialog.  (I.E. Feed art)
-            HBox content_box = new HBox();
-            content_box.Spacing = 12;
 
-            Table table = new Table (2, 4, false);
-            table.RowSpacing = 6;
-            table.ColumnSpacing = 12;
+        private FeedAutoDownload DownloadPref {
+            get { return download_check.Active ? FeedAutoDownload.All : FeedAutoDownload.None; }
+            set { download_check.Active = value != FeedAutoDownload.None; }
+        }
 
-            Label description_label = new Label (Catalog.GetString ("Description:"));
-            description_label.SetAlignment (0f, 0f);
-            description_label.Justify = Justification.Left;
+        private int MaxItemCount {
+            get { return archive_check.Active ? 1 : 0; }
+            set { archive_check.Active = value > 0; }
+        }
 
-            Label last_updated_label = new Label (Catalog.GetString ("Last updated:"));
-            last_updated_label.SetAlignment (0f, 0f);
-            last_updated_label.Justify = Justification.Left;
+        private void BuildWindow()
+        {
+            VBox.Spacing = 12;
+            main_box = VBox;
 
-            Label name_label = new Label (Catalog.GetString ("Podcast Name:"));
-            name_label.SetAlignment (0f, 0f);
-            name_label.Justify = Justification.Left;
+            var save_button = new Button ("gtk-save") { CanDefault = true };
 
             name_entry = new Entry ();
             name_entry.Text = feed.Title;
@@ -96,132 +102,132 @@ namespace Banshee.Podcasting.Gui
                 save_button.Sensitive = !String.IsNullOrEmpty (name_entry.Text);
             };
 
-            Label feed_url_label = new Label (Catalog.GetString ("URL:"));
-            feed_url_label.SetAlignment (0f, 0f);
-            feed_url_label.Justify = Justification.Left;
+            subscribed_check = new CheckButton (Catalog.GetString ("Check periodically for new episodes")) {
+                TooltipText = Catalog.GetString ("If checked, Banshee will check every hour to see if this podcast has new episodes")
+            };
+
+            download_check = new CheckButton (Catalog.GetString ("Download new episodes"));
+            DownloadPref = feed.AutoDownload;
 
-            Label new_episode_option_label = new Label (Catalog.GetString ("When feed is updated:"));
-            new_episode_option_label.SetAlignment (0f, 0.5f);
-            new_episode_option_label.Justify = Justification.Left;
+            archive_check = new CheckButton (Catalog.GetString ("Archive all episodes except the newest one"));
+            MaxItemCount = (int)feed.MaxItemCount;
 
-            Label last_updated_text = new Label (feed.LastDownloadTime.ToString ("f"));
-            last_updated_text.Justify = Justification.Left;
-            last_updated_text.SetAlignment (0f, 0f);
+            subscribed_check.Toggled += delegate {
+                download_check.Sensitive = archive_check.Sensitive = subscribed_check.Active;
+            };
+            subscribed_check.Active = feed.IsSubscribed;
+            download_check.Sensitive = archive_check.Sensitive = subscribed_check.Active;
 
-            Label feed_url_text = new Label (feed.Url.ToString ());
-            feed_url_text.Wrap = false;
-            feed_url_text.Selectable = true;
-            feed_url_text.SetAlignment (0f, 0f);
-            feed_url_text.Justify = Justification.Left;
-            feed_url_text.Ellipsize = Pango.EllipsizeMode.End;
+            var last_updated_text = new Label (feed.LastDownloadTime.ToString ("f")) {
+                Justify = Justification.Left,
+                Xalign = 0f
+            };
+
+            var feed_url_text = new Label (feed.Url.ToString ()) {
+                Wrap = false,
+                Selectable = true,
+                Xalign = 0f,
+                Justify = Justification.Left,
+                Ellipsize = Pango.EllipsizeMode.End
+            };
 
             string description_string = String.IsNullOrEmpty (feed.Description) ?
                                         Catalog.GetString ("No description available") :
                                         feed.Description;
 
-            Label descrition_text = new Label (description_string);
-            descrition_text.Justify = Justification.Left;
-            descrition_text.SetAlignment (0f, 0f);
-            descrition_text.Wrap = true;
-            descrition_text.Selectable = true;
-
-            Viewport description_viewport = new Viewport();
-            description_viewport.SetSizeRequest(-1, 150);
-            description_viewport.ShadowType = ShadowType.None;
-
-            ScrolledWindow description_scroller = new ScrolledWindow ();
-            description_scroller.HscrollbarPolicy = PolicyType.Never;
-            description_scroller.VscrollbarPolicy = PolicyType.Automatic;
-
-            description_viewport.Add (descrition_text);
-            description_scroller.Add (description_viewport);
-
-            new_episode_option_combo = new SyncPreferenceComboBox (feed.AutoDownload);
-
-            // First column
-            uint i = 0;
-            table.Attach (
-                name_label, 0, 1, i, ++i,
-                AttachOptions.Fill, AttachOptions.Fill, 0, 0
-            );
-
-            table.Attach (
-                feed_url_label, 0, 1, i, ++i,
-                AttachOptions.Fill, AttachOptions.Fill, 0, 0
-            );
-
-            table.Attach (
-                last_updated_label, 0, 1, i, ++i,
-                AttachOptions.Fill, AttachOptions.Fill, 0, 0
-            );
-
-            table.Attach (
-                new_episode_option_label, 0, 1, i, ++i,
-                AttachOptions.Fill, AttachOptions.Fill, 0, 0
+            var header_box = new HBox () { Spacing = 6 };
+
+            header_image_frame = new Frame ();
+            header_image = new Image ();
+            LoadCoverArt (fake_track);
+            header_image_frame.Add (
+                CoverArtEditor.For (header_image,
+                    (x, y) => true,
+                    () => fake_track,
+                    () => LoadCoverArt (fake_track)
+                )
             );
+            header_box.PackStart (header_image_frame, false, false, 0);
+
+            var table = new Hyena.Widgets.SimpleTable<int> ();
+            table.XOptions[0] = AttachOptions.Fill;
+            table.XOptions[1] = AttachOptions.Expand | AttachOptions.Fill;
+            table.AddRow (0, HeaderLabel (Catalog.GetString ("Name:")), name_entry);
+            table.AddRow (1, HeaderLabel (Catalog.GetString ("Website:")),
+                new Gtk.Alignment (0f, 0f, 0f, 0f) {
+                    Child = new LinkButton (feed.Link, Catalog.GetString ("Visit")) {
+                        Image = new Gtk.Image (Gtk.Stock.JumpTo, Gtk.IconSize.Button)
+                    }
+            });
+            header_box.PackStart (table, true, true, 0);
+
+            main_box.PackStart (header_box, false, false, 0);
+
+            Add (Catalog.GetString ("Subscription Options"), subscribed_check, download_check, archive_check);
+
+            var details = new Banshee.Gui.TrackEditor.StatisticsPage ();
+            details.AddItem (Catalog.GetString ("Feed URL:"), feed_url_text.Text);
+            details.AddItem (Catalog.GetString ("Last Refreshed:"), last_updated_text.Text);
+            details.AddItem (Catalog.GetString ("Description:"), description_string, true);
+            details.AddItem (Catalog.GetString ("Category:"), feed.Category);
+            details.AddItem (Catalog.GetString ("Keywords:"), feed.Keywords);
+            details.AddItem (Catalog.GetString ("Copyright:"), feed.Copyright);
+            details.HeightRequest = 120;
+            Add (true, Catalog.GetString ("Details"), details);
+
+            AddActionWidget (new Button ("gtk-cancel") { CanDefault = true }, ResponseType.Cancel);
+            AddActionWidget (save_button, ResponseType.Ok);
+        }
 
-            table.Attach (
-                description_label, 0, 1, i, ++i,
-                AttachOptions.Fill, AttachOptions.Fill, 0, 0
-            );
-
-            // Second column
-            i = 0;
-            table.Attach (
-                name_entry, 1, 2, i, ++i,
-                AttachOptions.Fill, AttachOptions.Fill, 0, 0
-            );
-
-            table.Attach (
-                feed_url_text, 1, 2, i, ++i,
-                AttachOptions.Fill, AttachOptions.Fill, 0, 0
-            );
-
-            table.Attach (
-                last_updated_text, 1, 2, i, ++i,
-                AttachOptions.Fill, AttachOptions.Fill, 0, 0
-            );
-
-            table.Attach (
-                new_episode_option_combo, 1, 2, i, ++i,
-                AttachOptions.Fill, AttachOptions.Fill, 0, 0
-            );
-
-            table.Attach (description_scroller, 1, 2, i, ++i,
-                          AttachOptions.Expand | AttachOptions.Fill,
-                          AttachOptions.Expand | AttachOptions.Fill, 0, 0
-                         );
-
-            content_box.PackStart (table, true, true, 0);
-            box.PackStart (content_box, true, true, 0);
+        private void Add (string header_txt, params Widget [] widgets)
+        {
+            Add (false, header_txt, widgets);
+        }
 
-            Button cancel_button = new Button("gtk-cancel");
-            cancel_button.CanDefault = true;
-            cancel_button.Show();
+        private Label HeaderLabel (string str)
+        {
+            return new Label () {
+                Markup = String.Format ("<b>{0}</b>", GLib.Markup.EscapeText (str)),
+                Xalign = 0f
+            };
+        }
 
-            AddActionWidget (cancel_button, ResponseType.Cancel);
-            AddActionWidget (save_button, ResponseType.Ok);
+        private void Add (bool filled, string header_txt, params Widget [] widgets)
+        {
+            var vbox = new VBox () { Spacing = 3 };
 
-            DefaultResponse = Gtk.ResponseType.Cancel;
-            ActionArea.Layout = Gtk.ButtonBoxStyle.End;
+            vbox.PackStart (HeaderLabel (header_txt), false, false, 0);
 
-            box.ShowAll ();
-            VBox.Add (box);
+            foreach (var child in widgets) {
+                var align = new Gtk.Alignment (0, 0, 1, 1) { LeftPadding = 12, Child = child };
+                vbox.PackStart (align, filled, filled, 0);
+            }
 
-            Response += OnResponse;
+            main_box.PackStart (vbox, filled, filled, 0);
         }
 
         private void OnResponse (object sender, ResponseArgs args)
         {
             if (args.ResponseId == Gtk.ResponseType.Ok) {
-                FeedAutoDownload new_sync_pref = new_episode_option_combo.ActiveSyncPreference;
-
                 bool changed = false;
-                if (feed.AutoDownload != new_sync_pref) {
-                    feed.AutoDownload = new_sync_pref;
+
+                if (feed.IsSubscribed != subscribed_check.Active) {
+                    feed.IsSubscribed = subscribed_check.Active;
                     changed = true;
                 }
 
+                if (feed.IsSubscribed) {
+                    if (feed.AutoDownload != DownloadPref) {
+                        feed.AutoDownload = DownloadPref;
+                        changed = true;
+                    }
+
+                    if (feed.MaxItemCount != MaxItemCount) {
+                        feed.MaxItemCount = MaxItemCount;
+                        changed = true;
+                    }
+                }
+
                 if (feed.Title != name_entry.Text) {
                     feed.Title = name_entry.Text;
                     source.Reload ();
@@ -236,5 +242,42 @@ namespace Banshee.Podcasting.Gui
             (sender as Dialog).Response -= OnResponse;
             (sender as Dialog).Destroy();
         }
+
+        void LoadCoverArt (TrackInfo current_track)
+        {
+            if (current_track == null || current_track.ArtworkId == null) {
+                SetDefaultCoverArt ();
+                return;
+            }
+
+            var artwork = ServiceManager.Get<ArtworkManager> ();
+            var cover_art = artwork.LookupScalePixbuf (current_track.ArtworkId, 64);
+
+            header_image.Clear ();
+            header_image.Pixbuf = cover_art;
+
+            if (cover_art == null) {
+                SetDefaultCoverArt ();
+            } else {
+                header_image_frame.ShadowType = ShadowType.In;
+                header_image.QueueDraw ();
+            }
+        }
+
+        void SetDefaultCoverArt ()
+        {
+            header_image.IconName = "podcast";
+            header_image.PixelSize = 64;
+            header_image_frame.ShadowType = ShadowType.In;
+            header_image.QueueDraw ();
+        }
+
+        class FakeTrackInfo : TrackInfo
+        {
+            public Feed Feed { get; set; }
+            public override string ArtworkId {
+                get { return Feed == null ? null : PodcastService.ArtworkIdFor (Feed); }
+            }
+        }
     }
 }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs
index 02ef1e6..fe50871 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs
@@ -46,16 +46,19 @@ namespace Banshee.Podcasting.Gui
     {
         private Entry url_entry;
         private Gtk.AccelGroup accelGroup;
-        private SyncPreferenceComboBox syncCombo;
+        CheckButton download_check, archive_check;
 
         public string Url {
             get { return url_entry.Text; }
             set { url_entry.Text = value; }
         }
 
-        public FeedAutoDownload SyncPreference
-        {
-            get { return syncCombo.ActiveSyncPreference; }
+        public FeedAutoDownload SyncPreference {
+            get { return download_check.Active ? FeedAutoDownload.All : FeedAutoDownload.None; }
+        }
+
+        public int MaxItemCount {
+            get { return archive_check.Active ? 1 : 0; }
         }
 
         public PodcastSubscribeDialog () : base (Catalog.GetString("Subscribe"), null, DialogFlags.Modal | DialogFlags.NoSeparator)
@@ -95,32 +98,12 @@ namespace Banshee.Podcasting.Gui
             header.Justify = Justification.Left;
             header.SetAlignment (0.0f, 0.0f);
 
-            WrapLabel message = new WrapLabel ();
-            message.Markup = Catalog.GetString (
-                "Please enter the URL of the podcast to which you would like to subscribe."
-            );
-
-            message.Wrap = true;
-
-            VBox sync_vbox = new VBox ();
-
-            VBox expander_children = new VBox();
-            //expander_children.BorderWidth = 6;
-            expander_children.Spacing = 6;
-
-            Label sync_text = new Label (
-                Catalog.GetString ("When new episodes are available:  ")
-            );
-
-            sync_text.SetAlignment (0.0f, 0.0f);
-            sync_text.Justify = Justification.Left;
-
-            syncCombo = new SyncPreferenceComboBox ();
-
-            expander_children.PackStart (sync_text, true, true, 0);
-            expander_children.PackStart (syncCombo, true, true, 0);
-
-            sync_vbox.Add (expander_children);
+            var message = new WrapLabel () {
+                Markup = Catalog.GetString (
+                    "Please enter the URL of the podcast to which you would like to subscribe."
+                ),
+                Wrap = true
+            };
 
             url_entry = new Entry ();
             url_entry.ActivatesDefault = true;
@@ -138,31 +121,25 @@ namespace Banshee.Podcasting.Gui
                 }
             }
 
-            Table table = new Table (1, 2, false);
-            table.RowSpacing = 6;
-            table.ColumnSpacing = 12;
-
-            table.Attach (
-                new Label (Catalog.GetString ("URL:")), 0, 1, 0, 1,
-                AttachOptions.Shrink, AttachOptions.Shrink, 0, 0
-            );
-
-            table.Attach (
-                url_entry, 1, 2, 0, 1,
-                AttachOptions.Expand | AttachOptions.Fill,
-                AttachOptions.Shrink, 0, 0
-            );
-
-            table.Attach (
-                sync_vbox, 0, 2, 1, 2,
-                AttachOptions.Expand | AttachOptions.Fill,
-                AttachOptions.Shrink, 0, 0
-            );
-
             contentBox.PackStart (header, true, true, 0);
             contentBox.PackStart (message, true, true, 0);
 
-            contentBox.PackStart (table, true, true, 0);
+            var url_box = new HBox () { Spacing = 12 };
+            url_box.PackStart (new Label (Catalog.GetString ("URL:")), false, false, 0);
+            url_box.PackStart (url_entry, true, true, 0);
+            contentBox.PackStart (url_box, false, false, 0);
+
+            var options_label = new Label () {
+                Markup = String.Format ("<b>{0}</b>", GLib.Markup.EscapeText (Catalog.GetString ("Subscription Options"))),
+                Xalign = 0f
+            };
+            download_check = new CheckButton (Catalog.GetString ("Download new episodes"));
+            archive_check = new CheckButton (Catalog.GetString ("Archive all episodes except the newest one"));
+            var options_box = new VBox () { Spacing = 3 };
+            options_box.PackStart (options_label, false, false, 0);
+            options_box.PackStart (new Gtk.Alignment (0f, 0f, 0f, 0f) { LeftPadding = 12, Child = download_check }, false, false, 0);
+            options_box.PackStart (new Gtk.Alignment (0f, 0f, 0f, 0f) { LeftPadding = 12, Child = archive_check }, false, false, 0);
+            contentBox.PackStart (options_box, false, false, 0);
 
             box.PackStart (contentBox, true, true, 0);
 
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs
index 8710ddc..044dfae 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs
@@ -402,7 +402,7 @@ namespace Banshee.Podcasting
         private void AddFeed (string uri, string title)
         {
             // TODO replace autodownload w/ actual default preference
-            FeedsManager.Instance.FeedManager.CreateFeed (uri, title, FeedAutoDownload.None);
+            FeedsManager.Instance.FeedManager.CreateFeed (uri, title, FeedAutoDownload.None, 0);
             source.NotifyUser ();
             source.UpdateFeedMessages ();
         }
diff --git a/src/Extensions/Banshee.Podcasting/Resources/ActiveSourceUI.xml b/src/Extensions/Banshee.Podcasting/Resources/ActiveSourceUI.xml
index 33a47ea..1c8c547 100644
--- a/src/Extensions/Banshee.Podcasting/Resources/ActiveSourceUI.xml
+++ b/src/Extensions/Banshee.Podcasting/Resources/ActiveSourceUI.xml
@@ -50,5 +50,8 @@
         <!--
         <menuitem name="PodcastItemCancel" action="PodcastItemCancelAction" />-->
     </placeholder>
+    <placeholder name="AboveTrackProperties">
+        <menuitem action="EpisodePodcastProperties"/>
+    </placeholder>
   </popup>
 </ui>
diff --git a/src/Extensions/Makefile.am b/src/Extensions/Makefile.am
index d0c1509..18dc7ad 100644
--- a/src/Extensions/Makefile.am
+++ b/src/Extensions/Makefile.am
@@ -2,11 +2,11 @@ SUBDIRS = \
 	Banshee.AmazonMp3 \
 	Banshee.AmazonMp3.Store \
 	Banshee.Audiobook \
-	Banshee.AudioCd \
 	Banshee.BooScript \
 	Banshee.Bpm \
 	Banshee.CoverArt \
 	Banshee.Daap \
+	Banshee.Discs \
 	Banshee.Emusic \
 	Banshee.FileSystemQueue \
 	Banshee.InternetArchive \
diff --git a/src/Hyena b/src/Hyena
index fb14292..dd5de09 160000
--- a/src/Hyena
+++ b/src/Hyena
@@ -1 +1 @@
-Subproject commit fb142927329c2d784b10d9b22693a30b0ca9b555
+Subproject commit dd5de0988e14e0da67441044dea339eb7ac3a615
diff --git a/src/Libraries/Migo/Migo.Syndication/Feed.cs b/src/Libraries/Migo/Migo.Syndication/Feed.cs
index 0a0f38f..827d76d 100644
--- a/src/Libraries/Migo/Migo.Syndication/Feed.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Feed.cs
@@ -77,7 +77,7 @@ namespace Migo.Syndication
         }
 
         protected override int ModelVersion {
-            get { return 3; }
+            get { return 4; }
         }
 
         protected override void MigrateTable (int old_version)
@@ -91,6 +91,10 @@ namespace Migo.Syndication
             if (old_version < 3) {
                 CreateIndex ("PodcastSyndicationsIndex", "IsSubscribed, Title");
             }
+
+            if (old_version < 4) {
+                Connection.Execute (String.Format ("UPDATE {0} SET MaxItemCount=0 WHERE MaxItemCount=200", TableName));
+            }
         }
     }
 
@@ -129,7 +133,7 @@ namespace Migo.Syndication
         private string link;
         //private string local_enclosure_path;
         private long dbid = -1;
-        private long maxItemCount = 200;
+        private long maxItemCount = 0;
         private DateTime pubDate;
         private FeedSyncSetting syncSetting;
         private string title;
@@ -399,6 +403,7 @@ namespace Migo.Syndication
             }
 
             if (added_any) {
+               CheckForItemsToArchive ();
                Manager.OnFeedsChanged ();
                CheckForItemsToDownload ();
             }
@@ -556,6 +561,7 @@ namespace Migo.Syndication
         public void Save (bool notify)
         {
             Provider.Save (this);
+            CheckForItemsToArchive ();
 
             if (LastBuildDate > LastAutoDownload) {
                 CheckForItemsToDownload ();
@@ -566,6 +572,22 @@ namespace Migo.Syndication
             }
         }
 
+        private void CheckForItemsToArchive ()
+        {
+            if (MaxItemCount == 0)
+                return;
+
+            int i = 0;
+            foreach (var item in Items) {
+                if (!item.IsRead) {
+                    if (i++ >= MaxItemCount) {
+                        item.IsRead = true;
+                        item.Save (false);
+                    }
+                }
+            }
+        }
+
         private void CheckForItemsToDownload ()
         {
             if (LastDownloadError != FeedDownloadError.None || AutoDownload == FeedAutoDownload.None)
diff --git a/src/Libraries/Migo/Migo.Syndication/FeedItem.cs b/src/Libraries/Migo/Migo.Syndication/FeedItem.cs
index b56012a..89f6911 100644
--- a/src/Libraries/Migo/Migo.Syndication/FeedItem.cs
+++ b/src/Libraries/Migo/Migo.Syndication/FeedItem.cs
@@ -232,6 +232,11 @@ namespace Migo.Syndication
 
         public void Save ()
         {
+            Save (true);
+        }
+
+        internal void Save (bool notify)
+        {
             bool is_new = DbId < 1;
             Provider.Save (this);
             if (enclosure != null) {
diff --git a/src/Libraries/Migo/Migo.Syndication/FeedManager.cs b/src/Libraries/Migo/Migo.Syndication/FeedManager.cs
index 5724331..ab857cb 100644
--- a/src/Libraries/Migo/Migo.Syndication/FeedManager.cs
+++ b/src/Libraries/Migo/Migo.Syndication/FeedManager.cs
@@ -79,15 +79,20 @@ namespace Migo.Syndication
 
         public Feed CreateFeed (string url, FeedAutoDownload autoDownload)
         {
-            return CreateFeed (url, null, autoDownload, true);
+            return CreateFeed (url, autoDownload, 0);
         }
 
-        public Feed CreateFeed (string url, string title, FeedAutoDownload autoDownload)
+        public Feed CreateFeed (string url, FeedAutoDownload autoDownload, int max_items)
         {
-            return CreateFeed (url, title, autoDownload, true);
+            return CreateFeed (url, null, autoDownload, max_items, true);
         }
 
-        public Feed CreateFeed (string url, string title, FeedAutoDownload autoDownload, bool is_subscribed)
+        public Feed CreateFeed (string url, string title, FeedAutoDownload autoDownload, int max_items)
+        {
+            return CreateFeed (url, title, autoDownload, max_items, true);
+        }
+
+        public Feed CreateFeed (string url, string title, FeedAutoDownload autoDownload, int max_items, bool is_subscribed)
         {
             Feed feed = null;
             url = url.Trim ().TrimEnd ('/');
@@ -96,6 +101,7 @@ namespace Migo.Syndication
                 feed = new Feed (url, autoDownload);
                 feed.Title = title;
                 feed.IsSubscribed = is_subscribed;
+                feed.MaxItemCount = max_items;
                 feed.Save ();
                 feed.Update ();
             }
diff --git a/tests/test-a11y b/tests/test-a11y
index f4460cb..6b0b094 100755
--- a/tests/test-a11y
+++ b/tests/test-a11y
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 import os
 from time import sleep
 
diff --git a/tests/test-perf b/tests/test-perf
index de2c945..f00cae3 100755
--- a/tests/test-perf
+++ b/tests/test-perf
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 
 #
 # test-perf
