[SCM] cantata/master: Imported Upstream version 1.3.4.ds1

stuart at users.alioth.debian.org stuart at users.alioth.debian.org
Wed May 28 14:10:32 UTC 2014


The following commit has been merged in the master branch:
commit 76850b0146d1eadcf7f9c98d3ed322bc34e73b01
Author: Stuart Prescott <stuart at debian.org>
Date:   Tue May 13 23:46:06 2014 +1000

    Imported Upstream version 1.3.4.ds1

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9b16fe2..80290eb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,12 +6,12 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
 
 set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README")
 set(CPACK_GENERATOR "DEB;RPM;TBZ2")
-set(DEBIAN_PACKAGE_DESCRIPTION "Qt4/KDE4 Client for MPD")
+set(DEBIAN_PACKAGE_DESCRIPTION "Qt/KDE Client for MPD")
 set(DEBIAN_PACKAGE_SECTION "kde4")
 set(CPACK_SOURCE_GENERATOR "TBZ2")
 set(CPACK_PACKAGE_VERSION_MAJOR "1")
-set(CPACK_PACKAGE_VERSION_MINOR "2")
-set(CPACK_PACKAGE_VERSION_PATCH "2")
+set(CPACK_PACKAGE_VERSION_MINOR "3")
+set(CPACK_PACKAGE_VERSION_PATCH "4")
 set(CPACK_PACKAGE_VERSION_SPIN "")
 set(CPACK_PACKAGE_CONTACT "Craig Drummond <craig.p.drummond at gmail.com>")
 set(CANTATA_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
@@ -20,6 +20,7 @@ set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CANTATA_VERSION_FULL
 set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CANTATA_VERSION_FULL}${CPACK_PACKAGE_VERSION_SPIN}")
 set(CPACK_SOURCE_IGNORE_FILES  "/.svn/;CMakeLists.txt.user")
 include(CPack)
+include(MacroLogFeature)
 
 option(ENABLE_TAGLIB "Enable TagLib library (required for tag editing, replaygain calculation, device support, etc)" ON)
 option(ENABLE_TAGLIB_EXTRAS "Enable TagLib-Extras library (used by tag editing, replaygain calculation, device support, etc)" ON)
@@ -32,44 +33,92 @@ endif (WIN32)
 option(ENABLE_KDE "Enable KDE libraries" ON)
 option(ENABLE_KWALLET "Use KWallet in KDE builds" ON)
 option(ENABLE_QT5 "Build against Qt5" OFF)
-option(ENABLE_MTP "Enable MTP library (required to support MTP devices)" ON)
 option(ENABLE_FFMPEG "Enable ffmpeg/libav libraries (required for replaygain calculation)" ON)
 option(ENABLE_MPG123 "Enable mpg123 libraries (required for replaygain calculation)" ON)
 option(ENABLE_SPEEXDSP "Enable SpeexDSP libraries (used to speed-up replaygain calculation)" ON)
-option(ENABLE_UDISKS2 "Build UDisks2 backend, and NOT UDisks, for Qt builds" OFF)
-option(ENABLE_OVERLAYSCROLLBARS "Enable support for overlay style scrollbars when using QGtkStyle (Linux only - EXPERIMENTAL - NOT FULLY WORKING!)" OFF)
-option(ENABLE_CDPARANOIA "Enable CDParanoia libraries (required for AudioCD support)" ON)
-option(ENABLE_CDDB "Enable CDDB libraries (either this or MusicBrianz required for AudioCD support)" ON)
-option(ENABLE_MUSICBRAINZ "Enable MusicBrianz libraries (either this or CDDB required for AudioCD support)" ON)
 option(ENABLE_PROXY_CONFIG "Enable proxy config in settings dialog" OFF)
 option(ENABLE_EXTERNAL_TAGS "Enable usage of external app for reading/writing tags (EXPERIMENTAL - NOT FULLY WORKING)" OFF)
-option(ENABLE_UNCACHED_MTP "Open MTP devices in un-cached mode (faster)" ON)
+option(ENABLE_HTTP_SERVER "Enable internal HTTP server to play non-MPD files" ON)
+option(ENABLE_DYNAMIC "Enable support for dynamic playlists" ON)
+option(ENABLE_STREAMS "Enable support for streams tab (to save favourite streams, and search for others)" ON)
+option(ENABLE_ONLINE_SERVICES "Enable support for online services (Jamendo, Magnatune, SoundCloud, and Podcasts)" ON)
+
+if (WIN32 OR APPLE)
+    set(USE_SYSTEM_MENU_ICON OFF)
+else (WIN32 OR APPLE)
+    option(ENABLE_CDPARANOIA "Enable CDParanoia libraries (required for AudioCD support)" ON)
+    option(ENABLE_CDDB "Enable CDDB libraries (either this or MusicBrianz required for AudioCD support)" ON)
+    option(ENABLE_MUSICBRAINZ "Enable MusicBrianz libraries (either this or CDDB required for AudioCD support)" ON)
+    option(ENABLE_UDISKS2 "Build UDisks2 backend, and NOT UDisks, for Qt builds" OFF)
+    option(ENABLE_DEVICES_SUPPORT "Enable suport for external devices" ON)
+    option(ENABLE_REMOTE_DEVICES "Enable support for remote (sshfs, samba) devices EXPERIMENTAL" OFF)
+    option(ENABLE_MTP "Enable MTP library (required to support MTP devices)" ON)
+    option(ENABLE_UNCACHED_MTP "Open MTP devices in un-cached mode (faster)" ON)
+    option(USE_SYSTEM_MENU_ICON "Use system menu icon" ON)
+endif (WIN32 OR APPLE)
 
 if (ENABLE_QT5)
-    set(ENABLE_KDE FALSE)
+    set(ENABLE_KDE OFF)
 endif (ENABLE_QT5)
 
-if (ENABLE_UDISKS2)
+if (NOT ENABLE_KDE)
+   set(ENABLE_KWALLET OFF)
+endif (NOT ENABLE_KDE)
+
+if (NOT WIN32 AND NOT APPLE AND ENABLE_DEVICES_SUPPORT AND ENABLE_UDISKS2)
     set(WITH_SOLID_UDISKS2 ON)
-endif (ENABLE_UDISKS2)
+endif (NOT WIN32 AND NOT APPLE AND ENABLE_DEVICES_SUPPORT AND ENABLE_UDISKS2)
+
+if (NOT CMAKE_BUILD_TYPE)
+    set(CMAKE_BUILD_TYPE "Release")
+    message("-- Set build type to ${CMAKE_BUILD_TYPE}")
+endif (NOT CMAKE_BUILD_TYPE)
+
+if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+    if (ENABLE_KDE)
+        find_program(KDE4_KDECONFIG_EXECUTABLE NAMES kde4-config
+                     PATHS ${CMAKE_INSTALL_PREFIX}/bin ${_KDEDIRS} /opt/kde4/bin NO_DEFAULT_PATH)
+        if (NOT KDE4_KDECONFIG_EXECUTABLE)
+           find_program(KDE4_KDECONFIG_EXECUTABLE NAMES kde4-config )
+        endif (NOT KDE4_KDECONFIG_EXECUTABLE)
+        if (KDE4_KDECONFIG_EXECUTABLE)
+            exec_program(${KDE4_KDECONFIG_EXECUTABLE} ARGS --prefix OUTPUT_VARIABLE CMAKE_INSTALL_PREFIX)
+            message("-- Set install prefix to ${CMAKE_INSTALL_PREFIX}")
+        endif (KDE4_KDECONFIG_EXECUTABLE)
+    elseif (NOT APPLE AND NOT WIN32)
+        set(CMAKE_INSTALL_PREFIX "/usr")
+        message("-- Set install prefix to ${CMAKE_INSTALL_PREFIX}")
+    endif (ENABLE_KDE)
+endif (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+
+if (NOT ENABLE_QT5 AND NOT APPLE AND NOT WIN32)
+    find_package(X11)
+    if (X11_FOUND)
+        include_directories(${X11_INCLUDE_DIR})
+    endif (X11_FOUND)
+endif (NOT ENABLE_QT5 AND NOT APPLE AND NOT WIN32)
 
 if (ENABLE_TAGLIB)
     set(TAGLIB_MIN_VERSION "1.6")
     find_package(Taglib)
+    macro_log_feature(TAGLIB_FOUND "TagLib" "Tag editor, file organiser, etc." "http://taglib.github.io/")
 endif (ENABLE_TAGLIB)
 
 if (TAGLIB_FOUND)
-    if (ENABLE_CDPARANOIA)
+    if (NOT WIN32 AND NOT APPLE AND ENABLE_DEVICES_SUPPORT AND ENABLE_CDPARANOIA)
         find_package(Cdparanoia)
+        macro_log_feature(CDPARANOIA_FOUND "libcdda_paranoia" "CD ripping." "http://www.xiph.org/paranoia")
         if (CDPARANOIA_FOUND)
             if (ENABLE_CDDB)
                 find_package(CDDB)
+                macro_log_feature(CDDB_FOUND "libcddb" "CD info retrieval via CDDB." "http://libcddb.sourceforge.net")
             endif (ENABLE_CDDB)
             if (ENABLE_MUSICBRAINZ)
                 find_package(MusicBrainz5)
+                macro_log_feature(MUSICBRAINZ5_FOUND "libmusicbrainz5" "CD info retrieval via MusicBrainz." "http://musicbrainz.org/doc/libmusicbrainz")
             endif (ENABLE_MUSICBRAINZ)
         endif (CDPARANOIA_FOUND)
-    endif (ENABLE_CDPARANOIA)
+    endif (NOT WIN32 AND NOT APPLE AND ENABLE_DEVICES_SUPPORT AND ENABLE_CDPARANOIA)
 
     set(ENABLE_TAGEDITOR_SUPPORT 1)
     set(ENABLE_TRACKORGANIZER_SUPPORT 1)
@@ -80,14 +129,12 @@ if (TAGLIB_FOUND)
     check_cxx_source_compiles("#include <asftag.h>
                             int main() { TagLib::ASF::Tag tag; return 0;}" TAGLIB_ASF_FOUND)
     if (NOT TAGLIB_ASF_FOUND)
-    #    message(FATAL_ERROR "TagLib does not have ASF support compiled in.")
         message("TagLib does not have ASF support compiled in.")
     endif (NOT TAGLIB_ASF_FOUND)
 
     check_cxx_source_compiles("#include <mp4tag.h>
                             int main() { TagLib::MP4::Tag tag(0, 0); return 0;}" TAGLIB_MP4_FOUND)
     if (NOT TAGLIB_MP4_FOUND)
-    #    message(FATAL_ERROR "TagLib does not have MP4 support compiled in.")
         message("TagLib does not have MP4 support compiled in.")
     endif (NOT TAGLIB_MP4_FOUND)
 
@@ -97,6 +144,7 @@ if (TAGLIB_FOUND)
     set(TAGLIB-EXTRAS_MIN_VERSION "1.0")
     if (ENABLE_TAGLIB_EXTRAS)
         find_package(Taglib-Extras)
+        macro_log_feature(TAGLIB-EXTRAS_FOUND "TagLib-Extras" "Tag editor, file organiser, etc." "http://taglib.github.io/")
     endif (ENABLE_TAGLIB_EXTRAS)
     set(TAGLIB_EXTRAS_FOUND ${TAGLIB-EXTRAS_FOUND}) # we need a c-compatible name for the include file
 
@@ -111,23 +159,32 @@ if (TAGLIB_FOUND)
 
     if (ENABLE_FFMPEG)
         find_package(FFMPEG)
+        macro_log_feature(FFMPEG_FOUND "libavcodec" "ReplayGain calculation." "http://ffmpeg.org")
     endif (ENABLE_FFMPEG)
     if (ENABLE_MPG123)
         find_package(MPG123)
+        macro_log_feature(MPG123_FOUND "libmpg123" "ReplayGain calculation." "http://www.mpg123.de")
     endif (ENABLE_MPG123)
     if (ENABLE_SPEEXDSP AND (FFMPEG_FOUND OR MPG123_FOUND))
         find_package(SPEEXDSP)
+        macro_log_feature(SPEEXDSP_FOUND "SpeexDSP" "Used to speedup/improve ReplayGain calculation." "http://www.speex.org")
     endif (ENABLE_SPEEXDSP AND (FFMPEG_FOUND OR MPG123_FOUND))
-    if (ENABLE_MTP AND NOT WIN32 AND NOT APPLE)
+    if (ENABLE_MTP AND ENABLE_DEVICES_SUPPORT AND NOT WIN32 AND NOT APPLE)
         find_package(Mtp)
-    endif (ENABLE_MTP AND NOT WIN32 AND NOT APPLE)
+        macro_log_feature(MTP_FOUND "libmtp" "MTP Device Support." "http://libmtp.sourceforge.net")
+    endif (ENABLE_MTP AND ENABLE_DEVICES_SUPPORT AND NOT WIN32 AND NOT APPLE)
 endif (TAGLIB_FOUND)
 
+if (NOT MTP_FOUND)
+   set(ENABLE_UNCACHED_MTP OFF)
+endif (NOT MTP_FOUND)
+
 if (ENABLE_QT5)
     find_package(Qt5Widgets REQUIRED)
     find_package(Qt5Xml REQUIRED)
     find_package(Qt5Network REQUIRED)
     find_package(Qt5Concurrent REQUIRED)
+    find_package(Qt5Svg REQUIRED) # Only actually required for SVG icons...
     set(QTCORELIBS ${Qt5Core_LIBRARIES})
     set(QTNETWORKLIBS ${Qt5Network_LIBRARIES})
     set(QTGUILIBS ${Qt5Gui_LIBRARIES})
@@ -136,6 +193,7 @@ if (ENABLE_QT5)
     add_definitions(${Qt5Widgets_DEFINITIONS} ${Qt5Network_DEFINITIONS} ${Qt5Xml_DEFINITIONS} ${Qt5Concurrent_DEFINITIONS})
     set(CMAKE_CXX_FLAGS "${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
     find_package(Qt5DBus)
+    macro_log_feature(Qt5DBus_FOUND "Qt5DBus" "DBus support." "http://qtproject.org")
     if (Qt5DBus_FOUND)
         set(QT_QTDBUS_FOUND 1) # required for config.h !!!
         set(QTLIBS ${QTLIBS} ${Qt5DBus_LIBRARIES})
@@ -143,11 +201,11 @@ if (ENABLE_QT5)
         add_definitions(${Qt5DBus_DEFINITIONS})
     endif (Qt5DBus_FOUND)
 else (ENABLE_QT5)
-    find_package(Qt4 REQUIRED QtCore QtGui QtXml QtNetwork)
+    find_package(Qt4 REQUIRED QtCore QtGui QtXml QtNetwork QtSvg)  # SVG only actually required for SVG icons...
     set(QTCORELIBS ${QT_QTCORE_LIBRARY})
     set(QTNETWORKLIBS ${QT_QTNETWORK_LIBRARY})
     set(QTGUILIBS ${QT_QTGUI_LIBRARY})
-    set(QTLIBS ${QT_QTSVG_LIBRARY} ${QT_QTXML_LIBRARY} ${QTCORELIBS} ${QTGUILIBS} ${QTNETWORKLIBS})
+    set(QTLIBS ${QT_QTXML_LIBRARY} ${QTCORELIBS} ${QTGUILIBS} ${QTNETWORKLIBS})
     if (QT_QTDBUS_FOUND)
         set(QTLIBS ${QTLIBS} ${QT_QTDBUS_LIBRARY})
     endif (QT_QTDBUS_FOUND)
@@ -158,11 +216,13 @@ endif (ENABLE_QT5)
 if (ENABLE_HTTP_STREAM_PLAYBACK)
     if (ENABLE_QT5)
         find_package(Qt5Multimedia REQUIRED)
+        macro_log_feature(Qt5Multimedia "Qt5Multimedia" "MPD HTTP stream playback." "http://qtproject.org")
         set(QTLIBS ${QTLIBS} ${Qt5Multimedia_LIBRARIES})
         set(QTINCLUDES ${QTINCLUDES} ${Qt5Multimedia_INCLUDES})
         add_definitions(${Qt5Multimedia_DEFINITIONS})
     else (ENABLE_QT5)
         find_package(Phonon REQUIRED)
+        macro_log_feature(PHONON_FOUND "Phonon" "MPD HTTP stream playback." "http://phonon.kde.org")
     endif (ENABLE_QT5)
 endif (ENABLE_HTTP_STREAM_PLAYBACK)
 
@@ -178,15 +238,11 @@ endif (NOT ENABLE_QT5 AND NOT WIN32 AND NOT APPLE)
 
 find_package(ZLIB REQUIRED)
 
-if (ENABLE_OVERLAYSCROLLBARS)
-    add_definitions(-DENABLE_OVERLAYSCROLLBARS)
-endif (ENABLE_OVERLAYSCROLLBARS)
-
 include_directories(${CMAKE_SOURCE_DIR}/gui ${CMAKE_SOURCE_DIR}/mpd ${CMAKE_SOURCE_DIR}/models ${CMAKE_SOURCE_DIR}/widgets
-                     ${CMAKE_SOURCE_DIR}/network ${CMAKE_SOURCE_DIR}/dbus ${CMAKE_SOURCE_DIR}/http
-                     ${CMAKE_SOURCE_DIR}/devices ${CMAKE_SOURCE_DIR}/dynamic ${CMAKE_SOURCE_DIR}/support ${CMAKE_SOURCE_DIR}/streams
-                     ${CMAKE_SOURCE_DIR}/tags ${CMAKE_SOURCE_DIR}/online ${CMAKE_SOURCE_DIR}/context ${CMAKE_BINARY_DIR}/support
-                     ${CMAKE_SOURCE_DIR}/3rdparty ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR})
+                    ${CMAKE_SOURCE_DIR}/network ${CMAKE_SOURCE_DIR}/dbus ${CMAKE_SOURCE_DIR}/http
+                    ${CMAKE_SOURCE_DIR}/devices ${CMAKE_SOURCE_DIR}/dynamic ${CMAKE_SOURCE_DIR}/support ${CMAKE_SOURCE_DIR}/streams
+                    ${CMAKE_SOURCE_DIR}/tags ${CMAKE_SOURCE_DIR}/online ${CMAKE_SOURCE_DIR}/context ${CMAKE_BINARY_DIR}/support
+                    ${CMAKE_SOURCE_DIR}/3rdparty ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR})
 
 # QJSon and MusicBrainz require exceptions to be enabled!
 if (CMAKE_COMPILER_IS_GNUCXX)
@@ -202,28 +258,22 @@ endif (MSVC)
 set(CANTATA_SRCS gui/application.cpp gui/main.cpp gui/initialsettingswizard.cpp gui/mainwindow.cpp gui/preferencesdialog.cpp
     gui/settings.cpp gui/covers.cpp gui/filesettings.cpp gui/interfacesettings.cpp gui/playbacksettings.cpp 
     gui/serversettings.cpp gui/librarypage.cpp gui/albumspage.cpp gui/folderpage.cpp gui/playlistspage.cpp gui/trayitem.cpp
-    gui/cachesettings.cpp gui/coverdialog.cpp gui/stdactions.cpp
-    streams/streamspage.cpp streams/streamdialog.cpp streams/streamfetcher.cpp streams/digitallyimportedsettings.cpp
-    streams/streamssettings.cpp streams/tar.cpp
+    gui/cachesettings.cpp gui/coverdialog.cpp gui/stdactions.cpp gui/searchpage.cpp
     models/musiclibraryitemroot.cpp models/musiclibraryitemartist.cpp models/musiclibraryitemalbum.cpp models/musiclibrarymodel.cpp
     models/musiclibraryproxymodel.cpp models/playlistsmodel.cpp models/playlistsproxymodel.cpp models/playqueuemodel.cpp
     models/playqueueproxymodel.cpp models/dirviewmodel.cpp models/dirviewproxymodel.cpp models/dirviewitem.cpp models/dirviewitemdir.cpp
-    models/streamsmodel.cpp models/streamsproxymodel.cpp models/albumsmodel.cpp models/albumsproxymodel.cpp models/proxymodel.cpp
-    models/actionmodel.cpp models/digitallyimported.cpp models/streamsearchmodel.cpp models/musiclibraryitem.cpp models/musicmodel.cpp
-    models/multimusicmodel.cpp models/onlineservicesmodel.cpp models/musiclibraryitempodcast.cpp
-    online/onlineservicespage.cpp online/onlineservice.cpp online/jamendoservice.cpp online/jamendosettingsdialog.cpp
-    online/magnatuneservice.cpp online/magnatunesettingsdialog.cpp online/soundcloudservice.cpp online/podcastservice.cpp
-    online/rssparser.cpp online/opmlparser.cpp online/podcastsearchdialog.cpp online/onlinesettings.cpp online/podcastsettingsdialog.cpp
+    models/albumsmodel.cpp models/albumsproxymodel.cpp models/proxymodel.cpp models/actionmodel.cpp models/musiclibraryitem.cpp
+    models/musicmodel.cpp models/multimusicmodel.cpp models/searchmodel.cpp models/streamsmodel.cpp models/searchproxymodel.cpp
     mpd/mpdconnection.cpp mpd/mpdparseutils.cpp mpd/mpdstats.cpp mpd/mpdstatus.cpp mpd/song.cpp mpd/mpduser.cpp mpd/cuefile.cpp
-    dynamic/dynamic.cpp dynamic/dynamicpage.cpp dynamic/dynamicproxymodel.cpp dynamic/dynamicruledialog.cpp dynamic/dynamicrulesdialog.cpp
+    streams/streamfetcher.cpp
     widgets/treeview.cpp widgets/listview.cpp widgets/itemview.cpp widgets/autohidingsplitter.cpp widgets/timeslider.cpp
     widgets/actionlabel.cpp widgets/playqueueview.cpp widgets/groupedview.cpp widgets/actionitemdelegate.cpp widgets/textbrowser.cpp
-    widgets/coverwidget.cpp widgets/volumeslider.cpp widgets/icons.cpp widgets/genrecombo.cpp widgets/toolbar.cpp widgets/menubutton.cpp
+    widgets/coverwidget.cpp widgets/volumeslider.cpp widgets/icons.cpp widgets/genrecombo.cpp widgets/menubutton.cpp
     widgets/toolbutton.cpp widgets/wizardpage.cpp widgets/statuslabel.cpp widgets/searchwidget.cpp widgets/messageoverlay.cpp
     widgets/basicitemdelegate.cpp widgets/sizegrip.cpp widgets/sizewidget.cpp widgets/servicestatuslabel.cpp widgets/spacerwidget.cpp
-    widgets/songdialog.cpp
+    widgets/songdialog.cpp widgets/stretchheaderview.cpp widgets/tableview.cpp
     network/networkaccessmanager.cpp network/networkproxyfactory.cpp
-    http/httpserversettings.cpp http/httpserver.cpp http/httpsocket.cpp
+    http/httpserver.cpp
     devices/deviceoptions.cpp
     context/lyricsettings.cpp context/ultimatelyricsprovider.cpp context/ultimatelyrics.cpp context/lyricsdialog.cpp
     context/contextwidget.cpp context/view.cpp context/artistview.cpp context/albumview.cpp context/songview.cpp context/contextengine.cpp
@@ -232,34 +282,64 @@ set(CANTATA_SRCS gui/application.cpp gui/main.cpp gui/initialsettingswizard.cpp
 set(CANTATA_MOC_HDRS
     gui/initialsettingswizard.h gui/mainwindow.h gui/settings.h gui/covers.h gui/folderpage.h gui/librarypage.h gui/albumspage.h
     gui/playlistspage.h gui/playbacksettings.h gui/serversettings.h gui/preferencesdialog.h gui/filesettings.h
-    gui/interfacesettings.h gui/cachesettings.h gui/trayitem.h gui/coverdialog.h
-    streams/streamspage.h streams/streamdialog.h streams/streamfetcher.h streams/digitallyimportedsettings.h streams/streamssettings.h
+    gui/interfacesettings.h gui/cachesettings.h gui/trayitem.h gui/coverdialog.h gui/searchpage.h
     models/musiclibrarymodel.h models/musiclibraryproxymodel.h models/playlistsmodel.h models/playlistsproxymodel.h models/playqueuemodel.h
-    models/playqueueproxymodel.h models/dirviewmodel.h models/dirviewproxymodel.h models/albumsmodel.h models/streamsmodel.h
-    models/actionmodel.h models/digitallyimported.h models/streamsearchmodel.h models/multimusicmodel.h models/onlineservicesmodel.h
-    online/onlineservice.h online/onlineservicespage.h online/jamendoservice.h online/magnatuneservice.h
-    online/magnatunesettingsdialog.h online/magnatuneservice.h online/magnatunesettingsdialog.h online/soundcloudservice.h
-    online/podcastservice.h online/podcastsearchdialog.h online/podcastsettingsdialog.h online/onlinesettings.h
-    mpd/mpdconnection.h mpd/mpdstats.h mpd/mpdstatus.h
-    dynamic/dynamic.h dynamic/dynamicpage.h dynamic/dynamicruledialog.h dynamic/dynamicrulesdialog.h
+    models/playqueueproxymodel.h models/dirviewmodel.h models/dirviewproxymodel.h models/albumsmodel.h models/actionmodel.h
+    models/multimusicmodel.h models/searchmodel.h mpd/mpdconnection.h mpd/mpdstats.h mpd/mpdstatus.h
+    streams/streamfetcher.h
     widgets/treeview.h widgets/listview.h widgets/itemview.h widgets/autohidingsplitter.h widgets/timeslider.h widgets/actionlabel.h
     widgets/playqueueview.h widgets/groupedview.h widgets/actionitemdelegate.h widgets/coverwidget.h widgets/volumeslider.h
-    widgets/genrecombo.h widgets/toolbar.h widgets/searchwidget.h widgets/messageoverlay.h widgets/servicestatuslabel.h
+    widgets/genrecombo.h widgets/searchwidget.h widgets/messageoverlay.h widgets/servicestatuslabel.h widgets/stretchheaderview.h
+    widgets/tableview.h
     network/networkaccessmanager.h
-    http/httpserversettings.h http/httpsocket.h
     context/togglelist.h context/ultimatelyrics.h context/ultimatelyricsprovider.h context/lyricsdialog.h
     context/contextwidget.h context/artistview.h context/albumview.h context/songview.h context/view.h context/contextengine.h
     context/wikipediaengine.h context/wikipediasettings.h context/othersettings.h context/lastfmengine.h context/metaengine.h
     context/backdropcreator.h)
 set(CANTATA_UIS
     gui/initialsettingswizard.ui gui/mainwindow.ui gui/folderpage.ui gui/librarypage.ui gui/albumspage.ui gui/playlistspage.ui
-    gui/filesettings.ui gui/interfacesettings.ui gui/playbacksettings.ui gui/serversettings.ui gui/coverdialog.ui
-    streams/streamspage.ui streams/digitallyimportedsettings.ui streams/streamssettings.ui
-    dynamic/dynamicpage.ui dynamic/dynamicrule.ui dynamic/dynamicrules.ui
+    gui/filesettings.ui gui/interfacesettings.ui gui/playbacksettings.ui gui/serversettings.ui gui/coverdialog.ui gui/searchpage.ui
     context/togglelist.ui context/othersettings.ui
-    widgets/itemview.ui
-    http/httpserversettings.ui
-    online/onlineservicespage.ui online/onlinesettings.ui)
+    widgets/itemview.ui)
+
+if (ENABLE_DYNAMIC)
+    set(CANTATA_SRCS ${CANTATA_SRCS} dynamic/dynamic.cpp dynamic/dynamicpage.cpp dynamic/dynamicproxymodel.cpp
+        dynamic/dynamicruledialog.cpp dynamic/dynamicrulesdialog.cpp)
+    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} dynamic/dynamic.h dynamic/dynamicpage.h dynamic/dynamicruledialog.h
+        dynamic/dynamicrulesdialog.h)
+    set(CANTATA_UIS ${CANTATA_UIS} dynamic/dynamicpage.ui dynamic/dynamicrule.ui dynamic/dynamicrules.ui)
+endif (ENABLE_DYNAMIC)
+
+if (ENABLE_STREAMS)
+    set(CANTATA_SRCS ${CANTATA_SRCS} streams/streamspage.cpp streams/digitallyimportedsettings.cpp streams/streamssettings.cpp
+        streams/streamdialog.cpp streams/tar.cpp models/streamsproxymodel.cpp models/streamsearchmodel.cpp models/digitallyimported.cpp)
+    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} streams/streamspage.h streams/digitallyimportedsettings.h
+        streams/streamssettings.h streams/streamdialog.h models/streamsmodel.h models/digitallyimported.h models/streamsearchmodel.h)
+    set(CANTATA_UIS ${CANTATA_UIS} streams/streamspage.ui streams/digitallyimportedsettings.ui streams/streamssettings.ui)
+endif (ENABLE_STREAMS)
+
+if (ENABLE_ONLINE_SERVICES)
+    set(CANTATA_SRCS ${CANTATA_SRCS} online/onlineservicespage.cpp online/onlineservice.cpp online/jamendoservice.cpp
+        online/jamendosettingsdialog.cpp online/magnatuneservice.cpp online/magnatunesettingsdialog.cpp online/soundcloudservice.cpp
+        online/podcastservice.cpp online/rssparser.cpp online/opmlparser.cpp online/podcastsearchdialog.cpp online/onlinesettings.cpp
+        online/podcastsettingsdialog.cpp models/onlineservicesmodel.cpp models/musiclibraryitempodcast.cpp)
+    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} online/onlineservice.h online/onlineservicespage.h online/jamendoservice.h
+        online/magnatuneservice.h online/magnatunesettingsdialog.h online/magnatuneservice.h online/magnatunesettingsdialog.h
+        online/soundcloudservice.h online/podcastservice.h online/podcastsearchdialog.h online/podcastsettingsdialog.h
+        online/onlinesettings.h models/onlineservicesmodel.h)
+    set(CANTATA_UIS ${CANTATA_UIS} online/onlineservicespage.ui online/onlinesettings.ui)
+endif (ENABLE_ONLINE_SERVICES)
+
+if (ENABLE_HTTP_SERVER)
+    set(CANTATA_SRCS ${CANTATA_SRCS} http/httpserversettings.cpp http/httpsocket.cpp)
+    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} http/httpserver.h http/httpsocket.h)
+    set(CANTATA_UIS ${CANTATA_UIS} http/httpserversettings.ui)
+endif (ENABLE_HTTP_SERVER)
+
+if (ENABLE_HTTP_STREAM_PLAYBACK)
+    set(CANTATA_SRCS ${CANTATA_SRCS} mpd/httpstream.cpp)
+    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} mpd/httpstream.h)
+endif (ENABLE_HTTP_STREAM_PLAYBACK)
 
 if (ENABLE_MODEL_TEST AND NOT ENABLE_KDE AND NOT ENABLE_QT5)
     set(QTLIBS ${QTLIBS} ${QT_QTTEST_LIBRARY})
@@ -317,7 +397,19 @@ if (NOT WIN32 AND NOT APPLE)
     set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} devices/mountpoints.h)
 endif (NOT WIN32 AND NOT APPLE)
 
+if (WIN32 OR APPLE OR NOT TAGLIB_FOUND)
+    set(ENABLE_DEVICES_SUPPORT OFF)
+    set(ENABLE_REMOTE_DEVICES OFF)
+endif (WIN32 OR APPLE OR NOT TAGLIB_FOUND)
+
 set(CANTATA_RCS cantata.qrc)
+if (NOT WIN32 AND NOT APPLE)
+    set(CANTATA_RCS ${CANTATA_RCS} cantata_media.qrc)
+endif (NOT WIN32 AND NOT APPLE)
+
+if (USE_SYSTEM_MENU_ICON)
+    set(CANTATA_RCS ${CANTATA_RCS} cantata_menu.qrc)
+endif (USE_SYSTEM_MENU_ICON)
 
 if (TAGLIB_FOUND)
     set(CANTATA_SRCS ${CANTATA_SRCS}
@@ -345,10 +437,9 @@ if (TAGLIB_FOUND)
         set(CANTATA_SRCS ${CANTATA_SRCS} tags/tags.cpp tags/filetyperesolver.cpp)
     endif (ENABLE_EXTERNAL_TAGS)
 
-    if (WIN32 OR APPLE)
+    if (WIN32 OR APPLE OR NOT ENABLE_DEVICES_SUPPORT)
         set(CANTATA_SRCS ${CANTATA_SRCS} devices/device.cpp)
     else (WIN32 OR APPLE)
-        set(ENABLE_DEVICES_SUPPORT 1)
         if (NOT ENABLE_KDE)
             add_subdirectory(3rdparty/solid-lite)
         endif (NOT ENABLE_KDE)
@@ -373,7 +464,7 @@ if (TAGLIB_FOUND)
         endif (CDDB_FOUND OR MUSICBRAINZ5_FOUND)
 
         set(CANTATA_SRCS ${CANTATA_SRCS} devices/devicespage.cpp devices/filejob.cpp
-                devices/device.cpp devices/fsdevice.cpp devices/umsdevice.cpp
+                devices/device.cpp devices/fsdevice.cpp devices/umsdevice.cpp devices/splitlabelwidget.cpp
                 models/devicesmodel.cpp devices/actiondialog.cpp devices/devicepropertieswidget.cpp
                 devices/devicepropertiesdialog.cpp devices/encoders.cpp devices/freespaceinfo.cpp
                 devices/transcodingjob.cpp devices/valueslider.cpp devices/syncdialog.cpp devices/synccollectionwidget.cpp
@@ -400,7 +491,7 @@ if (TAGLIB_FOUND)
             add_subdirectory(devices/mounter)
             add_subdirectory(devices/avahi)
         endif (ENABLE_REMOTE_DEVICES)
-    endif (WIN32 OR APPLE)
+    endif (WIN32 OR APPLE OR NOT ENABLE_DEVICES_SUPPORT)
 endif (TAGLIB_FOUND)
 
 if (ENABLE_PROXY_CONFIG)
@@ -421,7 +512,7 @@ if (ENABLE_KDE)
     qt4_add_resources(CANTATA_RC_SRCS ${CANTATA_RCS})
     kde4_add_ui_files(CANTATA_UI_HDRS ${CANTATA_UIS})
     kde4_add_executable(cantata ${CANTATA_SRCS} ${CANTATA_MOC_SRCS} ${CANTATA_RC_SRCS} ${CANTATA_UI_HDRS})
-    target_link_libraries(cantata ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBS} ${KDE4_SOLID_LIBS} ${KDE4_KIO_LIBRARY} X11)
+    target_link_libraries(cantata ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBS} ${KDE4_SOLID_LIBS} ${KDE4_KIO_LIBRARY})
     if (NOT WIN32 AND NOT APPLE AND TAGLIB_FOUND AND ENABLE_REMOTE_DEVICES)
         target_link_libraries(cantata ${KDE4_KFILE_LIBS})
     endif (NOT WIN32 AND NOT APPLE AND TAGLIB_FOUND AND ENABLE_REMOTE_DEVICES)
@@ -497,11 +588,12 @@ else (ENABLE_KDE)
     if (WIN32 OR APPLE OR NOT ENABLE_QT5)
         target_link_libraries(cantata qxt)
     endif (WIN32 OR APPLE OR NOT ENABLE_QT5)
-    if (NOT ENABLE_QT5 AND NOT APPLE AND NOT WIN32)
-        target_link_libraries(cantata X11)
-    endif (NOT ENABLE_QT5 AND NOT APPLE AND NOT WIN32)
 endif (ENABLE_KDE)
 
+if (X11_FOUND)
+    target_link_libraries(cantata ${X11_LIBRARIES})
+endif (X11_FOUND)
+
 if (ENABLE_HTTP_STREAM_PLAYBACK AND NOT ENABLE_QT5)
     target_link_libraries(cantata ${PHONON_LIBS})
     include_directories(${PHONON_INCLUDES})
@@ -510,7 +602,9 @@ endif (ENABLE_HTTP_STREAM_PLAYBACK AND NOT ENABLE_QT5)
 if (WIN32 OR APPLE)
     # install(FILES mpd/mpd.conf.template DESTINATION ${CMAKE_INSTALL_PREFIX}/mpd)
 else (WIN32 OR APPLE)
-    install(PROGRAMS dynamic/cantata-dynamic DESTINATION ${CMAKE_INSTALL_PREFIX}/share/${CMAKE_PROJECT_NAME}/scripts)
+    if (ENABLE_DYNAMIC)
+        install(PROGRAMS dynamic/cantata-dynamic DESTINATION ${CMAKE_INSTALL_PREFIX}/share/${CMAKE_PROJECT_NAME}/scripts)
+    endif (ENABLE_DYNAMIC)
     install(FILES mpd/mpd.conf.template DESTINATION ${CMAKE_INSTALL_PREFIX}/share/${CMAKE_PROJECT_NAME}/mpd)
 
     if (MTP_FOUND)
@@ -527,7 +621,7 @@ else (WIN32 OR APPLE)
         endif (CDDB_FOUND)
         if (MUSICBRAINZ5_FOUND)
             target_link_libraries(cantata ${MUSICBRAINZ5_LIBRARIES})
-            include_directories(${MUSICBRAINZ5_INCLUDE_DIR})
+            include_directories(${MUSICBRAINZ5_INCLUDE_DIRS})
         endif (MUSICBRAINZ5_FOUND)
         if (ENABLE_KDE)
             install(FILES cantata-play-audiocd.desktop DESTINATION ${DATA_INSTALL_DIR}/solid/actions)
@@ -560,9 +654,9 @@ if (TAGLIB_FOUND)
             include_directories(${TAGLIB-EXTRAS_INCLUDES})
         endif (TAGLIB-EXTRAS_FOUND)
     endif (NOT ENABLE_EXTERNAL_TAGS)
-    if (NOT ENABLE_KDE AND NOT WIN32 AND NOT APPLE)
+    if (NOT ENABLE_KDE AND ENABLE_DEVICES_SUPPORT AND NOT WIN32 AND NOT APPLE)
         target_link_libraries(cantata solidlite)
-    endif (NOT ENABLE_KDE AND NOT WIN32 AND NOT APPLE)
+    endif (NOT ENABLE_KDE AND ENABLE_DEVICES_SUPPORT AND NOT WIN32 AND NOT APPLE)
     if (ENABLE_REMOTE_DEVICES AND NOT WIN32 AND NOT APPLE)
         target_link_libraries(cantata avahi)
     endif (ENABLE_REMOTE_DEVICES AND NOT WIN32 AND NOT APPLE)
@@ -573,117 +667,71 @@ add_definitions(-DQT_NO_DEBUG_OUTPUT)
 
 if (UNIX AND NOT APPLE)
     install(FILES cantata.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})
+    target_link_libraries(cantata -lpthread)
 endif (UNIX AND NOT APPLE)
 
 configure_file(config.h.cmake ${CMAKE_BINARY_DIR}/config.h)
 
-message("")
 if (ENABLE_KDE)
-    message("INFO: Building KDE version")
+    message("-- Building KDE version")
 else (ENABLE_KDE)
-    if (NOT WIN32)
-        if (ENABLE_QT5)
-            message("INFO: Building Qt5 version")
-        else (ENABLE_QT5)
-            message("INFO: Building Qt4 version")
-        endif (ENABLE_QT5)
-    endif (NOT WIN32)
+    if (ENABLE_QT5)
+        message("-- Building Qt5 version")
+    else (ENABLE_QT5)
+        message("-- Building Qt4 version")
+    endif (ENABLE_QT5)
 endif (ENABLE_KDE)
 
-if (TAGLIB_FOUND)
-
-    if (CDDB_FOUND OR MUSICBRAINZ5_FOUND)
-        set(AUDIOCD_SUPPORT 1)
-    endif (CDDB_FOUND OR MUSICBRAINZ5_FOUND)
-
-    if (ENABLE_REMOTE_DEVICES OR ENABLE_HTTP_STREAM_PLAYBACK OR AUDIOCD_SUPPORT OR MTP_FOUND OR ENABLE_PROXY_CONFIG OR ENABLE_REPLAYGAIN_SUPPORT)
-        message("      Extra enabled features:")
-        if (MTP_FOUND)
-            message("        - MTP device sync")
-        endif (MTP_FOUND)
-        if (CDDB_FOUND OR MUSICBRAINZ5_FOUND)
-            message("        - AudioCD")
-        endif (CDDB_FOUND OR MUSICBRAINZ5_FOUND)
-        if (ENABLE_REMOTE_DEVICES)
-            message("        - Remote device sync (EXPERIMENTAL)")
-        endif (ENABLE_REMOTE_DEVICES)
-        if (ENABLE_HTTP_STREAM_PLAYBACK)
-            message("        - MPD HTTP stream playback")
-        endif (ENABLE_HTTP_STREAM_PLAYBACK)
-        if (ENABLE_REPLAYGAIN_SUPPORT)
-            message("        - ReplayGain calculation")
-        endif (ENABLE_REPLAYGAIN_SUPPORT)
-        if (ENABLE_PROXY_CONFIG)
-            message("        - Proxy configuration")
-        endif (ENABLE_PROXY_CONFIG)
-    endif (ENABLE_REMOTE_DEVICES OR ENABLE_HTTP_STREAM_PLAYBACK OR AUDIOCD_SUPPORT OR MTP_FOUND OR ENABLE_PROXY_CONFIG OR ENABLE_REPLAYGAIN_SUPPORT)
-    
-    if (NOT TAGLIB_FOUND OR NOT MTP_FOUND OR NOT AUDIOCD_SUPPORT OR NOT ENABLE_REPLAYGAIN_SUPPORT OR NOT ENABLE_HTTP_STREAM_PLAYBACK OR NOT ENABLE_REMOTE_DEVICES OR (NOT ENABLE_PROXY_CONFIG AND NOT ENABLE_KDE))
-        message("      Disabled features:")
-        if (NOT ENABLE_HTTP_STREAM_PLAYBACK)
-            message("        - MPD HTTP stream playback (Phonon required for Qt4, QtMultiMedia for Qt5)")
-        endif (NOT ENABLE_HTTP_STREAM_PLAYBACK)
-        if (NOT MTP_FOUND AND NOT WIN32 AND NOT APPLE)
-            message("        - MTP device sync (taglib and libmtp required)")
-        endif (NOT MTP_FOUND AND NOT WIN32 AND NOT APPLE)
-        if (NOT AUDIOCD_SUPPORT AND NOT WIN32 AND NOT APPLE)
-            message("        - AudioCD (libcdparanoia and libcddb/libmusicbrainz5 required)")
-        endif (NOT AUDIOCD_SUPPORT AND NOT WIN32 AND NOT APPLE)
-        if (NOT ENABLE_REMOTE_DEVICES)
-            message("        - Remote device sync (EXPERIMENTAL)")
-        endif (NOT ENABLE_REMOTE_DEVICES)
-        if (NOT ENABLE_REPLAYGAIN_SUPPORT)
-            message("        - ReplayGain calculation (taglib, and ffmpeg and/or mpg123 required)")
-        endif (NOT ENABLE_REPLAYGAIN_SUPPORT)
-        if (NOT ENABLE_PROXY_CONFIG AND NOT ENABLE_KDE)
-            message("        - Proxy configuration")
-        endif (NOT ENABLE_PROXY_CONFIG AND NOT ENABLE_KDE)
-    endif (NOT TAGLIB_FOUND OR NOT MTP_FOUND OR NOT AUDIOCD_SUPPORT OR NOT ENABLE_REPLAYGAIN_SUPPORT OR NOT ENABLE_HTTP_STREAM_PLAYBACK OR NOT ENABLE_REMOTE_DEVICES OR (NOT ENABLE_PROXY_CONFIG AND NOT ENABLE_KDE))
-
+macro_display_feature_log()
+
+if (NOT ENABLE_STREAMS OR NOT ENABLE_DYNAMIC OR NOT ENABLE_ONLINE_SERVICES OR (NOT ENABLE_DEVICES_SUPPORT AND NOT WIN32 AND NOT APPLE))
+    message("-----------------------------------------------------------------------------")
+    message("-- The following STANDARD options have been DISABLED.")
+    message("-----------------------------------------------------------------------------")
+    if (NOT ENABLE_STREAMS)
+        message("    * Streams Tab - Used to lookup internet radio streams, and save favourites.")
+    endif (NOT ENABLE_STREAMS)
+    if (NOT ENABLE_DYNAMIC)
+        message("    * Dynamic Tab - Dynamic playlist support.")
+    endif (NOT ENABLE_DYNAMIC)
+    if (NOT ENABLE_ONLINE_SERVICES)
+        message("    * Online Tab - Jamendo, Magnatune, SoundCloud, and Podcasts.")
+    endif (NOT ENABLE_ONLINE_SERVICES)
+    if (NOT ENABLE_DEVICES_SUPPORT)
+        message("    * Devices Tab - Media device support (UMS, MTP, AudioCD).")
+    endif (NOT ENABLE_DEVICES_SUPPORT)
+    message("")
+endif (NOT ENABLE_STREAMS OR NOT ENABLE_DYNAMIC OR NOT ENABLE_ONLINE_SERVICES OR (NOT ENABLE_DEVICES_SUPPORT AND NOT WIN32 AND NOT APPLE))
+
+if ((ENABLE_DEVICES_SUPPORT AND ENABLE_REMOTE_DEVICES) OR ENABLE_HTTP_STREAM_PLAYBACK OR ENABLE_EXTERNAL_TAGS OR (NOT ENABLE_KDE AND ENABLE_PROXY_CONFIG))
+    message("-----------------------------------------------------------------------------")
+    message("-- The following NON STANDARD options have been ENABLED.")
+    message("-----------------------------------------------------------------------------")
+    if (ENABLE_HTTP_STREAM_PLAYBACK)
+        message("    * MPD HTTP Streams - Playback MPD HTTP output stream via Phonon (Qt4) or QtMultimedia (Qt5).")
+    endif (ENABLE_HTTP_STREAM_PLAYBACK)
+    if (ENABLE_PROXY_CONFIG)
+        message("    * Proxy Configuration")
+    endif (ENABLE_PROXY_CONFIG)
+    if (ENABLE_REMOTE_DEVICES)
+        message("    * Remote Devices - Access sshfs, Samba, and local folders as devices. EXPERIMENTAL.")
+    endif (ENABLE_REMOTE_DEVICES)
     if (ENABLE_EXTERNAL_TAGS)
-        message("      Tags will be read/written via an external helper app")
-        message("      NOTE: This is EXPERIMENTAL, and is NOT CURRENTLY WORKING!!!!")
-        message("            Do NOT report bugs with this build!!!")
+        message("    * External Tags - Use external helper app to read/write tags. EXPERIMENTAL - AND *NOT* FULLY FUNCTIONAL!")
     endif (ENABLE_EXTERNAL_TAGS)
-else (TAGLIB_FOUND)
-
-    message("      Disabled features:")
-    if (NOT PHONON_FOUND)
-        message("        - MPD HTTP stream playback (phonon required)")
-    endif (NOT PHONON_FOUND)
-    message("        - Tag Editor (taglib required)")
-    message("        - Track Organizer (taglib required)")
-    if (NOT WIN32 AND NOT APPLE)
-        message("        - UMS device sync (taglib required)")
-        message("        - MTP device sync (taglib and libmtp required)")
-        message("        - AudioCD (taglib, libcdparanoia, and libcddb/libmusicbrainz5 required)")
-        message("        - AudioCD playback via MP3 (liblame required)")
-        message("        - Remote device sync (EXPERIMENTAL) (taglib required)")
-    endif (NOT WIN32 AND NOT APPLE)
-    if (NOT ENABLE_REPLAYGAIN_SUPPORT)
-        message("        - ReplayGain calculation(taglib, and ffmpeg and/or mpg123 required)")
-    endif (NOT ENABLE_REPLAYGAIN_SUPPORT)
-
-endif (TAGLIB_FOUND)
+    message("")
+endif ((ENABLE_DEVICES_SUPPORT AND ENABLE_REMOTE_DEVICES) OR ENABLE_HTTP_STREAM_PLAYBACK OR ENABLE_EXTERNAL_TAGS OR (NOT ENABLE_KDE AND ENABLE_PROXY_CONFIG))
 
 if (NOT CMAKE_SYSTEM_NAME MATCHES Linux)
-    message("")
-    message("*************************************************************")
-    message("*************************************************************")
-    message("** NOTE: You NEED to have the Oxygen icons installed!!     **")
-    message("**       If not, Cantata may have *lots* of missing icons. **")
-    message("*************************************************************")
-    message("*************************************************************")
+    message("-----------------------------------------------------------------------------")
+    message("-- You NEED to have the Oxygen icons installed!!!")
+    message("-----------------------------------------------------------------------------")
     message("")
 endif (NOT CMAKE_SYSTEM_NAME MATCHES Linux)
-message("")
 
 if (ENABLE_MODEL_TEST AND NOT ENABLE_KDE AND NOT ENABLE_QT5)
-    message("***************************************************")
-    message("************* ENABLING MODEL TESTS!!! *************")
-    message("***************************************************")
-    message("")
-    message("This build is intended to be run under a debugger!!")
-    message("DO NOT use this as a release build!!!!")
+    message("-----------------------------------------------------------------------------")
+    message("-- ENABLING MODEL TESTS!!! RUN UNDER A DEBUGGER, AND DO NOT USE AS RELEASE!!!")
+    message("-----------------------------------------------------------------------------")
     message("")
 endif (ENABLE_MODEL_TEST AND NOT ENABLE_KDE AND NOT ENABLE_QT5)
diff --git a/ChangeLog b/ChangeLog
index ea0876e..018420f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,255 @@
-1.2.2
+1.3.4
+-----
+ 1. Fix adding songs to playqueue with priority when playqueue is not empty.
+ 2. When loading covers, if load fails, check to see if this is because of an
+    incorrect extension. e.g. load a .jpg file with PNG type, and vice versa.
+ 3. Fix showing of time-slider when Cantata is started minimized to system tray
+    and MPD is playing.
+ 4. Remove unused 'Back' action.
+ 5. Don't treat albums with artists such as 'AlbumArtist ft Other' as multiple
+    artist albums.
+ 6. Fix updating of playqueue sidebar tooltip and icon.
+ 7. Add playqueue action to main window, so that shortcut works.
+ 8. When using track organizer, also try to move artist images, backdrop images,
+    and playlist files.
+ 9. After altering filename scheme from track organizer, save settings.
+10. Don't set year or disc in tag editor for 'All Tracks' unless they are non
+    zero.
+11. In tag-editor, when obtaining values to use for 'All Tracks' entry, don't
+    ignore empty fields.
+12. When determining album year, ignore playlist files!
+13. If MPD database is refreshed whilst listview is not at top level, then
+    reset view to top level.
+14. When TrackOrganizer is called after TagEditor, only perform MPD update
+    once.
+15. When editing filename scheme, after inserting a variable set cursor
+    position to after newly inserted text and give focus back to line edit.
+
+1.3.3
+-----
+ 1. If Cantata is started whilst an instance is also running, raise window of
+    current instance. (Linux only fix)
+ 2. Add song to playqueue from albums page when double-clicked.
+ 3. Fix display of online-service track album-artist in copy dialog.
+ 4. Ensure library is loaded the very first time Cantata is run (ie. after
+    connected to MPD via initial settings wizard).
+ 5. When song is updated in context view, abort any current network jobs.
+ 6. Fix expand all / collapse all actions. Expand all will only expand 1 level
+    for main browsers.
+ 7. When reading lines from user mpd.conf file, read as utf-8.
+ 8. Reset devices and online-services models when artist-view cover size
+    changes.
+ 9. If downloading online-service track listing fails, then stop loader and 
+    show error.
+10. Use new location of Jamendo DB listing.
+
+1.3.2
+-----
+ 1. In cover/artist dialog, when attempting to save an image into Cantata's
+    cache folder - ensure the 'covers' sub-folder is created.
+ 2. When saving artist image from cover dialog, if set to save in MPD folder and
+    song's path does not have 2 folder elements then save in cache folder.
+    Cantata will only save artist images, and backdrops, in MPD folder if the
+    folder structure is (e.g.) Artist/Album/Track.mp3
+ 3. Use case-insensitive sort of folder view items when adding to playqueue.
+ 4. When determining the 'basic' artist of a track, if albumartist is set and
+    artist is not, then use albumartist.
+ 5. For the web-links in the context view, replace ampersand and question mark
+    characters in artist names with the relevant URL encoding.
+ 6. Use CMake to locate X11 libraries and headers.
+ 7. Set minimum size for initial settings wizard.
+ 8. If buddy of a checkbox or radio is clicked, then toggle check or radio.
+ 9. Disable context-view cancel actions until a job is created.
+10. When searching models, also search composer field.
+11. Fix enabling of "Initially collapse albums" in playlists settings tab.
+12. Fix grouped playlist view initial state when set to initially collapse
+    albums.
+13. Fix calculating size of song files when copying off a device that has been
+    previously scanned, and its contents cached.
+14. When copying from a CD, check that we have enough space for track that was
+    encoded with a 1:18 ratio. Just a sanity check really.
+15. Fix song notification mem-leak (Linux only).
+16. When transitioning between backdrops in cover view, draw old at correct
+    position.
+17. Dont load library twice at start-up when cache has been deleted current tab
+    is artists or albums.
+
+1.3.1
+-----
+ 1. Fix collapsed context-view selector buttons text when using a dark
+    background.
+ 2. Apply some Fedora patches.
+ 3. Fix MPD HTTP stream playback.
+ 4. Fix painting of Gtk thin scrollbar style on comboboxes.
+ 5. When waiting for replies from MPD, use Qt's standard timeout value of 30s.
+    While the socket is still connected, Cantata will wait up to 4 times the
+    timeout value. Therefore, the actual timeout has increased to 2minutes!
+ 6. If a sidebar view has focus, but sidebar is collapsed, then find action
+    should activate playqueue search widget.
+ 7. FreeBSD 10 compile fixes.
+ 8. Fix scaling of context view background when size of view changes.
+ 9. Elide text of context view selector buttons, if insufficient space.
+10. Only show mopidy note in copy/remove dialog if connected to mopidy.
+11. Fix broken en_GB translation.
+12. Fix folder-view path parsing. If two folders only differed in the last
+    character then Cantata would have placed the contents of the second
+    into the listing of the first.
+13. Explicitly link to pthread.
+14. Do not allow 'auto-hide sidebar' and 'playqueue in sidebar' to be active at
+    the same time.
+
+1.3.0.1
+-------
+1. Fix duplicate translations - causes KDE builds to fail.
+
+1.3.0
+-----
+ 1. Add option to control startup-state; visible, hidden, or remembered from
+    previous run.
+ 2. Basic undo/redo support for playqueue.
+ 3. Search tab. Hidden by default, enable via settings dialog.
+ 4. Optionally save scaled covers (used in artist and albums views) to disk.
+ 5. Add option to always collapse context into single pane.
+ 6. Option to have small sidebar at top or bottom.
+ 7. Scale context view backdrops.
+ 8. Add a manual config item (mpdPoll) to control whether Cantata should poll
+    MPD for its current state whilst playing. The value is specified in
+    seconds. This is useful for cases where Cantata misses updates from MPD.
+    This is only a work-around for certain scenarios. Please see README for
+    more details.
+ 9. When sending commands to MPD, and waiting for response, use a timeout of 2
+    seconds per 100K bytes of data.
+10. Hide volume control if MPD returns a negative value for volume - which
+    indicates MPD's volume mixer is disabled.
+11. When closing search widget, after performing a search, collapse all bar top
+    level items.
+12. When adding files to playqueue, only add in batches of up to 10000 songs.
+    This 'chunk size' may be altered by setting mpdListSize in Cantata's config
+    file - see README for details.
+13. Add 'Remove duplicates' functionality to play queue and play lists.
+14. Only start internal HTTP server when required, and stop 1 second after
+    last Cantata stream is removed.
+15. If connected to MPD via a UNIX-domain socket, then send non-MPD files as
+    file:/// URLs to MPD - i.e. don't use internal HTTP server. To force usage
+    of HTTP server, set alwaysUseHttp to true in Cantata's config file. Refer to
+    README for more details.
+16. Add CMake option to disable building of internal HTTP server.
+17. If listallinfo fails, then attempt to retrieve music listing via lsinfo
+    calls on each folder. Usage of lsinfo may be forced by setting
+    alwaysUseLsInfo in Cantata's config file - see README for details.
+18. Add CMake option to disable streams, dynamic, and online services. Refer to
+    INSTALL file for details.
+19. Don't use QKeySequence::Delete to detect delete key event for play queue,
+    instead check for no-modifiers and the Delete key itself. Closing a
+    terminal with Ctrl-D seems to cause Cantata to see QKeySequence::Delete
+20. Use &;copy for copyright symbol in text - better than (c)
+21. Add config setting (for Qt only builds) to set language.
+22. Set cover-widget icon size to at least twice tab-widget large icon size.
+23. Remove usage of Gtk-style on-off button for Gtk style, and instead give
+    checkboxes better text and adjust config layout.
+24. Better control over 'Subscribe' button in podcast search dialog.
+25. When downloading images, don't use extension to determine file format,
+    instead look for JFIF and PNG in first few data bytes.
+26. Cache folder listing as well as music listing. This cache is removed if
+    the folder view is disabled.
+27. Also search Spotify, iTunes, and Deezer for images in cover dialog.
+28. Fix filename scheme help table.
+29. Allow to specify filename scheme when copying to library.
+30. Before calling ReplyGain after ripping CD, convert filenames to destination
+    suffix.
+31. Use Podcasts and SoundCloud icons in cover widget, and song notification,
+    for relevant tracks.
+32. Fix displaying of disc and track numbers for online services.
+33. Move sidebar settings into settings dialog. Sidebar menu now just contains
+    a 'Configure...' entry which opens settings dialog at relevent page.
+34. Add new view style "Basic Tree (No Icons)". This is as per the simple tree,
+    but only images, and not icons, will be shown.
+35. Europe and Canada regions in ListenLive are not re-loadable (as they are
+    read from listenlive.xml)
+36. Set CMake defaults if not supplied on commandline; set prefix to /usr for
+    Qt only Linux builds, path to `kde4-config --prefix` for KDE4 builds, and
+    set build type to Release
+37. Place Cantata's 'toolbar' within a QToolBar - so that the style's toolbar
+    look is preserved, and styles that can drag window via toolbar (e.g.
+    QtCurve) still work.
+38. Call QApplication::alert() when showing errors - this causes taskbar entry
+    to be marked.
+39. Read lyrics from LYRICS tag for FLAC, Opus, Vorbis, and Speex files.
+40. Be consistent with other players, and dont show disc number in list.
+41. As per Amarok, split albums into discs in grouped playqueue view.
+42. Fix some Mopidy 0.18 issues; cover and lyrics retrieval, folders view
+    loading.
+43. Mopidy seems to require all parameters to be quoted.
+44. Only react to back or home action in listviews if view is visible!
+45. Don't allow buttons in main widow to recieve focus.
+46. Use Ctrl+G as short-cut to show genre combo popup.
+47. Re-focus view when search closed.
+48. Fix handling of playlists with a colon in their name.
+49. If Mopidy playlist starts with "Smart Playlist:" then treat as a 'smart'
+    playlist - e.g. don't try to display song count, don't try to load songs
+    in playlists view, use sub text 'Smart Playlist' (and fix playlist name),
+    and don't allow saving to these playlsts.
+50. Remove find buttons in status bar, and use Ctrl-F for both find in views
+    and find in playqueue. Action depends upon which view has focus.
+51. Remove refresh buttons in status bar, and place into main menu. Also,
+    prompt for confirmation before performing refresh.
+52. Combine podcast subscribe and search dialogs.
+53. Add option to NOT download covers from last.fm
+54. Add menu to cover dialog, so that user can control which services are
+    queried.
+55. Add option to use a custom image as context view backdrop.
+56. Add option to specify blur and opacity of context view backdrop image.
+57. Add option to use a custom image as playqueue background.
+58. Add option to specify blur and opacity of playqueue background image.
+59. If list view has focus, pressing Backspace will navigate back.
+60. Fix albumsview cover size when set to a tree style and Cantata is
+    restarted.
+61. Add 'Add To Playlist' menu item to playlists page.
+62. Add 'Table' style view for playlists.
+63. Clicking on title in list/icon view navigates back.
+64. Bundle own copy of symblic media icons - so that these can be recoloured
+    to match current theme.
+64. Fix searches containing more than 4 words.
+65. Use stretch header class from Clementine for table style views.
+66. Dont change tray icon to play state - consistent with other apps.
+67. For Linux builds, if systray.svg file exists in
+    $prefix/share/cantata/icons/$iconTheme, then this will be used as the
+    system tray icon. Currently Cantata supplies 2 mono SVGs - one for
+    ubuntu-mono-dark and one for ubuntu-mono-light.
+68. Show time-slider position tooltip immediately.
+69. Expand interface if it is collpased and an error or question is to be
+    displayed in message widget.
+70. Hack-around issue with message widget not appearing in KDE builds when
+    KDE's animations are disabled.
+71. Remove 'copy track info' functionality, I see no need for this!
+72. Remove showPage dbus function.
+73. Use wmctrl to raise window under compiz for Qt5 builds.
+74. Dont react to mouse-release event in coverwidget if an override cursor has
+    been set. Fixes the case, with Qt5 builds, where a drag is started on the
+    cover widget causes interface to expand/collapse.
+75. Change views to scroll-per-pixel.
+76. Dont allow expanding, or collapsing, if maximised or mesasge widget is
+    visible.
+77. Remove embedding of pre-rendered Cantata icons. Cantata requires the SVG
+    icon plugin, so users must have this installed.
+78. Use system menu icon for Linux builds. To revert to previous 3-line style
+    icon pass -DUSE_SYSTEM_MENU_ICON=OFF to cmake.
+79. When downloading, and parsing, ListenLive streams, if a station has more
+    than 1 stream then list all streams - adding format and bitrate
+80. Move search fields back to the top of views.
+81. Close temporary files after write, to ensure data is written. This fixes an
+    issue where sometimes 0 byte files were written from CoverDialog.
+82. Use same order (URL, name) for both add stream-URL dialogs.
+83. For UMS devices, add device and size (in brackets) after name. Should help
+    devices with multiple partitions.
+84. Use WindowText, and not ButtonText, colour for mono icons - fixes wrong
+    colour being used with Bespin style.
+85. Fix corrupted scrollbar background in views with a background image when
+    Gtk style is used.
+86. Dont draw tab-bar frame when using small sidebar style.
+87. If using small sidebar on top, or bottom, then centre-align tabs.
+
+1.2.2
 -----
  1. Fix British English translation.
  2. Improve internal HTTP security - only serve files to MPD host, and only
@@ -8,7 +259,7 @@
  5. If icon theme does not have network-server, then use audio file icon for
     HTTP server settings page.
  6. Fix truncated files served from internal HTTP server.
- 7. When adding songs to an existing play lists, dont allow play list files to
+ 7. When adding songs to an existing play lists, don't allow play list files to
     be added.
  8. If Ctrl-F is activated again whilst search widget is visible, then select
     all current text.
@@ -16,7 +267,7 @@
     This fixes seeking of FLAC files.
 10. Fix toggling of checkboxes via short-cut.
 11. Fix short-cuts in preferences dialog.
-12. Dont clear the playqueue when Cantata is passed a song as a commandline at
+12. Don't clear the playqueue when Cantata is passed a song as a commandline at
     start-up.
 13. Fix broken spinboxes in some dialogs with Gtk style.
 14. Correctly style treeview in CD details dialog.
@@ -26,7 +277,7 @@
 1.2.1
 -----
 1. Only use old Qt DBUS type annotations for Qt less than 4.8.2
-2. Use "(C)" instead of "©", as "©" seems to mess up Qt translations.
+2. Use "(c)" instead of "©", as "©" seems to mess up Qt translations.
 3. Fix tagtype and URL handler detection. Fixes Composer support, and streams.
 4. Use 32x32 for drag'n'drop icon, 64x64 for highdpi.
 5. Use audio-x-generic icon for drag'n'drop if no cover found.
@@ -68,7 +319,7 @@
 16. Initial MacOS port - thanks to Ian Scott
 17. Podcast support.
 18. Add config page to determine list of online providers.
-19. If 'Basic'/'Personal' is selected in intitial settings wizard, then enable
+19. If 'Basic'/'Personal' is selected in initial settings wizard, then enable
     'stop playback' and 'stop dynamizer' options.
 20. Store data under XDG_DATA_HOME (~/.local/share) Any existing files will be
     copied to the new location. NOTE: This is not backwards compatible, so if
@@ -101,7 +352,7 @@
 35. Only show config pages, and tabs, that are relevant to the enabled views.
 36. Show action short-cuts in tooltips.
 37. When filtering (i.e. searching) Jamendo, Maganatue, and stream providers
-    (apart from TuneIn and ShoutCast), then dont hide items from other
+    (apart from TuneIn and ShoutCast), then don't hide items from other
     services - but only filter the ones on the filtering service.
 38. Also read Jamendo genre's from album tag.
 39. Modify message-widget so that it uses a squeezed-text label. Because of
@@ -116,7 +367,7 @@
 44. When setting window title, use full-text from track/artist labels, and not
     the squeezed text!
 45. Hungarian translation - thanks to Török Árpád
-46. When displaying tag editor, track orgainiser, or replay gain dialogs, check
+46. When displaying tag editor, track organiser, or replay gain dialogs, check
     that the song files can be accessed. (For speed reasons, only the 1st few
     files are checked)
 47. Add a config item to control volume step - no config UI, see README for
@@ -148,7 +399,7 @@
     and track count to be actioned.
 60. If playlists page is disabled, then hide 'Add to playlist' actions and hide
     playqueue save button.
-61. Dont load folder list until view is visible.
+61. Don't load folder list until view is visible.
 62. Add 'Cancel' to context-view context menus - cancels current fetch job.
 63. Correctly update tooltips when removing a short-cut from an action.
 64. Instantiate network proxy factory when network access manager is
@@ -247,7 +498,7 @@
  6. Don't use https for context view searches.
  7. Work-around Windows and QJson issue.
  8. Remove cantata prefix when showing status message about fetching streams.
- 9. When adding streams that have a name assinged, but no path, then add a
+ 9. When adding streams that have a name assigned, but no path, then add a
     trailing slash.
 10. Fix 'Add Stream URL' action in builds where device support is disabled.
 
@@ -304,7 +555,7 @@
 33. Automatic accelator assignment for Qt builds.
 34. Add cmake check to see if TagLib has id3version in MPEG save.
 35. RTL fixes.
-36. For Qt4 linux builds, use system QJson if found.
+36. For Qt4 Linux builds, use system QJson if found.
 37. Remove amazon cover fetching - required API key that Cantata never really
     had.
 38. Add debug logging. Please see README for details.
@@ -319,7 +570,7 @@
 43. Fix retrieval of covers in albums view for multiple-artist albums when
     these are configured to be grouped under "Various Artists"
 44. Refresh albums view when multiple-artist grouping is changed.
-45. Add context menu to replygain and file organizer dialogs to remove items
+45. Add context menu to replaygain and file organizer dialogs to remove items
     from list.
 46. Also use discogs for artist images in cover dialog.
 47. Fix invalid covers showing for online services.
@@ -345,13 +596,13 @@
 59. Remove proxy config from settings, and always use system proxy.
     To re-enable proxy settings pass -DENABLE_PROXY_CONFIG=ON to cmake.
 60. Copy Qt5 Linux system proxy code for Qt4 builds.
-61. Add option to draw curent album cover as backdrop to play queue.
+61. Add option to draw current album cover as backdrop to play queue.
 62. Add 'Copy Songs To Device' action to playlists page.
 63. Embed pre-rendered PNG versions of cantata icon, to help with Qt5 builds
     on systems that do not have the Qt SVG icon engine installed.
 64. Simplify streams page. Remove user-categories, instead have a set of
     predefined top-level items; Favourites (user streams), TuneIn, IceCast,
-    ShoutCast, SomaFM, Digitially Imported, Jazz Radio, Rock Radio, Sky.fm, and
+    ShoutCast, SomaFM, Digitally Imported, Jazz Radio, Rock Radio, Sky.fm, and
     Listen Live.
 65. Search for streams via TuneIn.
 66. Place search fields on bottom of views, and hide by default. Show when
@@ -361,7 +612,7 @@
     will list each track as a separate entry in the artists and albums views.
 69. When loading a stream into the playqueue, show a status message at the
     bottom - allowing the loading to be cancelled.
-70. If stream is not an audiocd stream, and the total time is known, then enable
+70. If stream is not an AudioCD stream, and the total time is known, then enable
     the position slider.
 71. Allow seeking in cantata HTTP streams.
 72. Default to enabling use of media keys under GNOME/Unity.
@@ -370,7 +621,7 @@
 75. Always use QNetworkAccessManager - as KIO is not thread safe :-(
 76. Update copy of Solid to KDE4.10.5.
 77. Provide Faience CSS theme.
-78. Click on time label to toggle between shwowing current time and time
+78. Click on time label to toggle between showing current time and time
     remaining.
 79. Use tooltip to display position that will be jumped to if mouse is pressed
     on time slider.
@@ -395,7 +646,7 @@
 10. Fix AudioCD playback.
 11. Remove time remaining from action dialog - its not accurate enough to be
     meaningful.
-12. Fix detection of whether streams file is writable or not.
+12. Fix detection of whether streams file is writeable or not.
 
 1.0.2.1
 -------
@@ -437,8 +688,8 @@
   7. Allow editing of tags, and replaygain calculation, of files from folder
      view which do not contain tags.
   8. Merge 'External Settings' into 'Interface Settings'
-  9. Add option to embed covers when copying songs to devices. (ID3v2, mp4,
-     and vorbis comment tag types only) 
+  9. Add option to embed covers when copying songs to devices. (ID3v2, MP4,
+     and Vorbis comment tag types only)
  10. Add a simple system dbus helper to allow user mounts of samba shares. This
      is intended to allow Cantata to connect to an Android device via Droid NAS.
      Requires cantata be built with remote device support.
@@ -493,7 +744,7 @@
  39. Add option to save streams in MPD folder.
  40. GZip compress streams files.
  41. When reading cache (either MPD, or device), and the grouping (single
-     tracks, or multiple artists) has changed - then dont do a rescan, just
+     tracks, or multiple artists) has changed - then don't do a rescan, just
      re-do the grouping.
  42. If we are using QGtkStyle and this is set to Ambiance or Radiance, then
      apply a corresponding stylesheet to the toolbar - and allow window to be
@@ -511,7 +762,7 @@
      file as well.
  49. Allow streams to have multiple genres.
  50. Custom menu icon - more like the one used in chrome.
- 51. Use "-symbolic" icons for Qt-only linux builds with ambiance theme.
+ 51. Use "-symbolic" icons for Qt-only Linux builds with ambiance theme.
  52. If replacing playqueue with a stream, then start playing when added.
  53. Fix restoring of alternate size. e.g. fix restore of collapsed size if
      started expanded - and vice versa.
@@ -549,7 +800,7 @@
      indicates that the files should be renamed.
  72. Add extra option to filescheme dialog - "Track Artist (+Title)". This is
      intended to be used with Various Artist albums - so that the filename can
-     also contain the track arist, if this is different to the album artist.
+     also contain the track artist, if this is different to the album artist.
  73. Expand device when connected.
  74. Basic support for extracting music from audio CDs
  75. Update copy of Solid to KDE4.10.1 - adds Udisks2 support.
@@ -662,10 +913,10 @@
     icons, and use alternatives.
 13. Use a random icon that matches the repeat icon better.
 14. Draw the consume icon in code, so that it matches random and repeat better.
-15. Add a ON/OFF style checkbox for linux builds when NOT run under KDE, and
+15. Add a ON/OFF style checkbox for Linux builds when NOT run under KDE, and
     using QGtkStyle.
 16. Add a custom spinbox to closer match Gtk3's large button spinbox style.
-    Only for linux builds NOT run under KDE, and using QGtkStyle.
+    Only for Linux builds NOT run under KDE, and using QGtkStyle.
 17. Add 'Show Window' action to Linux builds - so that we have a way of
     restoring the Cantata window from the Unity menubar.
 18. Use freedesktop.org notifications for Qt-only Linux builds.
@@ -696,7 +947,7 @@
 34. Remove option to enable/disable MPRIS interface, and always have enabled.
 35. Disable Phonon stream playback support by default. Currently not all
     Phonon backends seem to work reliably, and there can be delays between
-    pressing a button (e.g. start) and the action occuring (due to buffering?).
+    pressing a button (e.g. start) and the action occurring (due to buffering?).
     To re-enable pass -DENABLE_PHONON=ON to cmake.
 36. Handle UTF-8 playlist names.
 37. Sort selected playqueue indexes before adding to stored playlist.
@@ -745,7 +996,7 @@
 60. Add search line-edits, and expand/collapse all, to sync dialog.
 61. Add a 1 pixel border around large cover in top-left corner.
 62. When refresh button is pressed send an update and stats request to MPD.
-63. Hard-code black background and gray text for cover widget tooltip.
+63. Hard-code black background and grey text for cover widget tooltip.
 64. Ignore quit action if we have open dialogs.
 65. Fix crash when copying items to devices after a rescan has been performed.
 66. Use UPower (Linux/Qt) to detect when being resumed, and if so reconnect to
@@ -983,7 +1234,7 @@
  6. Better, less hacky, workaround for QAbstractItemView shift-select bug
     (https://bugreports.qt-project.org/browse/QTBUG-18009). Thanks to Spitfire
     from qtcentre.org forums for fix.
- 7. Add a 'search' action (Ctrl-F) that will move focus to curent tab's search
+ 7. Add a 'search' action (Ctrl-F) that will move focus to current tab's search
     field - or to play queue search field (if play queue has focus).
  8. Add 'Raise' support to MPRIS interface.
  9. Added a cantata-specific dbus interface with 'showPage(page, focusSearch)'
@@ -1020,10 +1271,10 @@
     set to not autoscan.
 23. Fix detection of some UMS devices that are already mounted at startup.
 24. Load library view covers in separate thread, as per albums view.
-25. Add expandAll (Ctrl +) / collpseAll (Ctrl -) actions to expand/collapse all
+25. Add expandAll (Ctrl +) / collapseAll (Ctrl -) actions to expand/collapse all
     items of currently focused treeview.
 26. Emit dataChanged() for all album header items that match the album
-    currently being expanded/collpased in the groupedview.
+    currently being expanded/collapsed in the groupedview.
 27. Add a basic 'sync' dialog. Shows two lists; left has songs that are only in
     library, right has songs that are only on device. Each has a 'Copy to'
     action. When songs are copied, the lists are updated to show the remaining
@@ -1039,7 +1290,7 @@
 33. Limit downloaded covers to a max of 600x600 pixels.
 34. Don't update 'current song' details when playqueue is updated - the current
     song is updated by other means. As we now use 'plchangesposid' to speed
-    updates, we dont always have the full song info when playqueue is updated.
+    updates, we don't always have the full song info when playqueue is updated.
     This fixes a bug where the cover widget sometimes gets reset to empty.
 35. When updating a non-MTP device, prompt the user as to whether to perform
     a partial scan (only new songs are scanned), or a full scan (where all songs
@@ -1052,7 +1303,7 @@
     provider. This allows all providers to be checked. Thanks to Martin
     Blumenstingl for the patch.
 38. Fix copying track from MTP devices.
-39. When performing a custom lyrics search, and we have no current song, dont
+39. When performing a custom lyrics search, and we have no current song, don't
     attempt to save the file to MPDs music folder (there is no valid filename).
 40. When adding items to playqueue, only start to play if playqueue was
     previously empty.
@@ -1113,9 +1364,9 @@
 31. Add dialog where user can specify artist and title to fetch lyrics - useful
     if automatic fetching fails.
 32. Fix crash in albums model when library updated after albums removed.
-33. Fix filetype resolver so that we dont attempt to read tags from video files
+33. Fix filetype resolver so that we don't attempt to read tags from video files
     (asf/wmv/mp4v) - these seem to crash TagLib.
-34. When using MPRISv2 interface, dont attempt to play a song if the playqueue
+34. When using MPRISv2 interface, don't attempt to play a song if the playqueue
     is empty!
 35. Use SH_ItemView_ActivateItemOnSingleClick to detect single click mode in Qt
     build.
@@ -1228,7 +1479,7 @@
 26. Remove 'Copy Track Info' from play queue context menu - functionality is
     available via Ctrl-C
 27. Fix streams export.
-28. Save/restore maximised state when collpasing/expanding interface.
+28. Save/restore maximised state when collapsing/expanding interface.
 29. Add 'copy to device', etc, actions to folders page.
 30. Incremental update of folder page items.
 31. Use current style for position slider.
@@ -1251,7 +1502,7 @@
  3. When changing name of playlist, show the original name in the line-edit.
  4. Fix adding songs with spaces in their filenames to stored playlists
  5. When we receive an updated signal from MPD, refresh library view.
- 6. When disaplying songs of various artists albums, show as 'track number -
+ 6. When displaying songs of various artists albums, show as 'track number -
     artist - song'
  7. German translation - thanks to Lutz Lüttke
  8. Rename 'Update Database' action to 'Refresh', as the current view is now
diff --git a/INSTALL b/INSTALL
index 3a3d6c7..8c49795 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,7 +6,7 @@ KDE4
 
 1. mkdir build
 2. cd build
-3. cmake .. -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix` -DCMAKE_BUILD_TYPE=Release
+3. cmake ..
 4. make
 5. sudo make install
 
@@ -16,7 +16,7 @@ Qt4
 
 1. mkdir build
 2. cd build
-3. cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DENABLE_KDE=OFF
+3. cmake .. -DENABLE_KDE=OFF
 4. make
 5. sudo make install
 
@@ -26,7 +26,7 @@ Qt5
 
 1. mkdir build
 2. cd build
-3. cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DENABLE_KDE=OFF -DENABLE_QT5=ON
+3. cmake .. -DENABLE_KDE=OFF -DENABLE_QT5=ON
 4. make
 5. sudo make install
 
@@ -49,10 +49,43 @@ The following options may be passed to CMake:
         separated with a semicolon (";") e.g. -DCANTATA_TRANSLATIONS="es;pl"
         Default: all
 
-    -DENABLE_REMOTE_DEVICES=ON
-        Compile support for samba, sshfs, and local folder, devices.
+    -DENABLE_HTTP_STREAM_PLAYBACK=ON
+        Enable support for playing back MPD HTTP streams via Phonon (Qt4) or
+        QtMultiMedia (Qt5).
+        Default: OFF
+
+    -DENABLE_HTTPS_SUPPORT=ON
+        Enable support for https URLs when querying last.fm, wikipedia,
+        soundcloud, etc.
+        Default: ON (OFF for windows)
+
+    -DENABLE_EXTERNAL_TAGS=ON
+        Enable usage of external app for reading/writing tags. Helps to
+        isoloate Cantata from TagLib crashes.
+        EXPERIMENTAL - CURRENTLY **NOT** WORKING!!!
         Default: OFF
 
+    -DENABLE_HTTP_SERVER=ON
+        Enable usage of internal HTTP server for non-MPD file playback.
+        Default: ON
+
+    -DENABLE_DYNAMIC=ON
+        Enable support for dynamic playlists.
+        Default: ON
+
+    -DENABLE_STREAMS=ON
+        Enable support for streams tab (saving favourite streams, listing
+        streams from providers, etc)
+        Default: ON
+
+    -DENABLE_ONLINE_SERVICES=ON
+        Enable support for online services (Jamendo, Magnatune, SoundCloud, and
+        Podcasts)
+        Default: ON    
+
+
+    Specific to Qt-only builds::
+
     -DENABLE_KDE=OFF
         Link against KDE libraries, use KDE dialogs, etc.
         Default: ON
@@ -61,41 +94,44 @@ The following options may be passed to CMake:
         Build against Qt5, not Qt4
         Default: OFF
 
-    -DENABLE_HTTP_STREAM_PLAYBACK=ON
-        Enable support for playing back MPD HTTP streams via Phonon (Qt4) or
-        QtMultiMedia (Qt5).
-        Default: OFF
-
-    -DENABLE_UDISKS2=ON
-        Build UDisks2 backend for solid-lite. (This is for Qt only builds,
-        KDE builds use KDE supplied Solid libraries).
-        Default: OFF
-
     -DENABLE_PROXY_CONFIG=ON
         Enable support for proxy settings in config dialog. If disabled,
         system proxy settings are used.
-        NOTE: Applies to Qt builds only.
         Default: OFF
 
-    -DENABLE_HTTPS_SUPPORT=ON
-        Enable support for https URLs when querying last.fm, wikipedia,
-        soundcloud, etc.
-        Default: ON (OFF for windows)
 
-    -DENABLE_EXTERNAL_TAGS=ON
-        Enable usage of external app for reading/writing tags. Helps to
-        isoloate Cantata from TagLib crashes.
-        EXPERIMENTAL - CURRENTLY **NOT** WORKING!!!
-        Default: OFF
-        
+    KDE specific:
+
     -DENABLE_KWALLET=ON
-        Use KWallet with KDE builds.
+        Use KWallet to store MPD passwords.
+        Default: ON
+
+
+    Linux specific:
+
+    -DUSE_SYSTEM_MENU_ICON=ON
+        Use standard menu icon, as opposed to Cantata's chrome/firefox 3 line
+        menu icon. Under certain Gtk themes (Ambiance, Radiance, etc) this will
+        use a symbolic 16px icon.
         Default: ON
 
     -DENABLE_UNCACHED_MTP=ON
         Open MTP devices in un-cached mode (faster)
         Default: ON
 
+    -DENABLE_DEVICES_SUPPORT=ON
+        Support external devices (UMS, MTP, AudioCD)
+        Default: ON
+
+    -DENABLE_REMOTE_DEVICES=ON
+        Support remote devices (accessed via sshfs, or samba). This is
+        EXPERIMENTAL - and requires ENABLE_DEVICES_SUPPORT to also be enabled.
+        Default: OFF
+
+    -DENABLE_UDISKS2=ON
+        Build UDisks2 backend for solid-lite. (Non-KDE builds only)
+        Default: OFF
+
 
     Windows specific:
 
diff --git a/README b/README
index 1e02f8a..67a5221 100644
--- a/README
+++ b/README
@@ -24,7 +24,7 @@ Table of Contents
 
 Cantata is a graphical client for MPD. It contains the following features:
 
- 1. Support for Qt4, Qt5, and KDE builds.
+ 1. Support for Qt4, Qt5, Windows, and KDE builds.
  2. Multiple MPD collections.
  3. Highly customisable layout.
  4. Songs grouped by album in play queue.
@@ -35,15 +35,17 @@ Cantata is a graphical client for MPD. It contains the following features:
     installed)
  9. Dynamic playlists.
 10. Online services; Jamendo, Magnatune, SoundCloud, and Podcasts.
-11. Radio stream support - wth the ability to search for streams via TuneIn.
+11. Radio stream support - with the ability to search for streams via TuneIn or
+    ShoutCast.
 12. USB-Mass-Storage and MTP device support. (Linux only, and if relevant
     libraries installed)
 13. Audio CD ripping and playback. (Linux only, and if relevant libraries
     installed)
-14. Playback of non-MPD songs, via simple in-built HTTP server.
+14. Playback of non-MPD songs - via simple in-built HTTP server if connected
+    to MPD via a standard socket, otherwise filepath is sent to MPD.
 15. MPRISv2 DBUS interface.
-16. Support for KDE global shortcuts (KDE builds), and GNOME media keys
-    (Linux only)
+16. Support for KDE global shortcuts (KDE builds), GNOME media keys
+    (Linux only), and standard media keys (via Qxt)
 17. Ubuntu/ambiance theme integration - including dragging of window via
     toolbar.
 
@@ -52,6 +54,23 @@ integration - by using KDE libraries/classes wherever possible. However, the
 code (and user interface) is now *very* different to that of QtMPC, and both
 KDE and Qt (Linux) builds have the same feature set.
 
+Unlike most other MPD clients, Cantata caches a copy of the MPD music library.
+This is so that it can create a proper hierarchy of artists and albums (where
+Cantata will use the AlbumArtist tag if found, otherwise it will fallback to
+the Artist tag), to provide album counts, tracks counts, etc in the browser
+views and tooltips, and also to help with copying songs to/from devices.
+
+This cache is updated only when MPD indicates that its version of the collection
+is different to Cantata's. If you press the 'Refresh Database' button in either
+the artist, albums, folders, or playlists views, then this cache is deleted and
+recreated with the response from MPD.
+
+By default, Cantata will use the "listallinfo" command to retrieve the music
+collection. However, it has been noted that MPD 0.18 requires more memory for
+the collection details (due to MPD now reading more information), this may
+cause the "listallinfo" command to fail. If it does, Cantata (as of v1.3.0)
+will fallback to recursively calling "lsinfo" for each MPD folder.
+
 
 2. Dependencies
 ===============
@@ -88,13 +107,13 @@ such as MPDroid, GMPC, etc.
 
 To report bugs please visit http://code.google.com/p/cantata
 
-When reporting a bug, please mention that Cantata version number, the Cantata
+When reporting a bug, please mention the Cantata version number, the Cantata
 build type (Linux/KDE, Linux/Qt, Windows), any cmake options you specified
 (other than the defaults listed at the top of the INSTALL file), and the
 version of MPD you are using.
 
-Please DO NOT attach images to the bug page - as the attachement quota is almost
-full. Insted, please provide links top any relevant screenshots.
+Please DO NOT attach images to the bug page - as the attachment quota is almost
+full. Instead, please provide links to any relevant screenshots.
 
 
 4. Translations
@@ -139,7 +158,7 @@ Creating a new translation
 --------------------------
 
 To generate a new translation for Cantata, please just copy cantata.pot (in the
-po folder) to whetever letter code your language uses (e.g. es.po for Spanish).
+po folder) to whatever letter code your language uses (e.g. es.po for Spanish).
 Then edit this new file to add the translations.
 
 Please DO NOT use any tools to manually generate the translations from
@@ -156,118 +175,151 @@ translatable strings and update current translations.
 
 When displaying covers, Cantata will load album covers in the following order:
 
+...if configured to 'Cache scaled covers', Cantata will check its scaled-covers
+   cache folder (~/.cache/cantata/covers-scaled/SIZE) for:
+
+ 1. ${albumArtist}/${album}.jpg
+
 ...if MPD folder exists, is not specified as a http URL, and is readable, then
    cantata will look for the following within the folder containing the song:
 
- 1. ${configuredName}.jpg - if set
- 2. ${configuredName}.png - if set
- 3. cover.jpg
- 4. cover.png
- 5. AlbumArt.jpg
- 6. AlbumArt.png
- 7. folder.jpg
- 8. folder.png
- 9. ${file}.jpg - e.g. "01 Wibble.mp3" -> "01 Wibble.jpg"
-10. ${file}.png
-11. ${albumArtist} - ${album}.jpg
-12. ${albumArtist} - ${album}.png
-13. ${album}.jpg
-14. ${album}.png
-15. Image embedded within current song's tags.
-16. ANY other jpg, or png
+ 2. ${configuredName}.jpg - if set
+ 3. ${configuredName}.png - if set
+ 4. cover.jpg
+ 5. cover.png
+ 6. AlbumArt.jpg
+ 7. AlbumArt.png
+ 8. folder.jpg
+ 9. folder.png
+10. ${file}.jpg - e.g. "01 Wibble.mp3" -> "01 Wibble.jpg"
+11. ${file}.png
+12. ${albumArtist} - ${album}.jpg
+13. ${albumArtist} - ${album}.png
+14. ${album}.jpg
+15. ${album}.png
+16. Image embedded within current song's tags.
+17. ANY other jpg, or png
 
 ...then Cantata will check its cache folder (~/.cache/cantata/covers), for :
 
-17. ${albumArtist}/${album}.jpg
-18. ${albumArtist}/${album}.png
+18. ${albumArtist}/${album}.jpg
+19. ${albumArtist}/${album}.png
 
 ...if compiled for Linux
 
-19. Matching Amarok cover
-20. Matching Clementine cover
+20. Matching Amarok cover
+21. Matching Clementine cover
 
 ...if the MPD folder was specified as a http URL
 
-21. ${url}/${dirFromFile}/cover.jpg
+22. ${url}/${dirFromFile}/cover.jpg
     - or ${url}/${dirFromFile}/${configuredName}.jpg (if set)
-22. ${url}/${dirFromFile}/cover.png
+23. ${url}/${dirFromFile}/cover.png
     - or ${url}/${dirFromFile}/${configuredName}.png (if set)
 
-...lastly
+...lastly, if user has enabled downloading via last.fm
 
-23. Query last.fm using ${albumArtist} and ${album}. Cantata will attempt to
+24. Query last.fm using ${albumArtist} and ${album}. Cantata will attempt to
     download the image specified with the "extralarge" size.
 
 Downloaded images will be saved as ${configuredName}.jpg/png (if set), or
 cover.jpg/png, within the song folder if possible. If not, then they will be
 saved in Cantata's cache folder.
 
+If configured to 'Cache scaled covers', then the resized cover (as displayed)
+will be saved as a JPG within covers-scaled.
+
 
 For artist images:
 
+...if configured to 'Cache scaled covers', Cantata will check its scaled-covers
+   cache folder (~/.cache/cantata/covers-scaled/SIZE) for:
+
+ 1. ${albumArtist}.jpg
+
 ...if MPD folder exists, is not specified as a http URL, and is readable, then
    cantata will look for the following within the folder containing the song:
 
-1. ${albumArtist}.jpg
-2. ${albumArtist}.png
-3. artist.jpg
-4. artist.png
+ 2. ${basicArtist}.jpg
+ 3. ${basicArtist}.png
+ 4. artist.jpg
+ 5. artist.png
 
 ...the above will be repeated for the parent folder
 
+...if song is from a Various Artists album, or file is a non-MPD file, then
+   cantata will look for the following within the MPD root folder:
+
+ 6. ${basicArtist}/${basicArtist}.jpg
+ 7. ${basicArtist}/${basicArtist}.png
+ 8. ${basicArtist}/artist.jpg
+ 9. ${basicArtist}/artist.png
+
 ...then Cantata will check its cache folder (~/.cache/cantata/covers), for :
 
-5. ${albumArtist}.jpg
-6. ${albumArtist}.png
+10. ${albumArtist}.jpg
+11. ${albumArtist}.png
 
 ...if the MPD folder was specified as a http URL
 
-7. ${url}/${dirFromFile}/artist.jpg
-8. ${url}/${dirFromFile}/artist.png
+12. ${url}/${dirFromFile}/artist.jpg
+13. ${url}/${dirFromFile}/artist.png
  
 ...the above will be repeated for the parent folder
 
-...lastly
+...lastly, if user has enabled downloading via last.fm
 
-9. Query last.fm using ${albumArtist}. Cantata will attempt to download the
-   image specified with the "extralarge" size.
+14. Query last.fm using ${albumArtist}. Cantata will attempt to download the
+    image specified with the "extralarge" size.
 
 Downloaded images will be saved as artist.jpg/png, within the artist folder
-if the folder heirarchy is 2 levels (artist/album/) and the user has write
+if the folder hierarchy is 2 levels (artist/album/) and the user has write
 permissions. If not, then they will be saved in Cantata's cache folder.
 
+If configured to 'Cache scaled covers', then the resized cover (as displayed) 
+will be saved as a JPG within covers-scaled.
+
+
 For context view backdrops:
 
-...if MPD folder exists, is not specified as a http URL, and is readable, then
-   cantata will look for the following within the folder containing the song:
+...if MPD folder exists, is not specified as a http URL, and is readable, OR
+   the song's filename starts with '/', then cantata will look for the
+   following within the folder containing the song:
 
-1. ${currentArtist}-backdrop.jpg
-2. ${currentArtist}-backdrop.png
-3. backdrop.jpg
-4. backdrop.png
+ 1. ${currentArtist}-backdrop.jpg
+ 2. ${currentArtist}-backdrop.png
+ 3. backdrop.jpg
+ 4. backdrop.png
 
 ...the above will be repeated for the parent folder
 
+...if song is from a Various Artists album, or file is a non-MPD file, then
+   cantata will look for the following within the MPD root folder:
+
+ 5. ${currentArtist}/${currentArtist}-backdrop.jpg
+ 6. ${currentArtist}/${currentArtist}-backdrop.png
+ 7. ${currentArtist}/backdrop.jpg
+ 8. ${currentArtist}/backdrop.png
+
 ...then Cantata will check its cache folder (~/.cache/cantata/backdrops), for :
 
-5. ${currentArtist}.jpg
-6. ${currentArtist}.png
+ 9. ${currentArtist}.jpg
 
 ...internet services:
 
-7. MusizBrainz is queried for an artist ID. If returned, this artist ID is used
-   to locate a cover from fanart.tv
-8. Download image from discogs
+10. MusizBrainz is queried for an artist ID. If returned, this artist ID is used
+    to locate a cover from fanart.tv
+11. Download image from discogs
 
 ...lastly:
 
-9. If all the above fails, a backdrop is created from all the album covers
-   featuring the artist.
+12. If all the above fails, a backdrop is created from all the album covers
+    featuring the artist.
 
 Downloaded images will be saved as backdrop.jpg, within the artist folder
-if the current song is not from a Various Artists album, the folder heirarchy is
-2 levels (artist/album/) and the user has write permissions. If not, then they
-will be saved in Cantata's cache folder.
+if the current song is not from a Various Artists album, the file is from MPD,
+the folder hierarchy is 2 levels (artist/album/), and the user has write
+permissions. If not, then they will be saved in Cantata's cache folder.
 
 
 6. Advanced Config Items
@@ -277,7 +329,7 @@ Cantata contains a few advanced config items, for which there is currently no
 graphical way to control the setting. For these, you will need to edit
 Cantata's config by hand - whilst Cantata is NOT running!
 
-Under Linux, the Cantata config file will be either:
+Under Linux, the Cantata config file will be:
     Qt builds:  ~/.config/cantata/cantata.conf  ( Current User )
                 /etc/xdg/cantata.conf           ( All Users    )
     KDE builds: ~/.kde/share/config/cantatarc   ( Current User )
@@ -286,7 +338,7 @@ Under Linux, the Cantata config file will be either:
 The following config items should be added to the "[General]" section.
 
 iconTheme=<Icon theme name>
-    For Qt-only, Linux builds, this allows you to force cantata to use the
+    For Qt-only Linux builds, this allows you to force cantata to use the
     configured icon theme. This config is empty by default, and Cantata uses
     the system configured icon theme.
     
@@ -294,7 +346,7 @@ maxCoverFindPerIteration=<Integer>
     Controls the maximum number of covers that will attempted to be located per
     UI event loop iteration. This is set to 5 by default. Increasing this will
     cause more covers to be loaded in the main UI thread - which will speed up
-    loading, but might make the UI apear to block. Reducing this should reduce
+    loading, but might make the UI appear to block. Reducing this should reduce
     lag when scrolling the Albums view. (Values 0..20 are acceptable)
 
 maxCoverUpdatePerIteration=<Integer>
@@ -335,15 +387,40 @@ networkAccessEnabled=<Bool - true/false>
     Configure whether Cantata should be allowed to make networks requests - for
     accessing covers, etc. By default this is set to true.
 
-albumViewLoadAll=<Bool - true/false>
-    If set to true, then when the album view is shown it will request all covers
-    covers immediately - rather than waiting for the cover to be displayed.
-    Default is false.
-
 volumeStep=<Integer>
     Volume % increments. Used when mouse wheel is activated over volume control.
     Default is 5. (Values 1..20 are acceptable)
 
+undoSteps=<Integer>
+    Control maximum number of playqueue undo/redo steps. Set to 0 to disable
+    undo/redo.
+    Default is 10. (Values 0..20 are acceptable)
+
+mpdPoll=<Integer>
+    Specified in seconds, this controls how often Cantata should poll MPD to
+    determine its current state whilst playing. Set to 0 to disable polling,
+    and rely on MPD's IDLE mechanism to determine MPD state changes.
+    Default is 0 (no polling). (Values 0..60 are acceptable)
+
+mpdListSize=<Integer>
+    This config controls the maximum number of files sent in 1 chunk of an
+    "add" command when adding files to the playqueue.
+    Default is 10000. (Values 100..65535 are acceptable)
+
+alwaysUseHttp=<Boolean>
+    Set to 'true' to always serve non-MPD files via HTTP server. If set to
+    'false', then Cantata will only use its internal HTTP server for songs
+    from media devices, or when connected to MPD via a standard socket.
+    Default is false.
+
+alwaysUseLsInfo=<Boolean>
+    By default, Cantata uses MPD's listallinfo command to retrieve the whole
+    music collection. This can fail (especially with MPD 0.18.x which needs
+    more memory), and if it does Cantata will fall back to calling
+    "lsinfo <dir>" for each directory. Setting this config item to true will
+    cause Cantata to always use this alternative method.
+    Default is false.
+
 e.g.
 [General]
 iconTheme=oxygen
@@ -351,8 +428,12 @@ maxCoverFindPerIteration=5
 maxCoverUpdatePerIteration=5
 cueFileCodecs=GBK, big5-0
 networkAccessEnabled=false
-albumViewLoadAll=true
 volumeStep=2
+undoSteps=20
+mpdPoll=true
+mpdListSize=5000
+alwaysUseHttp=true
+alwaysUseLsInfo=true
 
 
 7. CUE Files
@@ -368,19 +449,19 @@ If the CUE file references an audio file that does not exist in the MPD music
 folder, then the CUE file contents will NOT be used.
 
 There is no reliable way for Cantata to ascertain the text encoding that a CUE
-file uses - so, for portabiity, it would be best if your CUE files used UTF-8
+file uses - so, for portability, it would be best if your CUE files used UTF-8
 encoding. When loading a CUE file, Cantata will attempt to load the file as if
 it was UTF-8 encoded, if this fails it will try with the "System" codec. You may
-add to this list of ecodings to try by using the 'cueFileCodecs' config item (as
-detailed in section 6 above). If Cantata fails with all configured encodings,
-then it will 'peek' at the 1st 1k bytes, and ask Qt to see if it can determine
-the encoding - and fallback to UTF-8 otherwise. (This 'peek'ing and fallback was
-how Cantata behaved in pre 1.2 versions - and is how Clementine behaves (where
-Cantata's CUE file support originates from.))
+add to this list of encodings to try by using the 'cueFileCodecs' config item
+(as detailed in section 6 above). If Cantata fails with all configured
+encodings, then it will 'peek' at the 1st 1k bytes, and ask Qt to see if it can
+determine the encoding - and fallback to UTF-8 otherwise. (This peeking and
+fallback was how Cantata behaved in pre 1.2 versions - and is how Clementine
+behaves (where Cantata's CUE file support originates from.))
 
 NOTE: If Cantata cannot access the CUE file (as MPD is running on a remote host,
 or you have not configured the music folder correctly, etc.) then Cantata will
-add the CUE File to album track listing.
+add the CUE File to the album's track listing.
 
 
 8. Streams
@@ -611,8 +692,8 @@ GetId
             PORT:<udp port>
 
     This should be the first call that a client makes to the dyanmizer. The
-    ID that is returned should then be used to confirm that UDP mutlicast
-    messages originateed from this instance. Both GROUP and PORT can then be
+    ID that is returned should then be used to confirm that UDP multicast
+    messages originated from this instance. Both GROUP and PORT can then be
     used to open a socket to listen for messages.
 
 GetStatus
@@ -719,11 +800,11 @@ The Cantata source folder contains the following structure:
     models     - Most models, apart from dynamic playlist and shortcut models
     mpd        - MPD related classes; connection, status, song, etc.
     network    - Generic Network classes (and proxy support for Qt builds)
-    online     - Jamendo, Magantune, and SoundCloud
+    online     - Jamendo, Magantune, SoundCloud, and Podcasts
     po         - Translations
     replaygain - ReplayGain calculation
     streams    - Internet radio streams
-    support    - Generic classes that /may/ be usefull to other projects.
+    support    - Generic classes that /may/ be useful to other projects.
                  Mainly used for Qt/KDE and Gtk support.
     tags       - Tag reading, editing, etc.
     widgets    - Widgets that are probably Cantata specific.
@@ -732,6 +813,9 @@ The Cantata source folder contains the following structure:
 Cantata's SVG icons have been 'cleaned' using:
   scour --strip-xml-prolog --indent=none -i in.svg -o out.svg
 
+Symbolc media icons are taken from gnome icon theme, but have been scaled with
+  rsvg-convert -a -w 128 -f svg in.svg -o out.svg
+
 
 13. Debug Logging
 =================
@@ -756,7 +840,7 @@ The following debug values may be used:
     Song Dialog file checks   2048 (Tag Editor, Track Organiser, etc)
     Network Access            4096
     Context lyrics            8192
-    Tag Reader/Writer        16384 (Only if built with external reader/writer)
+    Threads                  16384
 
 These values may be combined to enable multiple output. e.g. to enable MPD and
 covers logging:
@@ -774,7 +858,7 @@ C:\Users\USERNAME\AppData\Local\mpd\cantata\cache\cantata.log
 To disable logging to file, and log to the terminal instead, use a negative
 number. e.g. CANTATA_DEBUG=-4
 
-With windows builds, it is probably easier to ser the env var from a DOS
+With windows builds, it is probably easier to set the env var from a DOS
 command prompt box. e.g.:
 
     1. Run cmd.exe from start menu.
@@ -794,19 +878,20 @@ Cantata contains code/icons from:
     Amarok         - amarok.kde.org (Transcoding, Cover fetching code in cover
                      dialog)
     Clementine     - www.clementine-player.org (Lyrics searches, CUE file
-                     parsing, and digitally imported support)
+                     parsing, digitally imported support, and stretched header
+                     view)
     Be::MPC        - Wikipedia parsing code
     Quassel        - quassel-irc.org (Qt-only keyboard short-cut config support)
     Solid          - solid.kde.org (Device detection for Qt-only builds)
     Musique        - Copied code for Gtk theme detection
-    Ayatana Qt     - Overlay scrollbar code copied/modified from
-                     https://launchpad.net/ayatana-scrollbar-qt
     Asunder        - CDDB code
     libkcddb       - MusicBrainz code
     libebur128     - https://github.com/jiixyj/libebur128 (Replay gain
                      calculation)
     QJson          - JSON parser, taken from https://github.com/flavio/qjson
     IcoMoon        - http://icomoon.io/#icons (Monochrome sidebar icons)
+    Qxt            - Multi-media key support
+    QtSolutions    - QtIOCompressor, and QtSingleApplication
 
 
 15. Windows
diff --git a/TODO b/TODO
index c5699f1..167e8b0 100644
--- a/TODO
+++ b/TODO
@@ -1,52 +1,53 @@
 - Qt5 port
-  - Fix raising of mainwindow via dbus. (Qt5 no longer has QX11Info)
+  - After KDE Frameworks 5 is released, add CMake option to use system Solid
+    libraries.
 
 - Windows port
   - CMake scripts not working
+  - Build QtNetwork with SSL support? libeay32.dll and libssl32.dll will also
+    need to be supplied with installer.
+  - Port to Qt5. With Qt5.2 use QWinThumbnailToolButton 
 
-- Style
-  - Place SpinBox and OnOffButton in style?
-  - Overlay scrollbars
-    - Currently disabled (pass -DENABLE_OVERLAYSCROLLBARS=ON to cmake to enable)
-    - Updating slider value when os-thumb moves is not 100% correct, and not
-      consistent with Gtk
-    - Does not work for modal dialogs, or combo popups. (Probably due to not
-      having parent and modal event loop)
-    - Cant seem to re-enable Gtk2 overly scrollbars for actual Gtk dialogs.
-  - Using (any!) stylesheet causes pixel error in tabs
-
-- Covers
-  - Added code (#ifdef'ed out) to cache scaled covers.
-  - Need to save these in "covers-scaled"
-    - So that we can delete this cache without affecting covers!
-    - Cache page would need new entry for this
-  - Need to check responsiveness when loading LOTS of covers
-    - i.e. is it really any faster?
-  - Need to cater for cover updates.
-    - CoverDialog would need to delete items from "covers-scaled"
-  - How to detect when covers have been updated externally???
-
+- MacOS port
+  - Initial work imported into 1.2.0, however no builds were ever released. No
+    idea if this still compiles or not!
+ 
 - Streams
   - If radio stream is a playlist, Cantata currently only uses the 1st entry.
     Perhaps Cantata should loop over all entries until we find one that plays?
+  - last.fm streams?
+  - Move service json/xml response parsing into perl helper scripts?
 
-- Online
-  - DAAP servers? (Online or devices? Online as its read-only?)
+- Online services
+  - GPodder support?
+  - DAAP servers?
+  - Subsonic server? Mopidy can be used to access SubSonic.
 
 - Devices
-  - libMTP does not support album artist tag.
+  - libMTP does not support album artist tag. Cantata contains some
+    work-arounds for this (such as guessing the album-artist tag via the folder
+    structure, etc). These should be removed if libMTP ever supports album
+    artist.
   - Port to MTP DBus service when this is released.
-  - Allow to drag songs from albums/library to devices, and vice versa.
   - RemoteFsDevices
     - Cantata hangs if smb service is stopped before its un-mounted
   - Re-enable covers in sync dialog?
   - CD-Text?
-  - Fix time-remaining calculation.
-  - Seek support for AudioCDs
-  - Possible issues UDisks2, might not be able to get block device
+  - Fix time-remaining calculation in action dialog.
+  - Seek support for AudioCDs. Initial implementation works sometimes, but
+    other times the song is re-started. Not in build due to being too flaky.
+  - Possible issues with UDisks2, might not be able to get block device
     (e.g. /dev/sr0)?
   - Playback from MTP devices.
 
+- Mopdiy
+  - Currently does not send valid DB date time (always 0). Users will need to
+    force Cantata to update.
+  - Does not support 'update' command
+  - If the response of a stats call is all 0, then we assume the connection is
+    to a Mopdiy server. Therefore, when adding files (from devices) these are
+    encoded.
+
 - Lyrics
   - Add support for reading via tags in mp4, flac, and ogg files.
 
@@ -55,6 +56,16 @@
   - Add copy to device to context menu?
     - Will need to be careful that songs are not from device
     - Also, check that songs are not streams!
+  - When adding songs to playqueue, if a filter is active (genre, or text) then
+    we should only add songs that pass the filter
+    - Affects; Artists, Albums, Folders (text only), Playlists, Online, Devices,
+      Streams (text only)
+    - Would need to put the device/artist/album expansion code within proxy
+      models
+      - then we call filenames()/songs() on the proxy.
+    - NOT 100% sure. - as the items show #tracks, etc. If we are only going to
+      add so many tracks then this would also need to be updated. (As well as
+      tooltips). Again, this would need to be in the proxy model.
 
 - Cue files
   - How to (reliably) determine duration of last track?
@@ -68,5 +79,12 @@
   - mpdscribble management
   - mixramp tag calculation
   - mixramp MPD settings
-  - Combine 'Page' classes
+    - Does MPD need to be restarted to change settings?
+  - Create a base 'Page' class?
+  - Reduce memory usage - use QCache for artists and albums models?
+
+- Bugs
+  - Jamendo search sometimes causes crash (not seen for a while)
+  - Handle font (High DPI detection) and palette changes in custom widgets
+    (Volume control, time slider, etc)
 
diff --git a/cantata-play-audiocd.desktop b/cantata-play-audiocd.desktop
index b3ceff5..08d64c3 100644
--- a/cantata-play-audiocd.desktop
+++ b/cantata-play-audiocd.desktop
@@ -6,5 +6,6 @@ X-KDE-Priority=TopLevel
 
 [Desktop Action Play]
 Name=Play Audio CD with Cantata
+Name[de]=Audio CD mit Cantata abspielen
 Icon=cantata
 Exec=cantata cdda://?dev=%d
diff --git a/cantata.desktop b/cantata.desktop
index a4c3176..5a1c1ac 100644
--- a/cantata.desktop
+++ b/cantata.desktop
@@ -4,9 +4,10 @@ Name=Cantata
 GenericName=Music Player Client
 GenericName[bs]=Muzički player klijent
 GenericName[da]=Musik afspiller
+GenericName[de]=Grafischer Musik Player Client
 GenericName[es]=Cliente de reproducción de música
 GenericName[fi]=Musiikkisoitinasiakas
-GenericName[fr]=Client de lecture de musique 
+GenericName[fr]=Client de lecture de musique
 GenericName[gl]=Cliente de reprodución de música
 GenericName[hu]=Zenelejátszókliens
 GenericName[jv]=Musik Player Client
diff --git a/cantata.qrc b/cantata.qrc
index 6ae2012..75731a9 100644
--- a/cantata.qrc
+++ b/cantata.qrc
@@ -23,6 +23,7 @@
 <file alias="sidebar-playlists-dark">icons/sidebar-playlists-dark.svg</file>
 <file alias="sidebar-playqueue-dark">icons/sidebar-playqueue-dark.svg</file>
 <file alias="sidebar-streams-dark">icons/sidebar-streams-dark.svg</file>
+<file alias="sidebar-search-dark">icons/sidebar-search-dark.svg</file>
 <file alias="sidebar-albums-light">icons/sidebar-albums-light.svg</file>
 <file alias="sidebar-artists-light">icons/sidebar-artists-light.svg</file>
 <file alias="sidebar-devices-light">icons/sidebar-devices-light.svg</file>
@@ -33,6 +34,7 @@
 <file alias="sidebar-playlists-light">icons/sidebar-playlists-light.svg</file>
 <file alias="sidebar-playqueue-light">icons/sidebar-playqueue-light.svg</file>
 <file alias="sidebar-streams-light">icons/sidebar-streams-light.svg</file>
+<file alias="sidebar-search-light">icons/sidebar-search-light.svg</file>
 
 <file alias="soundcloud">online/icons/soundcloud.svg</file>
 <file alias="jamendo">online/icons/jamendo.svg</file>
diff --git a/cantata_media.qrc b/cantata_media.qrc
new file mode 100644
index 0000000..1748daf
--- /dev/null
+++ b/cantata_media.qrc
@@ -0,0 +1,20 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+<file alias="media-next-dark">icons/media-next-dark.svg</file>
+<file alias="media-next-rtl-dark">icons/media-next-rtl-dark.svg</file>
+<file alias="media-pause-dark">icons/media-pause-dark.svg</file>
+<file alias="media-play-dark">icons/media-play-dark.svg</file>
+<file alias="media-play-rtl-dark">icons/media-play-rtl-dark.svg</file>
+<file alias="media-prev-dark">icons/media-prev-dark.svg</file>
+<file alias="media-prev-rtl-dark">icons/media-prev-rtl-dark.svg</file>
+<file alias="media-stop-dark">icons/media-stop-dark.svg</file>
+<file alias="media-next-light">icons/media-next-light.svg</file>
+<file alias="media-next-rtl-light">icons/media-next-rtl-light.svg</file>
+<file alias="media-pause-light">icons/media-pause-light.svg</file>
+<file alias="media-play-light">icons/media-play-light.svg</file>
+<file alias="media-play-rtl-light">icons/media-play-rtl-light.svg</file>
+<file alias="media-prev-light">icons/media-prev-light.svg</file>
+<file alias="media-prev-rtl-light">icons/media-prev-rtl-light.svg</file>
+<file alias="media-stop-light">icons/media-stop-light.svg</file>
+</qresource>
+</RCC>
diff --git a/cantata_menu.qrc b/cantata_menu.qrc
new file mode 100644
index 0000000..84af5e9
--- /dev/null
+++ b/cantata_menu.qrc
@@ -0,0 +1,6 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+<file alias="menu-icon-dark">icons/menu-icon-dark.svg</file>
+<file alias="menu-icon-light">icons/menu-icon-light.svg</file>
+</qresource>
+</RCC>
diff --git a/cantata_qt.qrc b/cantata_qt.qrc
index c33162b..faff810 100644
--- a/cantata_qt.qrc
+++ b/cantata_qt.qrc
@@ -1,11 +1,5 @@
 <!DOCTYPE RCC><RCC version="1.0">
 <qresource>
 <file alias="cantata.svg">icons/cantata.svg</file>
-<file alias="cantata16.png">icons/cantata16.png</file>
-<file alias="cantata22.png">icons/cantata22.png</file>
-<file alias="cantata24.png">icons/cantata24.png</file>
-<file alias="cantata32.png">icons/cantata32.png</file>
-<file alias="cantata48.png">icons/cantata48.png</file>
-<file alias="cantata64.png">icons/cantata64.png</file>
 </qresource>
 </RCC>
diff --git a/cmake/FindMusicBrainz5.cmake b/cmake/FindMusicBrainz5.cmake
index 6ae7c93..b7dc7be 100644
--- a/cmake/FindMusicBrainz5.cmake
+++ b/cmake/FindMusicBrainz5.cmake
@@ -1,7 +1,7 @@
 # Module to find the musicbrainz-4 library
 #
 # It defines
-#  MUSICBRAINZ5_INCLUDE_DIR - the include dir
+#  MUSICBRAINZ5_INCLUDE_DIRS - the include dir
 #  MUSICBRAINZ5_LIBRARIES - the required libraries
 #  MUSICBRAINZ5_FOUND - true if both of the above have been found
 
@@ -10,17 +10,21 @@
 # Redistribution and use is allowed according to the terms of the BSD license.
 # For details see the accompanying COPYING-CMAKE-SCRIPTS file.
 
-if(MUSICBRAINZ5_INCLUDE_DIR AND MUSICBRAINZ5_LIBRARIES)
+if(MUSICBRAINZ5_INCLUDE_DIRS AND MUSICBRAINZ5_LIBRARIES)
    set(MUSICBRAINZ5_FIND_QUIETLY TRUE)
-endif(MUSICBRAINZ5_INCLUDE_DIR AND MUSICBRAINZ5_LIBRARIES)
+endif(MUSICBRAINZ5_INCLUDE_DIRS AND MUSICBRAINZ5_LIBRARIES)
 
-FIND_PATH(MUSICBRAINZ5_INCLUDE_DIR musicbrainz5/Disc.h)
-
-FIND_LIBRARY( MUSICBRAINZ5_LIBRARIES NAMES musicbrainz5)
+IF (NOT WIN32)
+   find_package(PkgConfig)
+   PKG_SEARCH_MODULE( MUSICBRAINZ5 libmusicbrainz5 )
+ELSE (NOT WIN32)
+  FIND_PATH( MUSICBRAINZ5_INCLUDE_DIRS musicbrainz5/Disc.h )
+  FIND_LIBRARY( MUSICBRAINZ5_LIBRARIES NAMES musicbrainz5 )
+ENDIF (NOT WIN32)
 
 include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args( MUSICBRAINZ5 DEFAULT_MSG
-                                   MUSICBRAINZ5_INCLUDE_DIR MUSICBRAINZ5_LIBRARIES)
+                                   MUSICBRAINZ5_INCLUDE_DIRS MUSICBRAINZ5_LIBRARIES)
 
-MARK_AS_ADVANCED(MUSICBRAINZ5_INCLUDE_DIR MUSICBRAINZ5_LIBRARIES)
+MARK_AS_ADVANCED(MUSICBRAINZ5_INCLUDE_DIRS MUSICBRAINZ5_LIBRARIES)
 
diff --git a/cmake/FindQJSON.cmake b/cmake/FindQJSON.cmake
new file mode 100644
index 0000000..28791ef
--- /dev/null
+++ b/cmake/FindQJSON.cmake
@@ -0,0 +1,14 @@
+# - Try to find QJSON
+# Once done this will define
+#
+#  QJSON_FOUND - system has QJson
+#  QJSON_INCLUDE_DIR - the libqjson include directory
+#  QJSON_LIBRARIES - The libqjson libraries
+
+find_path(QJSON_INCLUDE_DIR qjson/parser.h)
+find_library(QJSON_LIBRARIES qjson)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(QJSON DEFAULT_MSG QJSON_INCLUDE_DIR QJSON_LIBRARIES)
+
+mark_as_advanced(QJSON_INCLUDE_DIR QJSON_LIBRARIES)
diff --git a/config.h.cmake b/config.h.cmake
index e3aef70..c095d2d 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -17,6 +17,10 @@
 #define INSTALL_PREFIX "@CMAKE_INSTALL_PREFIX@"
 
 #cmakedefine ENABLE_DEVICES_SUPPORT 1
+#cmakedefine ENABLE_REMOTE_DEVICES 1
+#cmakedefine ENABLE_ONLINE_SERVICES 1
+#cmakedefine ENABLE_STREAMS 1
+#cmakedefine ENABLE_DYNAMIC 1
 #cmakedefine COMPLEX_TAGLIB_FILENAME 1
 #cmakedefine TAGLIB_FOUND 1
 #cmakedefine TAGLIB_EXTRAS_FOUND 1
@@ -32,18 +36,15 @@
 #cmakedefine MUSICBRAINZ5_FOUND 1
 #cmakedefine USE_SPEEX_RESAMPLER 1
 #cmakedefine ENABLE_REPLAYGAIN_SUPPORT 1
-#cmakedefine ENABLE_REMOTE_DEVICES 1
 #cmakedefine TAGLIB_CAN_SAVE_ID3VER 1
 #cmakedefine ENABLE_PROXY_CONFIG 1
 #cmakedefine ENABLE_EXTERNAL_TAGS 1
 #cmakedefine CDPARANOIA_HAS_CACHEMODEL_SIZE 1
 #cmakedefine QT_QTDBUS_FOUND 1
 #cmakedefine ENABLE_UNCACHED_MTP 1
+#cmakedefine ENABLE_HTTP_SERVER 1
+#cmakedefine ENABLE_MODEL_TEST 1
+#cmakedefine USE_SYSTEM_MENU_ICON 1
 
-/*
- This is done via CMake add_defintions - as it controls SLOT generation in GtkProxyStyle
- - hence adding _XXX
-*/
-#cmakedefine ENABLE_OVERLAYSCROLLBARS_XXX 1
 #endif
 
diff --git a/context/albumview.cpp b/context/albumview.cpp
index 31be462..23957bf 100644
--- a/context/albumview.cpp
+++ b/context/albumview.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -120,12 +120,14 @@ void AlbumView::update(const Song &song, bool force)
     if (song.isEmpty() || song.albumArtist().isEmpty() || song.album.isEmpty()) {
         currentSong=song;
         clearDetails();
+        abort();
         return;
     }
 
     if (force || song.albumArtist()!=currentSong.albumArtist() || song.album!=currentSong.album) {
         currentSong=song;
         currentArtist=currentSong.basicArtist();
+        abort();
         if (!isVisible()) {
             needToUpdate=true;
             return;
diff --git a/context/albumview.h b/context/albumview.h
index 4253628..967ae54 100644
--- a/context/albumview.h
+++ b/context/albumview.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/artistview.cpp b/context/artistview.cpp
index 3de8600..b7d2a12 100644
--- a/context/artistview.cpp
+++ b/context/artistview.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -134,6 +134,7 @@ void ArtistView::update(const Song &s, bool force)
         currentSong=s;
         engine->cancel();
         clear();
+        abort();
         return;
     }
 
@@ -143,6 +144,7 @@ void ArtistView::update(const Song &s, bool force)
 
     if (artistChanged) {
         artistAlbumsFirstTracks.clear();
+        abort();
     }
     if (!isVisible()) {
         if (artistChanged) {
@@ -334,7 +336,10 @@ void ArtistView::setBio()
     }
 
     if (!webLinks.isEmpty()) {
-        html+=View::subHeader(i18n("Web Links"))+QLatin1String("<ul>")+QString(webLinks).replace("${artist}", currentSong.artist)+QLatin1String("</ul>");
+        QString artist=currentSong.artist;
+        artist.replace(QLatin1Char('&'), QLatin1String("%26"));
+        artist.replace(QLatin1Char('?'), QLatin1String("%3f"));
+        html+=View::subHeader(i18n("Web Links"))+QLatin1String("<ul>")+QString(webLinks).replace("${artist}", artist)+QLatin1String("</ul>");
     }
 
     setHtml(html);
@@ -367,8 +372,7 @@ void ArtistView::abort()
 {
     engine->cancel();
     if (currentSimilarJob) {
-        disconnect(currentSimilarJob, SIGNAL(finished()), this, SLOT(handleSimilarReply()));
-        currentSimilarJob->abort();
+        currentSimilarJob->cancelAndDelete();
         currentSimilarJob=0;
     }
     hideSpinner();
diff --git a/context/artistview.h b/context/artistview.h
index 174b529..6190778 100644
--- a/context/artistview.h
+++ b/context/artistview.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/backdropcreator.cpp b/context/backdropcreator.cpp
index 0bbde74..e3fab0d 100644
--- a/context/backdropcreator.cpp
+++ b/context/backdropcreator.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/backdropcreator.h b/context/backdropcreator.h
index 4222db6..b8ea8f3 100644
--- a/context/backdropcreator.h
+++ b/context/backdropcreator.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/contextengine.cpp b/context/contextengine.cpp
index 40f987c..c98ffeb 100644
--- a/context/contextengine.cpp
+++ b/context/contextengine.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -61,7 +61,7 @@ QStringList ContextEngine::fixQuery(const QStringList &query) const
 void ContextEngine::cancel()
 {
     if (job) {
-        job->deleteLater();
+        job->cancelAndDelete();
         job=0;
     }
 }
diff --git a/context/contextengine.h b/context/contextengine.h
index 23b4d0c..c900019 100644
--- a/context/contextengine.h
+++ b/context/contextengine.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/contextsettings.cpp b/context/contextsettings.cpp
index 1a64ecd..878c196 100644
--- a/context/contextsettings.cpp
+++ b/context/contextsettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/contextsettings.h b/context/contextsettings.h
index 6cf8d6b..f29ab80 100644
--- a/context/contextsettings.h
+++ b/context/contextsettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/contextwidget.cpp b/context/contextwidget.cpp
index 13beb07..4c13dac 100644
--- a/context/contextwidget.cpp
+++ b/context/contextwidget.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -33,11 +33,15 @@
 #include "wikipediaengine.h"
 #include "localize.h"
 #include "backdropcreator.h"
+#include "sizewidget.h"
+#include "gtkstyle.h"
 #include "qjson/parser.h"
+#include "playqueueview.h"
+#include "treeview.h"
 #include <QHBoxLayout>
 #include <QGridLayout>
 #include <QSpacerItem>
-#include <QPainter>
+#include <QStylePainter>
 #if QT_VERSION >= 0x050000
 #include <QUrlQuery>
 #endif
@@ -45,14 +49,22 @@
 #include <QFile>
 #include <QWheelEvent>
 #include <QApplication>
+#ifndef SCALE_CONTEXT_BGND
 #include <QDesktopWidget>
-#include <QComboBox>
+#endif
 #include <QStackedWidget>
 #include <QAction>
 #include <QPair>
 #include <QImage>
+#include <QToolButton>
+#include <QStyleOptionToolButton>
+#include <QButtonGroup>
+#include <QWheelEvent>
 #include <qglobal.h>
 
+// Exported by QtGui
+void qt_blurImage(QPainter *p, QImage &blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0);
+
 #include <QDebug>
 static bool debugEnabled=false;
 #define DBUG if (debugEnabled) qWarning() << metaObject()->className() << __FUNCTION__
@@ -61,7 +73,7 @@ void ContextWidget::enableDebug()
     debugEnabled=true;
 }
 
-static const QString constBackdropName=QLatin1String("backdrop");
+const QLatin1String ContextWidget::constBackdropFileName("backdrop");
 //const QLatin1String ContextWidget::constHtbApiKey(0); // API key required
 const QLatin1String ContextWidget::constFanArtApiKey("ee86404cb429fa27ac32a1a3c117b006");
 const QLatin1String ContextWidget::constCacheDir("backdrops/");
@@ -72,14 +84,201 @@ static QString cacheFileName(const QString &artist, bool createDir)
     return Utils::cacheDir(ContextWidget::constCacheDir, createDir)+Covers::encodeName(artist)+".jpg";
 }
 
-static QImage setOpacity(const QImage &orig)
+#define SIMPLE_VSB
+
+class ViewSelectorButton : public QToolButton
+{
+public:
+    ViewSelectorButton(QWidget *p) : QToolButton(p) { }
+    void paintEvent(QPaintEvent *ev)
+    {
+        Q_UNUSED(ev)
+        QStylePainter painter(this);
+        QStyleOptionToolButton opt;
+        initStyleOption(&opt);
+        bool isOn=opt.state&QStyle::State_On;
+        bool isMo=opt.state&QStyle::State_MouseOver;
+        if (isOn || isMo) {
+            #ifdef SIMPLE_VSB
+            QColor col=palette().highlight().color();
+            col.setAlphaF(isMo && !isOn ? 0.15 : 0.35);
+            painter.fillRect(rect().adjusted(0, 1, 0, 0), col);
+            #else
+            QStyleOptionViewItemV4 styleOpt;
+            styleOpt.palette=opt.palette;
+            styleOpt.rect=rect().adjusted(0, 1, 0, 0);
+            styleOpt.state=opt.state;
+            styleOpt.state&=~(QStyle::State_Selected|QStyle::State_MouseOver);
+            styleOpt.state|=QStyle::State_Selected|QStyle::State_Enabled;
+            styleOpt.viewItemPosition = QStyleOptionViewItemV4::OnlyOne;
+            styleOpt.showDecorationSelected=true;
+
+            if (GtkStyle::isActive()) {
+                GtkStyle::drawSelection(styleOpt, &painter, isMo && !isOn ? 0.15 : 1.0);
+            } else {
+                if (isMo && !isOn) {
+                    QColor col(styleOpt.palette.highlight().color());
+                    col.setAlphaF(0.15);
+                    styleOpt.palette.setColor(styleOpt.palette.currentColorGroup(), QPalette::Highlight, col);
+                }
+                style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &styleOpt, &painter, 0);
+            }
+            #endif
+        }
+
+        int alignment = Qt::AlignCenter | Qt::TextShowMnemonic;
+        if (!style()->styleHint(QStyle::SH_UnderlineShortcut, &opt, this)) {
+            alignment |= Qt::TextHideMnemonic;
+        }
+
+        QString text=opt.text;
+        if (fontMetrics().width(text)>rect().width()) {
+            text=fontMetrics().elidedText(text, Qt::RightToLeft==layoutDirection() ? Qt::ElideLeft : Qt::ElideRight, rect().width());
+        }
+        #ifdef SIMPLE_VSB
+        painter.drawItemText(rect(), alignment, opt.palette, true, text, QPalette::WindowText);
+        #else
+        if (isOn) {
+            opt.state|=QStyle::State_Selected;
+        }
+        painter.drawItemText(rect(), alignment, opt.palette, true, text, isOn ? QPalette::HighlightedText : QPalette::WindowText);
+        #endif
+    }
+};
+
+static const char *constDataProp="view-data";
+
+ViewSelector::ViewSelector(QWidget *p)
+    : QWidget(p)
+{
+    group=new QButtonGroup(this);
+    setFixedHeight(SizeWidget::standardHeight());
+}
+
+void ViewSelector::addItem(const QString &label, const QVariant &data)
+{
+    QHBoxLayout *l;
+    if (buttons.isEmpty()) {
+        l = new QHBoxLayout(this);
+        l->setMargin(0);
+        l->setSpacing(0);
+    } else {
+        l=static_cast<QHBoxLayout *>(layout());
+    }
+    QToolButton *button=new ViewSelectorButton(this);
+    button->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+    button->setAutoRaise(true);
+    button->setText(label);
+    button->setCheckable(true);
+    button->setProperty(constDataProp, data);
+    connect(button, SIGNAL(toggled(bool)), this, SLOT(buttonActivated()));
+    buttons.append(button);
+    group->addButton(button);
+    l->addWidget(button);
+}
+
+void ViewSelector::buttonActivated()
+{
+    QToolButton *button=qobject_cast<QToolButton *>(sender());
+    if (!button) {
+        return;
+    }
+
+    if (button->isChecked()) {
+        QFont f(font());
+        f.setBold(true);
+        button->setFont(f);
+        emit activated(buttons.indexOf(button));
+    } else {
+        button->setFont(font());
+    }
+}
+
+QVariant ViewSelector::itemData(int index) const
+{
+    return index>=0 && index<buttons.count() ? buttons.at(index)->property(constDataProp) : QVariant();
+}
+
+int ViewSelector::currentIndex() const
+{
+    for (int i=0; i<buttons.count(); ++i) {
+        if (buttons.at(i)->isChecked()) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+void ViewSelector::setCurrentIndex(int index)
+{
+    QFont f(font());
+    for (int i=0; i<buttons.count(); ++i) {
+        QToolButton *btn=buttons.at(i);
+        bool wasChecked=btn->isChecked();
+        btn->setChecked(i==index);
+        if (i==index) {
+            QFont bf(f);
+            bf.setBold(true);
+            btn->setFont(bf);
+            emit activated(i);
+        } else if (wasChecked) {
+            btn->setFont(f);
+        }
+    }
+}
+
+void ViewSelector::wheelEvent(QWheelEvent *ev)
 {
-    QImage img=QImage::Format_ARGB32==orig.format() ? orig : orig.convertToFormat(QImage::Format_ARGB32);
-    uchar *bits = img.bits();
-    for (int i = 0; i < img.height()*img.bytesPerLine(); i+=4) {
-        bits[i+3] = constBgndOpacity*255;
+    int numDegrees = ev->delta() / 8;
+    int numSteps = numDegrees / 15;
+    if (numSteps > 0) {
+        for (int i = 0; i < numSteps; ++i) {
+            int index=currentIndex();
+            setCurrentIndex(index==count()-1 ? 0 : index+1);
+        }
+    } else {
+        for (int i = 0; i > numSteps; --i) {
+            int index=currentIndex();
+            setCurrentIndex(index==0 ? count()-1 : index-1);
+        }
     }
-    return img;
+}
+
+static void drawFadedLine(QPainter *p, const QRect &r, const QColor &col)
+{
+    QPoint start(r.x(), r.y());
+    QPoint end(r.x()+r.width()-1, r.y()+r.height()-1);
+    QLinearGradient grad(start, end);
+    QColor c(col);
+    c.setAlphaF(0.45);
+    QColor fade(c);
+    const int fadeSize=Utils::isHighDpi() ? 64 : 32;
+    double fadePos=1.0-((r.width()-(fadeSize*2))/(r.width()*1.0));
+
+    fade.setAlphaF(0.0);
+    if(fadePos>=0 && fadePos<=1.0) {
+        grad.setColorAt(0, fade);
+        grad.setColorAt(fadePos, c);
+    } else {
+        grad.setColorAt(0, c);
+    }
+    if(fadePos>=0 && fadePos<=1.0) {
+        grad.setColorAt(1.0-fadePos, c);
+        grad.setColorAt(1, fade);
+    } else {
+        grad.setColorAt(1, c);
+    }
+    p->setPen(QPen(QBrush(grad), 1));
+    p->drawLine(start, end);
+}
+
+void ViewSelector::paintEvent(QPaintEvent *ev)
+{
+    QWidget::paintEvent(ev);
+    QPainter p(this);
+    QRect r=rect();
+    r.setHeight(1);
+    drawFadedLine(&p, r, palette().foreground().color());
 }
 
 static QColor splitterColor;
@@ -181,15 +380,18 @@ void ThinSplitter::reset()
 ContextWidget::ContextWidget(QWidget *parent)
     : QWidget(parent)
     , job(0)
-    , drawBackdrop(true)
+    , alwaysCollapsed(false)
+    , backdropType(true)
     , darkBackground(false)
 //    , useHtBackdrops(0!=constHtbApiKey.latin1())
     , useFanArt(0!=constFanArtApiKey.latin1())
+    , albumCoverBackdrop(false)
+    , oldIsAlbumCoverBackdrop(false)
     , fadeValue(0)
     , isWide(false)
     , stack(0)
     , splitter(0)
-    , viewCombo(0)
+    , viewSelector(0)
     , creator(0)
 {
     animator.setPropertyName("fade");
@@ -212,6 +414,8 @@ ContextWidget::ContextWidget(QWidget *parent)
     setZoom();
     setWide(true);
     splitterColor=palette().text().color();
+
+    #ifndef SCALE_CONTEXT_BGND
     QDesktopWidget *dw=QApplication::desktop();
     if (dw) {
         QSize geo=dw->availableGeometry(this).size()-QSize(32, 64);
@@ -226,6 +430,7 @@ ContextWidget::ContextWidget(QWidget *parent)
         minBackdropSize=QSize(1024, 768);
         maxBackdropSize=QSize(minBackdropSize.width()*2, minBackdropSize.height()*2);
     }
+    #endif
 }
 
 void ContextWidget::setZoom()
@@ -255,7 +460,7 @@ void ContextWidget::setWide(bool w)
         l->setMargin(0);
         if (stack) {
             stack->setVisible(false);
-            viewCombo->setVisible(false);
+            viewSelector->setVisible(false);
             stack->removeWidget(artist);
             stack->removeWidget(album);
             stack->removeWidget(song);
@@ -301,18 +506,18 @@ void ContextWidget::setWide(bool w)
         if (!stack) {
             stack=new QStackedWidget(this);
         }
-        if (!viewCombo) {
-            viewCombo=new QComboBox(this);
-            viewCombo->addItem(i18n("Artist Information"), "artist");
-            viewCombo->addItem(i18n("Album Information"), "album");
-            viewCombo->addItem(i18n("Lyrics"), "song");
-            connect(viewCombo, SIGNAL(activated(int)), stack, SLOT(setCurrentIndex(int)));
+        if (!viewSelector) {
+            viewSelector=new ViewSelector(this);
+            viewSelector->addItem(i18n("&Artist"), "artist");
+            viewSelector->addItem(i18n("Al&bum"), "album");
+            viewSelector->addItem(i18n("&Lyrics"), "song");
+            connect(viewSelector, SIGNAL(activated(int)), stack, SLOT(setCurrentIndex(int)));
         }
         if (splitter) {
             splitter->setVisible(false);
         }
         stack->setVisible(true);
-        viewCombo->setVisible(true);
+        viewSelector->setVisible(true);
         artist->setParent(stack);
         album->setParent(stack);
         song->setParent(stack);
@@ -321,12 +526,12 @@ void ContextWidget::setWide(bool w)
         stack->addWidget(song);
         l->addItem(new QSpacerItem(m, m, QSizePolicy::Fixed, QSizePolicy::Fixed), 0, 0, 1, 1);
         l->addWidget(stack, 0, 1, 1, 1);
-        l->addWidget(viewCombo, 1, 0, 1, 2);
+        l->addWidget(viewSelector, 1, 0, 1, 2);
         QString lastSaved=Settings::self()->contextSlimPage();
         if (!lastSaved.isEmpty()) {
-            for (int i=0; i<viewCombo->count(); ++i) {
-                if (viewCombo->itemData(i).toString()==lastSaved) {
-                    viewCombo->setCurrentIndex(i);
+            for (int i=0; i<viewSelector->count(); ++i) {
+                if (viewSelector->itemData(i).toString()==lastSaved) {
+                    viewSelector->setCurrentIndex(i);
                     stack->setCurrentIndex(i);
                     break;
                 }
@@ -338,42 +543,71 @@ void ContextWidget::setWide(bool w)
 void ContextWidget::resizeEvent(QResizeEvent *e)
 {
     if (isVisible()) {
-        setWide(width()>minWidth);
+        setWide(width()>minWidth && !alwaysCollapsed);
     }
+    #ifdef SCALE_CONTEXT_BGND
+    resizeBackdrop();
+    #endif
     QWidget::resizeEvent(e);
 }
 
 void ContextWidget::readConfig()
 {
-    useBackdrop(Settings::self()->contextBackdrop());
+    int origOpacity=backdropOpacity;
+    int origBlur=backdropBlur;
+    QString origCustomBackdropFile=customBackdropFile;
+    int origType=backdropType;
+    backdropType=Settings::self()->contextBackdrop();
+    backdropOpacity=Settings::self()->contextBackdropOpacity();
+    backdropBlur=Settings::self()->contextBackdropBlur();
+    customBackdropFile=Settings::self()->contextBackdropFile();
+    switch (backdropType) {
+    case PlayQueueView::BI_None:
+        if (origType!=backdropType && isVisible() && !currentArtist.isEmpty()) {
+            updateArtist=currentArtist;
+            currentArtist.clear();
+            updateBackdrop();
+            QWidget::update();
+        }
+        break;
+    case PlayQueueView::BI_Cover:
+        if (origType!=backdropType || backdropOpacity!=origOpacity || backdropBlur!=origBlur) {
+            if (isVisible() && !currentArtist.isEmpty()) {
+                updateArtist=currentArtist;
+                currentArtist.clear();
+                updateBackdrop();
+                QWidget::update();
+            }
+        }
+        break;
+   case PlayQueueView::BI_Custom:
+        if (origType!=backdropType || backdropOpacity!=origOpacity || backdropBlur!=origBlur || origCustomBackdropFile!=customBackdropFile) {            
+            updateImage(QImage(customBackdropFile), true);
+            artistsCreatedBackdropsFor.clear();
+        }
+        break;
+    }
+
     useDarkBackground(Settings::self()->contextDarkBackground());
     WikipediaEngine::setIntroOnly(Settings::self()->wikipediaIntroOnly());
+    bool wasCollpased=stack && stack->isVisible();
+    alwaysCollapsed=Settings::self()->contextAlwaysCollapsed();
+    if (alwaysCollapsed && !wasCollpased) {
+        setWide(false);
+    }
 }
 
 void ContextWidget::saveConfig()
 {
     Settings::self()->saveContextZoom(artist->getZoom());
-    if (viewCombo) {
-        Settings::self()->saveContextSlimPage(viewCombo->itemData(viewCombo->currentIndex()).toString());
+    if (viewSelector) {
+        Settings::self()->saveContextSlimPage(viewSelector->itemData(viewSelector->currentIndex()).toString());
     }
     if (splitter) {
         Settings::self()->saveContextSplitterState(splitter->saveState());
     }
 }
 
-void ContextWidget::useBackdrop(bool u)
-{
-    if (u!=drawBackdrop) {
-        drawBackdrop=u;
-        if (isVisible() && !currentArtist.isEmpty()) {
-            updateArtist=currentArtist;
-            currentArtist.clear();
-            updateBackdrop();
-            QWidget::update();
-        }
-    }
-}
-
 void ContextWidget::useDarkBackground(bool u)
 {
     if (u!=darkBackground) {
@@ -388,7 +622,7 @@ void ContextWidget::useDarkBackground(bool u)
             QColor linkVisited(164, 164, 164);
             pal.setColor(QPalette::Window, dark);
             pal.setColor(QPalette::Base, dark);
-            // Dont globally change window/button text - else this can mess up scrollbar buttons
+            // Dont globally change window/button text - because this can mess up scrollbar buttons
             // with some styles (e.g. plastique)
 //            pal.setColor(QPalette::WindowText, light);
 //            pal.setColor(QPalette::ButtonText, light);
@@ -413,8 +647,8 @@ void ContextWidget::useDarkBackground(bool u)
 
 void ContextWidget::showEvent(QShowEvent *e)
 {
-    setWide(width()>minWidth);
-    if (drawBackdrop) {
+    setWide(width()>minWidth && !alwaysCollapsed);
+    if (backdropType) {
         updateBackdrop();
     }
     QWidget::showEvent(e);
@@ -425,22 +659,32 @@ void ContextWidget::paintEvent(QPaintEvent *e)
     QPainter p(this);
     QRect r(rect());
 
-    if (!isWide && viewCombo) {
+    if (!isWide && viewSelector) {
         int space=2; // fontMetrics().height()/4;
-        r.adjust(0, 0, 0, -(viewCombo->rect().height()+space));
+        r.adjust(0, 0, 0, -(viewSelector->rect().height()+space));
     }
     if (darkBackground) {
         p.fillRect(r, palette().background().color());
     }
-    if (drawBackdrop) {
+    if (backdropType) {
         if (!oldBackdrop.isNull()) {
             if (!qFuzzyCompare(fadeValue, qreal(0.0))) {
                 p.setOpacity(1.0-fadeValue);
             }
+            #ifdef SCALE_CONTEXT_BGND
+            if (!oldIsAlbumCoverBackdrop && oldBackdrop.height()<height()) {
+                p.drawPixmap(0, (height()-oldBackdrop.height())/2, oldBackdrop);
+            } else
+            #endif
             p.fillRect(r, QBrush(oldBackdrop));
         }
         if (!currentBackdrop.isNull()) {
             p.setOpacity(fadeValue);
+            #ifdef SCALE_CONTEXT_BGND
+            if (!albumCoverBackdrop && currentBackdrop.height()<height()) {
+                p.drawPixmap(0, (height()-currentBackdrop.height())/2, currentBackdrop);
+            } else
+            #endif
             p.fillRect(r, QBrush(currentBackdrop));
         }
 //        if (!backdropText.isEmpty() && isWide) {
@@ -465,16 +709,18 @@ void ContextWidget::setFade(float value)
         fadeValue = value;
         if (qFuzzyCompare(fadeValue, qreal(1.0))) {
             oldBackdrop=QPixmap();
+            oldIsAlbumCoverBackdrop=false;
         }
         QWidget::update();
     }
 }
 
-void ContextWidget::updateImage(const QImage &img, bool created)
+void ContextWidget::updateImage(QImage img, bool created)
 {
     DBUG << img.isNull() << currentBackdrop.isNull();
 //    backdropText=currentArtist;
     oldBackdrop=currentBackdrop;
+    oldIsAlbumCoverBackdrop=albumCoverBackdrop;
     currentBackdrop=QPixmap();
     animator.stop();
     if (img.isNull()) {
@@ -484,21 +730,25 @@ void ContextWidget::updateImage(const QImage &img, bool created)
         return;
     }
     if (!img.isNull()) {
-        currentBackdrop=QPixmap::fromImage(setOpacity(img));
-    }
-
-    if (!currentBackdrop.isNull() && !created) {
-        if (currentBackdrop.width()<minBackdropSize.width() && currentBackdrop.height()<minBackdropSize.height()) {
-            QSize size(minBackdropSize);
-            if (currentBackdrop.width()<minBackdropSize.width()/4 && currentBackdrop.height()<minBackdropSize.height()/4) {
-                size=QSize(minBackdropSize.width()/2, minBackdropSize.height()/2);
-            }
-            currentBackdrop=currentBackdrop.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-        } else if (maxBackdropSize.width()>1024 && maxBackdropSize.height()>768 &&
-                   (currentBackdrop.width()>maxBackdropSize.width() || currentBackdrop.height()>maxBackdropSize.height())) {
-            currentBackdrop=currentBackdrop.scaled(maxBackdropSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+        if (backdropOpacity<100) {
+            img=TreeView::setOpacity(img, (backdropOpacity*1.0)/100.0);
+        }
+        if (backdropBlur>0) {
+            QImage blurred(img.size(), QImage::Format_ARGB32_Premultiplied);
+            blurred.fill(Qt::transparent);
+            QPainter painter(&blurred);
+            qt_blurImage(&painter, img, backdropBlur, true, false);
+            painter.end();
+            img = blurred;
         }
+        #ifdef SCALE_CONTEXT_BGND
+        currentImage=img;
+        #else
+        currentBackdrop=QPixmap::fromImage(img);
+        #endif
     }
+    albumCoverBackdrop=created;
+    resizeBackdrop();
 
     fadeValue=0.0;
     animator.setDuration(250);
@@ -528,13 +778,16 @@ void ContextWidget::update(const Song &s)
         }
     }
 
+    if (s.albumArtist()!=currentSong.albumArtist()) {
+        cancel();
+    }
     artist->update(sng);
     album->update(sng);
     song->update(sng);
     currentSong=s;
 
     updateArtist=Covers::fixArtist(sng.basicArtist());
-    if (isVisible() && drawBackdrop) {
+    if (isVisible() && PlayQueueView::BI_Cover==backdropType) {
         updateBackdrop();
     }
 }
@@ -558,7 +811,7 @@ bool ContextWidget::eventFilter(QObject *o, QEvent *e)
 void ContextWidget::cancel()
 {
     if (job) {
-        job->deleteLater();
+        job->cancelAndDelete();
         job=0;
     }
 }
@@ -577,16 +830,19 @@ void ContextWidget::updateBackdrop()
         return;
     }
 
-    if (!currentSong.isStream() && MPDConnection::self()->getDetails().dirReadable) {
-        QString dirName=MPDConnection::self()->getDetails().dir;
-        if (!dirName.isEmpty() && !dirName.startsWith(QLatin1String("http:/"))) {
+    QString encoded=Covers::encodeName(currentArtist);
+    QStringList names=QStringList() << encoded+"-"+constBackdropFileName+".jpg" << encoded+"-"+constBackdropFileName+".png"
+                                    << constBackdropFileName+".jpg" << constBackdropFileName+".png";
+
+    if (!currentSong.isStream()) {
+        bool localNonMpd=currentSong.file.startsWith(Utils::constDirSep);
+        QString dirName=localNonMpd ? QString() : MPDConnection::self()->getDetails().dir;
+        if (localNonMpd || (!dirName.isEmpty() && !dirName.startsWith(QLatin1String("http:/")) && MPDConnection::self()->getDetails().dirReadable)) {
             dirName+=Utils::getDir(currentSong.file);
-            QString encoded=Covers::encodeName(currentArtist);
-            QStringList names=QStringList() << encoded+"-"+constBackdropName+".jpg" << encoded+"-"+constBackdropName+".png"
-                                            << constBackdropName+".jpg" << constBackdropName+".png";
+
             for (int level=0; level<2; ++level) {
                 foreach (const QString &fileName, names) {
-                    DBUG << "Checking file" << QString(dirName+fileName);
+                    DBUG << "Checking file(1)" << QString(dirName+fileName);
                     if (QFile::exists(dirName+fileName)) {
                         QImage img(dirName+fileName);
 
@@ -605,6 +861,28 @@ void ContextWidget::updateBackdrop()
         }
     }
 
+    // For various artists tracks, or for non-MPD files, see if we have a matching backdrop in MPD.
+    // e.g. artist=Wibble, look for $mpdDir/Wibble/backdrop.png
+    if (currentSong.isVariousArtists() || currentSong.isNonMPD()) {
+        QString dirName=MPDConnection::self()->getDetails().dirReadable ? MPDConnection::self()->getDetails().dir : QString();
+        if (!dirName.isEmpty() && !dirName.startsWith(QLatin1String("http:/"))) {
+            dirName+=currentArtist+Utils::constDirSep;
+            foreach (const QString &fileName, names) {
+                DBUG << "Checking file(2)" << QString(dirName+fileName);
+                if (QFile::exists(dirName+fileName)) {
+                    QImage img(dirName+fileName);
+
+                    if (!img.isNull()) {
+                        DBUG << "Got backdrop from" << QString(dirName+fileName);
+                        updateImage(img);
+                        QWidget::update();
+                        return;
+                    }
+                }
+            }
+        }
+    }
+
     QString cacheName=cacheFileName(currentArtist, false);
     QImage img(cacheName);
     if (img.isNull()) {
@@ -628,35 +906,13 @@ void ContextWidget::getBackdrop()
     cancel();
     if (artistsCreatedBackdropsFor.contains(currentArtist)) {
         createBackdrop();
-    } else /*if (useHtBackdrops) {
-        getHtBackdrop();
-    } else*/ if (useFanArt) {
+    } else if (useFanArt) {
         getFanArtBackdrop();
     } else {
         getDiscoGsImage();
     }
 }
 
-//void ContextWidget::getHtBackdrop()
-//{
-//    QUrl url("http://htbackdrops.com/api/"+constHtbApiKey+"/searchXML");
-//    #if QT_VERSION < 0x050000
-//    QUrl &q=url;
-//    #else
-//    QUrlQuery q;
-//    #endif
-
-//    q.addQueryItem(QLatin1String("keywords"), fixArtist(currentArtist));
-//    q.addQueryItem(QLatin1String("default_operator"), QLatin1String("and"));
-//    q.addQueryItem(QLatin1String("fields"), QLatin1String("title"));
-//    #if QT_VERSION >= 0x050000
-//    url.setQuery(q);
-//    #endif
-//    job=NetworkAccessManager::self()->get(url, 5000);
-//    DBUG << url.toString();
-//    connect(job, SIGNAL(finished()), this, SLOT(htBackdropsResponse()));
-//}
-
 void ContextWidget::getFanArtBackdrop()
 {
     // First we need to query musicbrainz to get id
@@ -708,57 +964,6 @@ void ContextWidget::getDiscoGsImage()
     connect(job, SIGNAL(finished()), this, SLOT(discoGsResponse()));
 }
 
-//void ContextWidget::htBackdropsResponse()
-//{
-//    NetworkJob *reply = getReply(sender());
-//    if (!reply) {
-//        return;
-//    }
-
-//    DBUG << "status" << reply->error() << reply->errorString();
-
-//    QString id;
-//    if (reply->ok()) {
-//        QXmlStreamReader xml(reply);
-//        while (!xml.atEnd() && !xml.hasError() && id.isEmpty()) {
-//            xml.readNext();
-//            if (xml.isStartElement() && QLatin1String("search")==xml.name()) {
-//                while (xml.readNextStartElement() && id.isEmpty()) {
-//                    if (xml.isStartElement() && QLatin1String("images")==xml.name()) {
-//                        while (xml.readNextStartElement() && id.isEmpty()) {
-//                            if (xml.isStartElement() && QLatin1String("image")==xml.name()) {
-//                                while (xml.readNextStartElement() && id.isEmpty()) {
-//                                    if (xml.isStartElement() && QLatin1String("id")==xml.name()) {
-//                                        id=xml.readElementText();
-//                                    } else {
-//                                        xml.skipCurrentElement();
-//                                    }
-//                                }
-//                            } else {
-//                                xml.skipCurrentElement();
-//                            }
-//                        }
-//                    } else {
-//                        xml.skipCurrentElement();
-//                    }
-//                }
-//            }
-//        }
-//    } else if (NetworkJob::OperationCanceledError==reply->error()) {
-//        // We timed out, someting wrong with htbackdrops? Jsut use auto-generated backdrops for now...
-//        useHtBackdrops=false;
-//    }
-
-//    if (id.isEmpty()) {
-//        getDiscoGsImage();
-//    } else {
-//        QUrl url("http://htbackdrops.com/api/"+constHtbApiKey+"/download/"+id+"/fullsize");
-//        job=NetworkAccessManager::self()->get(url);
-//        DBUG << url.toString();
-//        connect(job, SIGNAL(finished()), this, SLOT(downloadResponse()));
-//    }
-//}
-
 void ContextWidget::musicbrainzResponse()
 {
     NetworkJob *reply = getReply(sender());
@@ -960,14 +1165,14 @@ void ContextWidget::downloadResponse()
         updateImage(img);
         bool saved=false;
 
-        if (Settings::self()->storeBackdropsInMpdDir() && !currentSong.isVariousArtists() && !currentSong.isStream() &&
-            !currentSong.isCdda() && MPDConnection::self()->getDetails().dirReadable) {
+        if (Settings::self()->storeBackdropsInMpdDir() && !currentSong.isVariousArtists() &&
+            !currentSong.isNonMPD() && MPDConnection::self()->getDetails().dirReadable) {
             QString mpdDir=MPDConnection::self()->getDetails().dir;
             QString songDir=Utils::getDir(currentSong.file);
             if (!mpdDir.isEmpty() && 2==songDir.split(Utils::constDirSep, QString::SkipEmptyParts).count()) {
                 QDir d(mpdDir+songDir);
                 d.cdUp();
-                QString fileName=Utils::fixPath(d.absolutePath())+constBackdropName+".jpg";
+                QString fileName=Utils::fixPath(d.absolutePath())+constBackdropFileName+".jpg";
                 QFile f(fileName);
                 if (f.open(QIODevice::WriteOnly)) {
                     f.write(data);
@@ -981,8 +1186,8 @@ void ContextWidget::downloadResponse()
             }
         } else {
             DBUG << "Not saving to mpd folder - set to save in mpd?" << Settings::self()->storeBackdropsInMpdDir()
-                 << "isVa:" << currentSong.isVariousArtists() << "isStream:" << currentSong.isStream()
-                 << "isCdda:" << currentSong.isCdda()  << "mpd readable:" << MPDConnection::self()->getDetails().dirReadable;
+                 << "isVa:" << currentSong.isVariousArtists() << "isNonMPD:" << currentSong.isNonMPD()
+                 << "mpd readable:" << MPDConnection::self()->getDetails().dirReadable;
         }
 
         if (!saved) {
@@ -1019,6 +1224,29 @@ void ContextWidget::createBackdrop()
     }
 }
 
+void ContextWidget::resizeBackdrop()
+{
+    #ifdef SCALE_CONTEXT_BGND
+    if (!albumCoverBackdrop && !currentImage.isNull() &&( currentBackdrop.isNull() || (!currentBackdrop.isNull() && currentBackdrop.width()!=width()))) {
+        QSize sz(width(), width()*currentImage.height()/currentImage.width());
+        currentBackdrop = QPixmap::fromImage(currentImage.scaled(sz, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation));
+    }
+    #else
+    if (!currentBackdrop.isNull() && !albumCoverBackdrop) {
+        if (currentBackdrop.width()<minBackdropSize.width() && currentBackdrop.height()<minBackdropSize.height()) {
+            QSize size(minBackdropSize);
+            if (currentBackdrop.width()<minBackdropSize.width()/4 && currentBackdrop.height()<minBackdropSize.height()/4) {
+                size=QSize(minBackdropSize.width()/2, minBackdropSize.height()/2);
+            }
+            currentBackdrop=currentBackdrop.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+        } else if (maxBackdropSize.width()>1024 && maxBackdropSize.height()>768 &&
+                   (currentBackdrop.width()>maxBackdropSize.width() || currentBackdrop.height()>maxBackdropSize.height())) {
+            currentBackdrop=currentBackdrop.scaled(maxBackdropSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+        }
+    }
+    #endif
+}
+
 void ContextWidget::backdropCreated(const QString &artist, const QImage &img)
 {
     DBUG << artist << img.isNull() << currentArtist;
diff --git a/context/contextwidget.h b/context/contextwidget.h
index ce39e34..4355f24 100644
--- a/context/contextwidget.h
+++ b/context/contextwidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -31,6 +31,10 @@
 #include <QSplitter>
 #include "song.h"
 
+#ifndef SCALE_CONTEXT_BGND
+#define SCALE_CONTEXT_BGND
+#endif
+
 class ArtistView;
 class AlbumView;
 class SongView;
@@ -39,6 +43,36 @@ class NetworkJob;
 class QStackedWidget;
 class QComboBox;
 class QImage;
+class QToolButton;
+class QButtonGroup;
+class QWheelEvent;
+
+class ViewSelector : public QWidget
+{
+    Q_OBJECT
+public:
+    ViewSelector(QWidget *p);
+    virtual ~ViewSelector() { }
+    void addItem(const QString &label, const QVariant &data);
+    QVariant itemData(int index) const;
+    int count() { return buttons.count(); }
+    int currentIndex() const;
+    void setCurrentIndex(int index);
+
+private:
+    void wheelEvent(QWheelEvent *ev);
+    void paintEvent(QPaintEvent *ev);
+
+private Q_SLOTS:
+    void buttonActivated();
+
+Q_SIGNALS:
+    void activated(int);
+
+private:
+    QButtonGroup *group;
+    QList<QToolButton *> buttons;
+};
 
 class ThinSplitter : public QSplitter
 {
@@ -59,22 +93,21 @@ class ContextWidget : public QWidget
 public:
     static void enableDebug();
 
+    static const QLatin1String constBackdropFileName;
     static const QLatin1String constCacheDir;
-//    static const QLatin1String constHtbApiKey;
     static const QLatin1String constFanArtApiKey;
 
     ContextWidget(QWidget *parent=0);
 
     void readConfig();
     void saveConfig();
-    void useBackdrop(bool u);
     void useDarkBackground(bool u);
     void update(const Song &s);
     void showEvent(QShowEvent *e);
     void paintEvent(QPaintEvent *e);
     float fade() { return fadeValue; }
     void setFade(float value);
-    void updateImage(const QImage &img, bool created=false);
+    void updateImage(QImage img, bool created=false);
     void search();
 
 Q_SIGNALS:
@@ -84,7 +117,6 @@ Q_SIGNALS:
     void createBackdrop(const QString &artist, const QList<Song> &songs);
 
 private Q_SLOTS:
-//    void htBackdropsResponse();
     void musicbrainzResponse();
     void fanArtResponse();
     void discoGsResponse();
@@ -99,20 +131,28 @@ private:
     void cancel();
     void updateBackdrop();
     void getBackdrop();
-//    void getHtBackdrop();
     void getFanArtBackdrop();
     void getMusicbrainzId(const QString &artist);
     void getDiscoGsImage();
     void createBackdrop();
+    void resizeBackdrop();
     NetworkJob * getReply(QObject *obj);
 
 private:
     NetworkJob *job;
-    bool drawBackdrop;
+    bool alwaysCollapsed;
+    int backdropType;
+    int backdropOpacity;
+    int backdropBlur;
+    QString customBackdropFile;
     bool darkBackground;
-//    bool useHtBackdrops;
     bool useFanArt;
+    bool albumCoverBackdrop;
+    bool oldIsAlbumCoverBackdrop;
     Song currentSong;
+    #ifdef SCALE_CONTEXT_BGND
+    QImage currentImage;
+    #endif
     QPixmap oldBackdrop;
     QPixmap currentBackdrop;
     QString currentArtist;
@@ -127,12 +167,14 @@ private:
     bool isWide;
     QStackedWidget *stack;
     ThinSplitter *splitter;
-    QComboBox *viewCombo;
+    ViewSelector *viewSelector;
     BackdropCreator *creator;
 //    QString backdropText;
     QSet<QString> backdropAlbums;
+    #ifndef SCALE_CONTEXT_BGND
     QSize minBackdropSize;
     QSize maxBackdropSize;
+    #endif
     QList<QString> artistsCreatedBackdropsFor;
 };
 
diff --git a/context/lastfmengine.cpp b/context/lastfmengine.cpp
index d1e5a80..a6d214d 100644
--- a/context/lastfmengine.cpp
+++ b/context/lastfmengine.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/lastfmengine.h b/context/lastfmengine.h
index c4c4ddd..3231005 100644
--- a/context/lastfmengine.h
+++ b/context/lastfmengine.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/lyricsdialog.cpp b/context/lyricsdialog.cpp
index 0f87eea..b6c2dd8 100644
--- a/context/lyricsdialog.cpp
+++ b/context/lyricsdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/lyricsdialog.h b/context/lyricsdialog.h
index f27d543..516451b 100644
--- a/context/lyricsdialog.h
+++ b/context/lyricsdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/lyricsettings.cpp b/context/lyricsettings.cpp
index 1707e5d..8c27560 100644
--- a/context/lyricsettings.cpp
+++ b/context/lyricsettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This file is part of Clementine.
diff --git a/context/lyricsettings.h b/context/lyricsettings.h
index 51b8573..fd3d080 100644
--- a/context/lyricsettings.h
+++ b/context/lyricsettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This file is part of Clementine.
diff --git a/context/metaengine.cpp b/context/metaengine.cpp
index 015813f..019bee4 100644
--- a/context/metaengine.cpp
+++ b/context/metaengine.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/metaengine.h b/context/metaengine.h
index 73e4f85..bcbfdcc 100644
--- a/context/metaengine.h
+++ b/context/metaengine.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/othersettings.cpp b/context/othersettings.cpp
index d12e4a1..563290a 100644
--- a/context/othersettings.cpp
+++ b/context/othersettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -23,31 +23,94 @@
 
 #include "othersettings.h"
 #include "settings.h"
-#include "onoffbutton.h"
+#include "pathrequester.h"
+#include "playqueueview.h"
+#include "localize.h"
+
+static const char *constValueProperty="value";
 
 OtherSettings::OtherSettings(QWidget *p)
     : QWidget(p)
 {
     setupUi(this);
     connect(wikipediaIntroOnly, SIGNAL(toggled(bool)), SLOT(toggleWikiNote()));
+
+    contextBackdrop_none->setProperty(constValueProperty, PlayQueueView::BI_None);
+    contextBackdrop_artist->setProperty(constValueProperty, PlayQueueView::BI_Cover);
+    contextBackdrop_custom->setProperty(constValueProperty, PlayQueueView::BI_Custom);
+    contextBackdropFile->setDirMode(false);
+    #ifdef ENABLE_KDE_SUPPORT
+    contextBackdropFile->setFilter("image/jpeg image/png");
+    #else
+    contextBackdropFile->setFilter(i18n("Images (*.png *.jpg)"));
+    #endif
+    int labelWidth=qMax(fontMetrics().width(QLatin1String("100%")), fontMetrics().width(i18nc("pixels", "10px")));
+    contextBackdropOpacityLabel->setFixedWidth(labelWidth);
+    contextBackdropBlurLabel->setFixedWidth(labelWidth);
+    connect(contextBackdropOpacity, SIGNAL(valueChanged(int)), SLOT(setContextBackdropOpacityLabel()));
+    connect(contextBackdropBlur, SIGNAL(valueChanged(int)), SLOT(setContextBackdropBlurLabel()));
+    connect(contextBackdrop_none, SIGNAL(toggled(bool)), SLOT(enableContextBackdropOptions()));
+    connect(contextBackdrop_artist, SIGNAL(toggled(bool)), SLOT(enableContextBackdropOptions()));
+    connect(contextBackdrop_custom, SIGNAL(toggled(bool)), SLOT(enableContextBackdropOptions()));
 }
 
 void OtherSettings::load()
 {
     wikipediaIntroOnly->setChecked(Settings::self()->wikipediaIntroOnly());
-    contextBackdrop->setChecked(Settings::self()->contextBackdrop());
     contextDarkBackground->setChecked(Settings::self()->contextDarkBackground());
+    contextAlwaysCollapsed->setChecked(Settings::self()->contextAlwaysCollapsed());
+
+    int bgnd=Settings::self()->contextBackdrop();
+    contextBackdrop_none->setChecked(bgnd==contextBackdrop_none->property(constValueProperty).toInt());
+    contextBackdrop_artist->setChecked(bgnd==contextBackdrop_artist->property(constValueProperty).toInt());
+    contextBackdrop_custom->setChecked(bgnd==contextBackdrop_custom->property(constValueProperty).toInt());
+    contextBackdropOpacity->setValue(Settings::self()->contextBackdropOpacity());
+    contextBackdropBlur->setValue(Settings::self()->contextBackdropBlur());
+    contextBackdropFile->setText(Settings::self()->contextBackdropFile());
+
     toggleWikiNote();
+    setContextBackdropOpacityLabel();
+    setContextBackdropBlurLabel();
+    enableContextBackdropOptions();
 }
 
 void OtherSettings::save()
 {
     Settings::self()->saveWikipediaIntroOnly(wikipediaIntroOnly->isChecked());
-    Settings::self()->saveContextBackdrop(contextBackdrop->isChecked());
     Settings::self()->saveContextDarkBackground(contextDarkBackground->isChecked());
+    Settings::self()->saveContextAlwaysCollapsed(contextAlwaysCollapsed->isChecked());
+
+    if (contextBackdrop_none->isChecked()) {
+        Settings::self()->saveContextBackdrop(contextBackdrop_none->property(constValueProperty).toInt());
+    } else if (contextBackdrop_artist->isChecked()) {
+        Settings::self()->saveContextBackdrop(contextBackdrop_artist->property(constValueProperty).toInt());
+    } else if (contextBackdrop_custom->isChecked()) {
+        Settings::self()->saveContextBackdrop(contextBackdrop_custom->property(constValueProperty).toInt());
+    }
+    Settings::self()->saveContextBackdropOpacity(contextBackdropOpacity->value());
+    Settings::self()->saveContextBackdropBlur(contextBackdropBlur->value());
+    Settings::self()->saveContextBackdropFile(contextBackdropFile->text().trimmed());
 }
 
 void OtherSettings::toggleWikiNote()
 {
     wikipediaIntroOnlyNote->setOn(!wikipediaIntroOnly->isChecked());
 }
+
+void OtherSettings::setContextBackdropOpacityLabel()
+{
+    contextBackdropOpacityLabel->setText(i18nc("value%", "%1%", contextBackdropOpacity->value()));
+}
+
+void OtherSettings::setContextBackdropBlurLabel()
+{
+    contextBackdropBlurLabel->setText(i18nc("pixels", "%1px", contextBackdropBlur->value()));
+}
+
+void OtherSettings::enableContextBackdropOptions()
+{
+    contextBackdropOpacity->setEnabled(!contextBackdrop_none->isChecked());
+    contextBackdropOpacityLabel->setEnabled(contextBackdropOpacity->isEnabled());
+    contextBackdropBlur->setEnabled(contextBackdropOpacity->isEnabled());
+    contextBackdropBlurLabel->setEnabled(contextBackdropOpacity->isEnabled());
+}
diff --git a/context/othersettings.h b/context/othersettings.h
index d194741..0fbcf29 100644
--- a/context/othersettings.h
+++ b/context/othersettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -39,6 +39,9 @@ public:
 
 private Q_SLOTS:
     void toggleWikiNote();
+    void setContextBackdropOpacityLabel();
+    void setContextBackdropBlurLabel();
+    void enableContextBackdropOptions();
 };
 
 #endif
diff --git a/context/othersettings.ui b/context/othersettings.ui
index 6df903c..d24e0f9 100644
--- a/context/othersettings.ui
+++ b/context/othersettings.ui
@@ -6,57 +6,178 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>442</width>
-    <height>602</height>
+    <width>658</width>
+    <height>384</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
-    <layout class="QFormLayout" name="formLayout">
-     <item row="0" column="0">
-      <widget class="BuddyLabel" name="contextBackdropLabel">
-       <property name="text">
-        <string>Use backdrop:</string>
-       </property>
-       <property name="buddy">
-        <cstring>contextBackdrop</cstring>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="1">
-      <widget class="OnOffButton" name="contextBackdrop"/>
-     </item>
-     <item row="1" column="0">
-      <widget class="BuddyLabel" name="contextDarkBackgroundLabel">
-       <property name="text">
-        <string>Dark background:</string>
-       </property>
-       <property name="buddy">
-        <cstring>contextDarkBackground</cstring>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="1">
-      <widget class="OnOffButton" name="contextDarkBackground"/>
-     </item>
-     <item row="2" column="0">
-      <widget class="BuddyLabel" name="wikipediaIntroOnlyLabel">
-       <property name="text">
-        <string>Only show basic wikipedia text:</string>
-       </property>
-       <property name="buddy">
-        <cstring>wikipediaIntroOnly</cstring>
-       </property>
-      </widget>
-     </item>
-     <item row="2" column="1">
-      <widget class="OnOffButton" name="wikipediaIntroOnly">
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-    </layout>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="title">
+      <string>Background Image</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0" colspan="3">
+       <widget class="QRadioButton" name="contextBackdrop_none">
+        <property name="text">
+         <string>None</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0" colspan="3">
+       <widget class="QRadioButton" name="contextBackdrop_artist">
+        <property name="text">
+         <string>Artist image</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0" colspan="2">
+       <widget class="QRadioButton" name="contextBackdrop_custom">
+        <property name="text">
+         <string>Custom image:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="2">
+       <widget class="PathRequester" name="contextBackdropFile">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QLabel" name="label_4b">
+        <property name="text">
+         <string>Blur:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="1" colspan="2">
+       <layout class="QHBoxLayout" name="contextBackdropBlurLayout">
+        <property name="margin">
+         <number>0</number>
+        </property>
+        <item>
+         <widget class="QSlider" name="contextBackdropBlur">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="maximum">
+           <number>20</number>
+          </property>
+          <property name="pageStep">
+           <number>1</number>
+          </property>
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="tickPosition">
+           <enum>QSlider::TicksBelow</enum>
+          </property>
+          <property name="tickInterval">
+           <number>1</number>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLabel" name="contextBackdropBlurLabel">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="text">
+           <string>10px</string>
+          </property>
+          <property name="alignment">
+           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+      <item row="4" column="0">
+       <widget class="QLabel" name="label_4">
+        <property name="text">
+         <string>Opacity:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="4" column="1" colspan="2">
+       <layout class="QHBoxLayout" name="contextBackdropOpacityLayout">
+        <property name="margin">
+         <number>0</number>
+        </property>
+        <item>
+         <widget class="QSlider" name="contextBackdropOpacity">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="maximum">
+           <number>100</number>
+          </property>
+          <property name="pageStep">
+           <number>10</number>
+          </property>
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="tickPosition">
+           <enum>QSlider::TicksBelow</enum>
+          </property>
+          <property name="tickInterval">
+           <number>10</number>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLabel" name="contextBackdropOpacityLabel">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="text">
+           <string>40%</string>
+          </property>
+          <property name="alignment">
+           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QCheckBox" name="contextDarkBackground">
+     <property name="text">
+      <string>Dark background</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QCheckBox" name="wikipediaIntroOnly">
+     <property name="text">
+      <string>Only show basic wikipedia text</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QCheckBox" name="contextAlwaysCollapsed">
+     <property name="text">
+      <string>Always collapse into a single pane</string>
+     </property>
+    </widget>
    </item>
    <item>
     <spacer name="verticalSpacer">
@@ -113,21 +234,34 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>BuddyLabel</class>
-   <extends>QLabel</extends>
-   <header>buddylabel.h</header>
-  </customwidget>
-  <customwidget>
    <class>StateLabel</class>
    <extends>QLabel</extends>
    <header>statelabel.h</header>
   </customwidget>
   <customwidget>
-   <class>OnOffButton</class>
-   <extends>QCheckBox</extends>
-   <header>onoffbutton.h</header>
+   <class>PathRequester</class>
+   <extends>QLineEdit</extends>
+   <header>pathrequester.h</header>
+   <container>1</container>
   </customwidget>
  </customwidgets>
  <resources/>
- <connections/>
+ <connections>
+  <connection>
+   <sender>contextBackdrop_custom</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>contextBackdropFile</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>80</x>
+     <y>90</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>172</x>
+     <y>92</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
 </ui>
diff --git a/context/songview.cpp b/context/songview.cpp
index 9165bee..d966682 100644
--- a/context/songview.cpp
+++ b/context/songview.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -71,7 +71,7 @@ static inline QString mpdFilePath(const QString &songFile)
 
 static inline QString mpdFilePath(const Song &song)
 {
-    return mpdFilePath(song.file);
+    return mpdFilePath(song.filePath());
 }
 
 static inline QString fixNewLines(const QString &o)
@@ -205,8 +205,8 @@ void SongView::cancel()
 
 void SongView::del()
 {
-    if (MessageBox::No==MessageBox::warningYesNo(this, i18n("Delete lyrics file?"), i18n("Cancel"),
-                                                 StdGuiItem::del(), StdGuiItem::discard())) {
+    if (MessageBox::No==MessageBox::warningYesNo(this, i18n("Delete lyrics file?"), i18n("Delete File"),
+                                                 StdGuiItem::del(), StdGuiItem::cancel())) {
         return;
     }
 
@@ -253,9 +253,7 @@ void SongView::showContextMenu(const QPoint &pos)
 void SongView::abort()
 {
     if (job) {
-        connect(job, SIGNAL(finished()), this, SLOT(downloadFinished()));
-        job->abort();
-        job->deleteLater();
+        job->cancelAndDelete();
         job=0;
     }
     currentProvider=-1;
@@ -265,7 +263,7 @@ void SongView::abort()
 
         text->setText(QString());
         // Set lyrics file anyway - so that editing is enabled!
-        lyricsFile=Settings::self()->storeLyricsInMpdDir()
+        lyricsFile=Settings::self()->storeLyricsInMpdDir() && !currentSong.isNonMPD()
                 ? mpdFilePath(currentSong)
                 : cacheFile(currentSong.artist, currentSong.title);
         setMode(Mode_Display);
@@ -282,12 +280,16 @@ void SongView::update(const Song &s, bool force)
     if (s.isEmpty() || s.title.isEmpty() || s.artist.isEmpty()) {
         currentSong=s;
         clear();
+        abort();
         return;
     }
 
     Song song(s);
     bool songChanged = song.artist!=currentSong.artist || song.title!=currentSong.title;
 
+    if (songChanged) {
+        abort();
+    }
     if (!isVisible()) {
         if (songChanged) {
             needToUpdate=true;
@@ -315,8 +317,8 @@ void SongView::update(const Song &s, bool force)
             currentProvider=-1;
         }
 
-        if (!MPDConnection::self()->getDetails().dir.isEmpty() && !song.file.isEmpty() && !song.isStream()) {
-            QString songFile=song.file;
+        if (!MPDConnection::self()->getDetails().dir.isEmpty() && !song.file.isEmpty() && !song.isNonMPD()) {
+            QString songFile=song.filePath();
 
             if (song.isCantataStream()) {
                 #if QT_VERSION < 0x050000
@@ -333,7 +335,7 @@ void SongView::update(const Song &s, bool force)
             if (MPDConnection::self()->getDetails().dir.startsWith(QLatin1String("http:/"))) {
                 QUrl url(mpdLyrics);
                 job=NetworkAccessManager::self()->get(url);
-                job->setProperty("file", songFile);
+                job->setProperty("file", song.file);
                 connect(job, SIGNAL(finished()), this, SLOT(downloadFinished()));
                 return;
             } else {
@@ -421,7 +423,7 @@ void SongView::lyricsReady(int id, QString lyrics)
         } else {
             text->setText(fixNewLines(plain));
             lyricsFile=QString();
-            if (! ( Settings::self()->storeLyricsInMpdDir() &&
+            if (! ( Settings::self()->storeLyricsInMpdDir() && !currentSong.isNonMPD() &&
                     saveFile(mpdFilePath(currentSong))) ) {
                 saveFile(cacheFile(currentSong.artist, currentSong.title, true));
             }
@@ -446,7 +448,7 @@ bool SongView::saveFile(const QString &fileName)
 
 QString SongView::mpdFileName() const
 {
-    return currentSong.file.isEmpty() || MPDConnection::self()->getDetails().dir.isEmpty() || currentSong.isStream()
+    return currentSong.file.isEmpty() || MPDConnection::self()->getDetails().dir.isEmpty() || currentSong.isNonMPD()
             ? QString() : mpdFilePath(currentSong);
 }
 
@@ -466,7 +468,7 @@ void SongView::getLyrics()
         text->setText(QString());
         currentProvider=-1;
         // Set lyrics file anyway - so that editing is enabled!
-        lyricsFile=Settings::self()->storeLyricsInMpdDir()
+        lyricsFile=Settings::self()->storeLyricsInMpdDir() && !currentSong.isNonMPD()
                 ? mpdFilePath(currentSong)
                 : cacheFile(currentSong.artist, currentSong.title);
         setMode(Mode_Display);
diff --git a/context/songview.h b/context/songview.h
index c044d06..2fa63a8 100644
--- a/context/songview.h
+++ b/context/songview.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/togglelist.cpp b/context/togglelist.cpp
index 652a9f0..a77d20f 100644
--- a/context/togglelist.cpp
+++ b/context/togglelist.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -39,8 +39,9 @@ ToggleList::ToggleList(QWidget *p)
     connect(selected, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), SLOT(selectedChanged(QListWidgetItem*)));
     upButton->setIcon(Icon("go-up"));
     downButton->setIcon(Icon("go-down"));
-    addButton->setIcon(Icon("list-add"));
-    removeButton->setIcon(Icon("list-remove"));
+    bool rtl=Qt::RightToLeft==layoutDirection();
+    addButton->setIcon(Icon(rtl ? "go-previous" : "go-next"));
+    removeButton->setIcon(Icon(rtl ? "go-next" : "go-previous"));
 
     upButton->setEnabled(false);
     downButton->setEnabled(false);
diff --git a/context/togglelist.h b/context/togglelist.h
index bf3b386..525d62d 100644
--- a/context/togglelist.h
+++ b/context/togglelist.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/ultimatelyrics.cpp b/context/ultimatelyrics.cpp
index e55353c..57952bf 100644
--- a/context/ultimatelyrics.cpp
+++ b/context/ultimatelyrics.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This file is part of Clementine.
diff --git a/context/ultimatelyrics.h b/context/ultimatelyrics.h
index 4ad3941..0b45674 100644
--- a/context/ultimatelyrics.h
+++ b/context/ultimatelyrics.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This file is part of Clementine.
diff --git a/context/ultimatelyricsprovider.cpp b/context/ultimatelyricsprovider.cpp
index f8e9294..9ea0e3d 100644
--- a/context/ultimatelyricsprovider.cpp
+++ b/context/ultimatelyricsprovider.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This file is part of Clementine.
@@ -283,11 +283,7 @@ void UltimateLyricsProvider::abort()
     QHash<NetworkJob *, int>::ConstIterator end(requests.constEnd());
 
     for (; it!=end; ++it) {
-        disconnect(it.key(), SIGNAL(finished()), this, SLOT(lyricsFetched()));
-        disconnect(it.key(), SIGNAL(finished()), this, SLOT(wikiMediaSearchResponse()));
-        disconnect(it.key(), SIGNAL(finished()), this, SLOT(wikiMediaLyricsFetched()));
-        it.key()->deleteLater();
-        it.key()->close();
+        it.key()->cancelAndDelete();
     }
     requests.clear();
     songs.clear();
diff --git a/context/ultimatelyricsprovider.h b/context/ultimatelyricsprovider.h
index a35db59..89f1c62 100644
--- a/context/ultimatelyricsprovider.h
+++ b/context/ultimatelyricsprovider.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This file is part of Clementine.
diff --git a/context/view.cpp b/context/view.cpp
index b3ae631..a0a0e51 100644
--- a/context/view.cpp
+++ b/context/view.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -89,6 +89,7 @@ View::View(QWidget *parent)
     }
 
     cancelJobAction=new Action(Icons::self()->cancelIcon, i18n("Cancel"), this);
+    cancelJobAction->setEnabled(false);
     connect(cancelJobAction, SIGNAL(triggered()), SLOT(abort()));
 }
 
diff --git a/context/view.h b/context/view.h
index 82e808e..c498113 100644
--- a/context/view.h
+++ b/context/view.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/wikipediaengine.cpp b/context/wikipediaengine.cpp
index 88d1214..746ee49 100644
--- a/context/wikipediaengine.cpp
+++ b/context/wikipediaengine.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/wikipediaengine.h b/context/wikipediaengine.h
index fcc770c..f87a6ec 100644
--- a/context/wikipediaengine.h
+++ b/context/wikipediaengine.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/wikipediasettings.cpp b/context/wikipediasettings.cpp
index ce7a049..d15d40e 100644
--- a/context/wikipediasettings.cpp
+++ b/context/wikipediasettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -38,19 +38,34 @@
 #include <QXmlStreamReader>
 #include <QFile>
 
-static const QString constFileName=QLatin1String("wikipedia-available.xml.gz");
+static const QString constOldFileName=QLatin1String("wikipedia-available.xml.gz");
+static const QString constFileName=QLatin1String("languages.xml.gz");
+
+QString WikipediaSettings::constSubDir=QLatin1String("wikipedia");
 
 static QString localeFile()
 {
-    return Utils::dataDir(QString(), true)+constFileName;
+    return Utils::cacheDir(WikipediaSettings::constSubDir, true)+constFileName;
 }
 
-// Move files from previous ~/.config/cantata to ~/.local/share/cantata
+// Move files from previous ~/.config/cantata or ~/.local/share/cantata to ~/.cache/cantata/wikipedia
 static void moveToNewLocation()
 {
     #if !defined Q_OS_WIN && !defined Q_OS_MAC // Not required for windows - as already stored in data location!
-    // Can't reliable check version here, as migh tnot have opened the wiki settings before version was changed...
-    Utils::moveFile(Utils::configDir(QString())+constFileName, Utils::dataDir(QString(), true)+constFileName);
+    QString oldLocation1=Utils::configDir(QString())+constOldFileName;
+    QString oldLocation2=Utils::dataDir(QString())+constOldFileName;
+    QString newLocation=localeFile();
+    bool moved=false;
+    if (oldLocation2!=constOldFileName && QFile::exists(oldLocation2) && Utils::moveFile(oldLocation2, newLocation)) {
+        moved=true;
+    }
+    if (oldLocation1!=constOldFileName && QFile::exists(oldLocation1)) {
+        if (moved) {
+            QFile::remove(oldLocation1);
+        } else {
+            Utils::moveFile(oldLocation1, newLocation);
+        }
+    }
     #endif
 }
 
diff --git a/context/wikipediasettings.h b/context/wikipediasettings.h
index 9cb6d24..cc4f532 100644
--- a/context/wikipediasettings.h
+++ b/context/wikipediasettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -63,6 +63,8 @@ class WikipediaSettings : public ToggleList
     };
 
 public:
+    static QString constSubDir;
+
     WikipediaSettings(QWidget *p);
     virtual ~WikipediaSettings();
     
diff --git a/dbus/com.googlecode.cantata.xml b/dbus/com.googlecode.cantata.xml
index 22130e8..b4ad8d7 100644
--- a/dbus/com.googlecode.cantata.xml
+++ b/dbus/com.googlecode.cantata.xml
@@ -3,10 +3,6 @@
 
 <node>
   <interface name="com.googlecode.cantata">
-    <method name="showPage">
-        <arg type="s" name="page" direction="in"/>
-        <arg type="b" name="focusSearch" direction="in"/>
-    </method>
     <method name="showError">
         <arg type="s" name="error" direction="in"/>
     </method>
diff --git a/dbus/gnomemediakeys.cpp b/dbus/gnomemediakeys.cpp
index d4be1bb..37c9e20 100644
--- a/dbus/gnomemediakeys.cpp
+++ b/dbus/gnomemediakeys.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/dbus/gnomemediakeys.h b/dbus/gnomemediakeys.h
index b631466..715c078 100644
--- a/dbus/gnomemediakeys.h
+++ b/dbus/gnomemediakeys.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/dbus/mpris.cpp b/dbus/mpris.cpp
index 3da6e78..6778544 100644
--- a/dbus/mpris.cpp
+++ b/dbus/mpris.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -154,7 +154,7 @@ QVariantMap Mpris::Metadata() const {
             metadataMap.insert("xesam:contentCreated", QString("%04d").arg(currentSong.year));
         }
         if (!currentSong.file.isEmpty()) {
-            if (currentSong.isStream()) {
+            if (currentSong.isNonMPD()) {
                 metadataMap.insert("xesam:url", currentSong.file);
             } else if (MPDConnection::self()->getDetails().dirReadable) {
                 QString mpdDir=MPDConnection::self()->getDetails().dir;
diff --git a/dbus/mpris.h b/dbus/mpris.h
index ddbd6b7..6ddde38 100644
--- a/dbus/mpris.h
+++ b/dbus/mpris.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/dbus/notify.cpp b/dbus/notify.cpp
index 926db4a..cc8403b 100644
--- a/dbus/notify.cpp
+++ b/dbus/notify.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -113,6 +113,7 @@ void Notify::show(const QString &title, const QString &text, const QImage &img)
 void Notify::callFinished(QDBusPendingCallWatcher *watcher)
 {
     QDBusPendingReply<uint> reply = *watcher;
+    watcher->deleteLater();
     if (reply.isError()) {
         return;
     }
@@ -123,4 +124,3 @@ void Notify::callFinished(QDBusPendingCallWatcher *watcher)
         lastTime = QDateTime::currentDateTime();
     }
 }
-
diff --git a/dbus/notify.h b/dbus/notify.h
index 63923fd..4cebdbb 100644
--- a/dbus/notify.h
+++ b/dbus/notify.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/dbus/powermanagement.cpp b/dbus/powermanagement.cpp
index 41905f9..b45fdcc 100644
--- a/dbus/powermanagement.cpp
+++ b/dbus/powermanagement.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -75,7 +75,7 @@ void PowerManagement::setInhibitSuspend(bool i)
     if (i==inhibitSuspendWhilstPlaying) {
         return;
     }
-    i=inhibitSuspendWhilstPlaying;
+    inhibitSuspendWhilstPlaying=i;
 
     if (inhibitSuspendWhilstPlaying) {
         connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(mpdStatusUpdated()));
diff --git a/dbus/powermanagement.h b/dbus/powermanagement.h
index 3f1a009..b39e0c8 100644
--- a/dbus/powermanagement.h
+++ b/dbus/powermanagement.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/actiondialog.cpp b/devices/actiondialog.cpp
index 4df3a99..425f9db 100644
--- a/devices/actiondialog.cpp
+++ b/devices/actiondialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -43,7 +43,9 @@
 #include "config.h"
 #include "tags.h"
 #include "treeview.h"
+#ifdef ENABLE_ONLINE_SERVICES
 #include "onlineservicesmodel.h"
+#endif
 #ifdef ENABLE_REPLAYGAIN_SUPPORT
 #include "rgdialog.h"
 #endif
@@ -53,6 +55,11 @@
 #include <QDBusConnection>
 #endif
 
+#define REMOVE(w) \
+    w->setVisible(false); \
+    w->deleteLater(); \
+    w=0
+
 static int iCount=0;
 
 int ActionDialog::instanceCount()
@@ -173,6 +180,15 @@ void ActionDialog::showSongs()
     songDialog->show();
 }
 
+void ActionDialog::showMopidyMessage()
+{
+    MessageBox::information(this, i18n("Cantata has detected that you are connected to a Mopidy server.\n\n"
+                                       "Currently it is not possible for Cantata to force Mopidy to refresh its local "
+                                       "music listing. Therefore, you will need to stop Cantata, manually refresh "
+                                       "Mopidy's database, and restart Cantata for any changes to be active."),
+                            QLatin1String("Mopidy"));
+}
+
 void ActionDialog::hideSongs()
 {
     if (songDialog) {
@@ -221,15 +237,17 @@ void ActionDialog::copy(const QString &srcUdi, const QString &dstUdi, const QLis
     #endif
     foreach (const Song &s, songsToAction) {
         quint32 size=s.size;
-        if (0==size) {
+        if (sourceIsAudioCd) {
+            size/=18; // Just guess at a compression ratio... ~18x ~=80kbps MP3
+        } else if (0==size) {
             if (srcUdi.isEmpty()) {
-                 size=QFileInfo(MPDConnection::self()->getDetails().dir+s.file).size();
-            } else if (QFile::exists(s.file)) { // FS device...
-                size=QFileInfo(s.file).size();
+                size=QFileInfo(MPDConnection::self()->getDetails().dir+s.file).size();
+            } else if (QFile::exists(dev->path()+s.file)) { // FS device...
+                size=QFileInfo(dev->path()+s.file).size();
             }
         }
-        if (s.size>0) {
-            spaceRequired+=s.size;
+        if (size>0) {
+            spaceRequired+=size;
         }
         if (!haveVariousArtists && s.isVariousArtists()) {
             haveVariousArtists=true;
@@ -367,6 +385,12 @@ void ActionDialog::init(const QString &srcUdi, const QString &dstUdi, const QLis
     albumsWithoutRgTags.clear();
     #endif
     updateUnity(false);
+
+    if (((Remove==m && srcUdi.isEmpty()) || (Copy==m && !srcUdi.isEmpty())) && MPDConnection::self()->isMopdidy()) {
+        connect(mopidyNote, SIGNAL(leftClickedUrl()), SLOT(showMopidyMessage()));
+    } else {
+        REMOVE(mopidyNote);
+    }
 }
 
 void ActionDialog::slotButtonClicked(int button)
@@ -475,9 +499,11 @@ void ActionDialog::slotButtonClicked(int button)
 
 Device * ActionDialog::getDevice(const QString &udi, bool logErrors)
 {
+    #ifdef ENABLE_ONLINE_SERVICES
     if (udi.startsWith(OnlineServicesModel::constUdiPrefix)) {
         return OnlineServicesModel::self()->device(udi);
     }
+    #endif
     Device *dev=DevicesModel::self()->device(udi);
 
     if (!logErrors) {
@@ -500,7 +526,7 @@ Device * ActionDialog::getDevice(const QString &udi, bool logErrors)
     }
 
     if (isVisible()) {
-        setPage(PAGE_ERROR, error);
+        setPage(PAGE_ERROR, StringPairList(), error);
     } else {
         MessageBox::error(parentWidget(), error);
     }
@@ -526,7 +552,7 @@ void ActionDialog::doNext()
                 performingAction=true;
                 if (copyToDev) {
                     destFile=dev->path()+dev->options().createFilename(currentSong);
-                    currentSong.file=MPDConnection::self()->getDetails().dir+currentSong.file;
+                    currentSong.file=MPDConnection::self()->getDetails().dir+currentSong.filePath();
                     dev->addSong(currentSong, overwrite->isChecked(), !copiedCovers.contains(Utils::getDir(destFile)));
                 } else {
                     Song copy=currentSong;
@@ -535,7 +561,7 @@ void ActionDialog::doNext()
                     }
                     QString fileName=namingOptions.createFilename(copy);
                     destFile=MPDConnection::self()->getDetails().dir+fileName;
-                    dev->copySongTo(currentSong, MPDConnection::self()->getDetails().dir, fileName, overwrite->isChecked(), !copiedCovers.contains(Utils::getDir(destFile)));
+                    dev->copySongTo(currentSong, fileName, overwrite->isChecked(), !copiedCovers.contains(Utils::getDir(destFile)));
                 }
             }
         } else {
@@ -578,11 +604,14 @@ void ActionDialog::doNext()
                                                                GuiItem(i18n("Calculate")), StdGuiItem::no())) {
                     RgDialog *dlg=new RgDialog(pw);
                     QList<Song> songs;
+                    DeviceOptions opts;
+                    opts.load(MPDConnectionDetails::configGroupName(MPDConnection::self()->getDetails().name), true);
+                    Encoders::Encoder encoder=Encoders::getEncoder(opts.transcoderCodec);
 
                     foreach (const Song &s, actionedSongs) {
                         if (albumsWithoutRgTags.contains(s.album)) {
                             Song song=s;
-                            song.file=namingOptions.createFilename(s);
+                            song.file=encoder.changeExtension(namingOptions.createFilename(s));
                             songs.append(song);
                         }
                     }
@@ -631,53 +660,52 @@ void ActionDialog::actionStatus(int status, bool copiedCover)
         }
         break;
     case Device::FileExists:
-        setPage(PAGE_SKIP, i18n("The destination filename already exists!<hr/>%1", formatSong(currentSong, true)));
+        setPage(PAGE_SKIP, formatSong(currentSong, true), i18n("The destination filename already exists!"));
         break;
     case Device::SongExists:
-        setPage(PAGE_SKIP, i18n("Song already exists!<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_SKIP, formatSong(currentSong), i18n("Song already exists!"));
         break;
     case Device::SongDoesNotExist:
-        setPage(PAGE_SKIP, i18n("Song does not exist!<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_SKIP, formatSong(currentSong), i18n("Song does not exist!"));
         break;
     case Device::DirCreationFaild:
-        setPage(PAGE_SKIP, i18n("Failed to create destination folder!<br/>Please check you have sufficient permissions.<hr/>%1", formatSong(currentSong, true)));
+        setPage(PAGE_SKIP, formatSong(currentSong, true), i18n("Failed to create destination folder!<br/>Please check you have sufficient permissions."));
         break;
     case Device::SourceFileDoesNotExist:
-        setPage(PAGE_SKIP, i18n("Source file no longer exists?<br/><br/<hr/>%1", formatSong(currentSong, true)));
+        setPage(PAGE_SKIP, formatSong(currentSong, true), i18n("Source file no longer exists?"));
         break;
     case Device::Failed:
-        setPage(PAGE_SKIP, Copy==mode ? i18n("Failed to copy.<hr/>%1", formatSong(currentSong))
-                                      : i18n("Failed to delete.<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_SKIP, formatSong(currentSong), Copy==mode ? i18n("Failed to copy.") : i18n("Failed to delete."));
         break;
     case Device::NotConnected:
-        setPage(PAGE_ERROR, i18n("Not connected to device.<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_ERROR, formatSong(currentSong), i18n("Not connected to device."));
         break;
     case Device::CodecNotAvailable:
-        setPage(PAGE_ERROR, i18n("Selected codec is not available.<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_ERROR, formatSong(currentSong), i18n("Selected codec is not available."));
         break;
     case Device::TranscodeFailed:
-        setPage(PAGE_SKIP, i18n("Transcoding failed.<br/><br/<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_SKIP, formatSong(currentSong), i18n("Transcoding failed."));
         break;
     case Device::FailedToCreateTempFile:
-        setPage(PAGE_ERROR, i18n("Failed to create temporary file.<br/>(Required for transcoding to MTP devices.)<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_ERROR, formatSong(currentSong), i18n("Failed to create temporary file.<br/>(Required for transcoding to MTP devices.)"));
         break;
     case Device::ReadFailed:
-        setPage(PAGE_SKIP, i18n("Failed to read source file.<br/><br/<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_SKIP, formatSong(currentSong), i18n("Failed to read source file."));
         break;
     case Device::WriteFailed:
-        setPage(PAGE_SKIP, i18n("Failed to write to destination file.<br/><br/<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_SKIP, formatSong(currentSong), i18n("Failed to write to destination file."));
         break;
     case Device::NoSpace:
-        setPage(PAGE_SKIP, i18n("No space left on device.<br/><br/<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_SKIP, formatSong(currentSong), i18n("No space left on device."));
         break;
     case Device::FailedToUpdateTags:
-        setPage(PAGE_SKIP, i18n("Failed to update metadata.<br/><br/<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_SKIP, formatSong(currentSong), i18n("Failed to update metadata."));
         break;
     case Device::DownloadFailed:
-        setPage(PAGE_SKIP, i18n("Failed to download track.<br/><br/<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_SKIP, formatSong(currentSong), i18n("Failed to download track."));
         break;
     case Device::FailedToLockDevice:
-        setPage(PAGE_ERROR, i18n("Failed to lock device.<hr/>%1", formatSong(currentSong)));
+        setPage(PAGE_ERROR, formatSong(currentSong), i18n("Failed to lock device."));
         break;
     case Device::Cancelled:
         break;
@@ -707,7 +735,7 @@ void ActionDialog::configure(const QString &udi)
             connect(dlg, SIGNAL(cancelled()), SLOT(saveProperties()));
         }
         dlg->setCaption(i18n("Local Music Library Properties"));
-        dlg->show(MPDConnection::self()->getDetails().dir, namingOptions, DevicePropertiesWidget::Prop_Basic|(sourceIsAudioCd ? DevicePropertiesWidget::Prop_Encoder : 0));
+        dlg->show(MPDConnection::self()->getDetails().dir, namingOptions, DevicePropertiesWidget::Prop_Basic|DevicePropertiesWidget::Prop_FileName|(sourceIsAudioCd ? DevicePropertiesWidget::Prop_Encoder : 0));
         connect(dlg, SIGNAL(destroyed()), SLOT(controlInfoLabel()));
     } else {
         Device *dev=DevicesModel::self()->device(udi);
@@ -732,7 +760,7 @@ void ActionDialog::saveProperties()
     mpdConfigured=true;
 }
 
-void ActionDialog::setPage(int page, const QString &msg)
+void ActionDialog::setPage(int page, const StringPairList &msg, const QString &header)
 {
     stack->setCurrentIndex(page);
 
@@ -747,8 +775,8 @@ void ActionDialog::setPage(int page, const QString &msg)
             break;
         case PAGE_SKIP:
             actionLabel->stopAnimation();
-            skipText->setText(i18n("<b>Error</b><br/>")+msg);
-            skipText->setToolTip(formatSong(currentSong, true));
+            skipText->setText(msg, QLatin1String("<b>")+i18n("Error")+QLatin1String("</b><br/>")+header+
+                              (header.isEmpty() ? QString() : QLatin1String("<br/><br/>")));
             if (songsToAction.count()) {
                 setButtons(Cancel|User1|User2|User3);
                 setButtonText(User1, i18n("Skip"));
@@ -761,29 +789,26 @@ void ActionDialog::setPage(int page, const QString &msg)
         case PAGE_ERROR:
             actionLabel->stopAnimation();
             stack->setCurrentIndex(PAGE_ERROR);
-            errorText->setText(i18n("<b>Error</b><br/>")+msg);
-            errorText->setToolTip(formatSong(currentSong, true));
+            errorText->setText(msg, QLatin1String("<b>")+i18n("Error")+QLatin1String("</b><br/>")+header+
+                               (header.isEmpty() ? QString() : QLatin1String("<br/><br/>")));
             setButtons(Cancel);
             break;
     }
 }
 
-QString ActionDialog::formatSong(const Song &s, bool showFiles, bool showTime)
+ActionDialog::StringPairList ActionDialog::formatSong(const Song &s, bool showFiles, bool showTime)
 {
-    QString str("<table>");
-    str+=i18n("<tr><td align=\"right\">Artist:</td><td>%1</td></tr>"
-              "<tr><td align=\"right\">Album:</td><td>%2</td></tr>"
-              "<tr><td align=\"right\">Track:</td><td>%3</td></tr>",
-              s.albumArtist(), s.album, s.trackAndTitleStr(Song::isVariousArtists(s.albumArtist()) && !Song::isVariousArtists(s.artist)));
+    StringPairList str;
+    str.append(StringPair(i18n("Artist:"), s.albumArtist()));
+    str.append(StringPair(i18n("Album:"), s.album));
+    str.append(StringPair(i18n("Track:"), s.trackAndTitleStr(Song::isVariousArtists(s.albumArtist()) && !Song::isVariousArtists(s.artist))));
 
     if (showFiles) {
         if (Copy==mode) {
-            str+=i18n("<tr><td align=\"right\">Source file:</td><td>%1</td></tr>"
-                      "<tr><td align=\"right\">Destination file:</td><td>%2</td></tr>",
-                      DevicesModel::fixDevicePath(s.file), DevicesModel::fixDevicePath(destFile));
-
+            str.append(StringPair(i18n("Source file:"), DevicesModel::fixDevicePath(s.filePath())));
+            str.append(StringPair(i18n("Destination file:"), DevicesModel::fixDevicePath(destFile)));
         } else {
-            str+=i18n("<tr><td align=\"right\">File:</td><td>%1</td></tr>", DevicesModel::fixDevicePath(s.file));
+            str.append(StringPair(i18n("File:"), DevicesModel::fixDevicePath(s.filePath())));
         }
     }
 
@@ -798,14 +823,13 @@ QString ActionDialog::formatSong(const Song &s, bool showFiles, bool showTime)
             quint64 timeRemaining=((taken/percent)-taken)/1000.0;
             estimate=i18nc("time (Estimated)", "%1 (Estimated)", Song::formattedTime(timeRemaining>0 ? timeRemaining : 0));
         }
-
-        str+=i18n("<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></i></tr>", estimate);
+        str.append(StringPair(i18n("Time remaining:"), estimate);
     }
     #else
     Q_UNUSED(showTime)
     #endif
     
-    return str+"</table>";
+    return str;
 }
 
 bool ActionDialog::refreshLibrary()
diff --git a/devices/actiondialog.h b/devices/actiondialog.h
index ee5f613..5ae235c 100644
--- a/devices/actiondialog.h
+++ b/devices/actiondialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -33,6 +33,9 @@
 #ifdef QT_QTDBUS_FOUND
 #include <QDBusMessage>
 #endif
+#include <QList>
+#include <QPair>
+
 class SongListDialog;
 
 class ActionDialog : public Dialog, Ui::ActionDialog
@@ -45,6 +48,9 @@ class ActionDialog : public Dialog, Ui::ActionDialog
         Remove
     };
 
+    typedef QPair<QString, QString> StringPair;
+    typedef QList<StringPair> StringPairList;
+
 public:
     static int instanceCount();
 
@@ -73,6 +79,7 @@ private Q_SLOTS:
     void cacheSaved();
     void controlInfoLabel();
     void showSongs();
+    void showMopidyMessage();
 
 private:
     void hideSongs();
@@ -82,8 +89,8 @@ private:
     void configure(const QString &udi);
     void init(const QString &srcUdi, const QString &dstUdi, const QList<Song> &songs, Mode m);
     void slotButtonClicked(int button);
-    void setPage(int page, const QString &msg=QString());
-    QString formatSong(const Song &s, bool showFiles=false, bool showTime=false);
+    void setPage(int page, const StringPairList &msg=StringPairList(), const QString &header=QString());
+    StringPairList formatSong(const Song &s, bool showFiles=false, bool showTime=false);
     bool refreshLibrary();
     void removeSong(const Song &s);
     void cleanDirs();
diff --git a/devices/actiondialog.ui b/devices/actiondialog.ui
index 544e52e..2d7829e 100644
--- a/devices/actiondialog.ui
+++ b/devices/actiondialog.ui
@@ -21,6 +21,9 @@
      </property>
      <widget class="QWidget" name="page">
       <layout class="QFormLayout" name="formLayout">
+       <property name="fieldGrowthPolicy">
+        <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+       </property>
        <property name="margin">
         <number>0</number>
        </property>
@@ -77,6 +80,13 @@
          </item>
         </layout>
        </item>
+       <item row="1" column="0">
+        <widget class="QLabel" name="label_3">
+         <property name="text">
+          <string>Copy songs to:</string>
+         </property>
+        </widget>
+       </item>
        <item row="1" column="1">
         <layout class="QHBoxLayout" name="horizontalLayout">
          <item>
@@ -123,23 +133,6 @@
          </item>
         </layout>
        </item>
-       <item row="4" column="0">
-        <widget class="BuddyLabel" name="label_2">
-         <property name="text">
-          <string>Overwrite songs:</string>
-         </property>
-         <property name="buddy">
-          <cstring>overwrite</cstring>
-         </property>
-        </widget>
-       </item>
-       <item row="4" column="1">
-        <widget class="OnOffButton" name="overwrite">
-         <property name="text">
-          <string/>
-         </property>
-        </widget>
-       </item>
        <item row="2" column="1">
         <widget class="CapacityBar" name="capacity">
          <property name="sizePolicy">
@@ -150,35 +143,35 @@
          </property>
         </widget>
        </item>
-       <item row="1" column="0">
-        <widget class="QLabel" name="label_3">
-         <property name="text">
-          <string>Copy songs to:</string>
-         </property>
-        </widget>
-       </item>
-       <item row="5" column="0">
+       <item row="3" column="0">
         <widget class="QLabel" name="codecLabel">
          <property name="text">
           <string>Destination format:</string>
          </property>
         </widget>
        </item>
-       <item row="5" column="1">
+       <item row="3" column="1">
         <widget class="QLabel" name="codec">
          <property name="text">
           <string/>
          </property>
         </widget>
        </item>
-       <item row="6" column="0">
+       <item row="4" column="1">
+        <widget class="QCheckBox" name="overwrite">
+         <property name="text">
+          <string>Overwrite songs</string>
+         </property>
+        </widget>
+       </item>
+       <item row="5" column="0">
         <widget class="QLabel" name="songCountLabel">
          <property name="text">
           <string>To copy:</string>
          </property>
         </widget>
        </item>
-       <item row="6" column="1">
+       <item row="5" column="1">
         <widget class="UrlLabel" name="songCount">
          <property name="sizePolicy">
           <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
@@ -188,6 +181,13 @@
          </property>
         </widget>
        </item>
+       <item row="6" column="0" colspan="2">
+        <widget class="UrlLabel" name="mopidyNote">
+         <property name="text" stdset="0">
+          <string><i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i></string>
+         </property>
+        </widget>
+       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="page_3">
@@ -234,7 +234,7 @@
         </spacer>
        </item>
        <item>
-        <widget class="QLabel" name="errorText"/>
+        <widget class="SplitLabelWidget" name="errorText"/>
        </item>
       </layout>
      </widget>
@@ -282,7 +282,7 @@
         </spacer>
        </item>
        <item>
-        <widget class="QLabel" name="skipText"/>
+        <widget class="SplitLabelWidget" name="skipText"/>
        </item>
       </layout>
      </widget>
@@ -330,20 +330,7 @@
         </spacer>
        </item>
        <item row="0" column="2">
-        <widget class="QLabel" name="progressLabel">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="text">
-          <string>TextLabel</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-         </property>
-        </widget>
+        <widget class="SplitLabelWidget" name="progressLabel"/>
        </item>
        <item row="1" column="0" colspan="3">
         <widget class="QProgressBar" name="progressBar">
@@ -360,11 +347,6 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>OnOffButton</class>
-   <extends>QCheckBox</extends>
-   <header>onoffbutton.h</header>
-  </customwidget>
-  <customwidget>
    <class>CapacityBar</class>
    <extends>QProgressBar</extends>
    <header>capacitybar.h</header>
@@ -375,14 +357,14 @@
    <header>actionlabel.h</header>
   </customwidget>
   <customwidget>
-   <class>BuddyLabel</class>
+   <class>UrlLabel</class>
    <extends>QLabel</extends>
-   <header>buddylabel.h</header>
+   <header>urllabel.h</header>
   </customwidget>
   <customwidget>
-   <class>UrlLabel</class>
+   <class>SplitLabelWidget</class>
    <extends>QLabel</extends>
-   <header>urllabel.h</header>
+   <header>splitlabelwidget.h</header>
   </customwidget>
  </customwidgets>
  <tabstops>
diff --git a/devices/albumdetails.ui b/devices/albumdetails.ui
index 7eb3051..82a3ae5 100644
--- a/devices/albumdetails.ui
+++ b/devices/albumdetails.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>553</width>
-    <height>643</height>
+    <width>527</width>
+    <height>507</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
@@ -28,6 +28,9 @@
      <layout class="QGridLayout" name="gridLayout">
       <item row="0" column="0" rowspan="2">
        <layout class="QFormLayout" name="formLayout">
+        <property name="fieldGrowthPolicy">
+         <enum>QFormLayout::ExpandingFieldsGrow</enum>
+        </property>
         <item row="0" column="0">
          <widget class="BuddyLabel" name="label">
           <property name="text">
@@ -91,7 +94,7 @@
          </widget>
         </item>
         <item row="4" column="1">
-         <widget class="SpinBox" name="year"/>
+         <widget class="EmptySpinBox" name="year"/>
         </item>
         <item row="5" column="0">
          <widget class="BuddyLabel" name="label_6">
@@ -104,22 +107,12 @@
          </widget>
         </item>
         <item row="5" column="1">
-         <widget class="SpinBox" name="disc"/>
+         <widget class="EmptySpinBox" name="disc"/>
         </item>
-        <item row="6" column="0">
-         <widget class="BuddyLabel" name="label_5">
+        <item row="6" column="0" colspan="2">
+         <widget class="QCheckBox" name="singleArtist">
           <property name="text">
-           <string>Single artist:</string>
-          </property>
-          <property name="buddy">
-           <cstring>singleArtist</cstring>
-          </property>
-         </widget>
-        </item>
-        <item row="6" column="1">
-         <widget class="OnOffButton" name="singleArtist">
-          <property name="text">
-           <string/>
+           <string>Single artist</string>
           </property>
          </widget>
         </item>
@@ -194,14 +187,9 @@
    <header>completioncombo.h</header>
   </customwidget>
   <customwidget>
-   <class>OnOffButton</class>
-   <extends>QCheckBox</extends>
-   <header>onoffbutton.h</header>
-  </customwidget>
-  <customwidget>
-   <class>SpinBox</class>
+   <class>EmnptySpinBox</class>
    <extends>QSpinBox</extends>
-   <header>spinbox.h</header>
+   <header>emptyspinbox.h</header>
   </customwidget>
  </customwidgets>
  <tabstops>
diff --git a/devices/albumdetailsdialog.cpp b/devices/albumdetailsdialog.cpp
index 095cfd7..30becbc 100644
--- a/devices/albumdetailsdialog.cpp
+++ b/devices/albumdetailsdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -33,9 +33,11 @@
 #include "icons.h"
 #include "coverdialog.h"
 #include "basicitemdelegate.h"
+#include "lineedit.h"
 #include <QMenu>
-#include <QItemDelegate>
+#include <QStyledItemDelegate>
 #include <QMouseEvent>
+#include <QSpinBox>
 
 enum Columns {
     COL_TRACK,
@@ -43,39 +45,40 @@ enum Columns {
     COL_TITLE
 };
 
-class EditorDelegate : public QItemDelegate
+class EditorDelegate : public BasicItemDelegate
 {
 public:
-    EditorDelegate(QObject *parent=0) : QItemDelegate(parent) { }
+    EditorDelegate(QObject *parent=0) : BasicItemDelegate(parent) { }
 
     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
         Q_UNUSED(option);
         if (COL_TRACK==index.column()) {
-            SpinBox *editor = new SpinBox(parent);
+            QSpinBox *editor = new QSpinBox(parent);
             editor->setMinimum(0);
             editor->setMaximum(500);
             return editor;
         } else {
-            return new QLineEdit(parent);
+            parent->setProperty("cantata-delegate", true);
+            return new LineEdit(parent);
         }
     }
 
     QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const {
-        return QItemDelegate::sizeHint(option, index)+QSize(0, 4);
+        return QStyledItemDelegate::sizeHint(option, index)+QSize(0, 4);
     }
 
     void setEditorData(QWidget *editor, const QModelIndex &index) const {
         if (COL_TRACK==index.column()) {
-            static_cast<SpinBox*>(editor)->setValue(index.model()->data(index, Qt::EditRole).toInt());
+            static_cast<QSpinBox*>(editor)->setValue(index.model()->data(index, Qt::EditRole).toInt());
         } else {
-            static_cast<QLineEdit*>(editor)->setText(index.model()->data(index, Qt::EditRole).toString());
+            static_cast<LineEdit*>(editor)->setText(index.model()->data(index, Qt::EditRole).toString());
         }
     }
     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {
         if (COL_TRACK==index.column()) {
-            model->setData(index, static_cast<SpinBox*>(editor)->value(), Qt::EditRole);
+            model->setData(index, static_cast<QSpinBox*>(editor)->value(), Qt::EditRole);
         } else {
-            model->setData(index, static_cast<QLineEdit*>(editor)->text().trimmed(), Qt::EditRole);
+            model->setData(index, static_cast<LineEdit*>(editor)->text().trimmed(), Qt::EditRole);
         }
     }
 
@@ -139,10 +142,7 @@ AlbumDetailsDialog::AlbumDetailsDialog(QWidget *parent)
     toolsMenu->addAction(i18n("Adjust Track Numbers"), this, SLOT(adjustTrackNumbers()));
     setButtonMenu(User1, toolsMenu, InstantPopup);
     setButtonGuiItem(User1, GuiItem(i18n("Tools"), "tools-wizard"));
-    year->setAllowEmpty();
-    disc->setAllowEmpty();
     connect(singleArtist, SIGNAL(toggled(bool)), SLOT(hideArtistColumn(bool)));
-    tracks->setItemDelegate(new EditorDelegate);
     resize(600, 600);
 
     int size=fontMetrics().height()*5;
@@ -150,7 +150,7 @@ AlbumDetailsDialog::AlbumDetailsDialog(QWidget *parent)
     cover->setMaximumSize(size, size);
     setCover();
     cover->installEventFilter(this);
-    tracks->setItemDelegate(new BasicItemDelegate(tracks));
+    tracks->setItemDelegate(new EditorDelegate(tracks));
 }
 
 AlbumDetailsDialog::~AlbumDetailsDialog()
@@ -334,8 +334,6 @@ Song AlbumDetailsDialog::toSong(QTreeWidgetItem *i, const CdAlbum &album)
 
 CdAlbum AlbumDetailsDialog::getAlbum() const
 {
-    static QString unknown=i18n("Unknown");
-
     CdAlbum cdAlbum;
     cdAlbum.artist=artist->text().trimmed();
     cdAlbum.composer=composer->text().trimmed();
@@ -344,10 +342,10 @@ CdAlbum AlbumDetailsDialog::getAlbum() const
     cdAlbum.year=year->value();
     cdAlbum.genre=genre->text().trimmed();
     if (cdAlbum.artist.isEmpty()) {
-        cdAlbum.artist=unknown;
+        cdAlbum.artist=Song::unknown();
     }
     if (cdAlbum.name.isEmpty()) {
-        cdAlbum.name=unknown;
+        cdAlbum.name=Song::unknown();
     }
     return cdAlbum;
 }
diff --git a/devices/albumdetailsdialog.h b/devices/albumdetailsdialog.h
index f476a42..18d2c5a 100644
--- a/devices/albumdetailsdialog.h
+++ b/devices/albumdetailsdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/audiocddevice.cpp b/devices/audiocddevice.cpp
index 4243c4a..c5ed1f5 100644
--- a/devices/audiocddevice.cpp
+++ b/devices/audiocddevice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -235,7 +235,7 @@ void AudioCdDevice::stop()
 {
 }
 
-void AudioCdDevice::copySongTo(const Song &s, const QString &baseDir, const QString &musicPath, bool overwrite, bool copyCover)
+void AudioCdDevice::copySongTo(const Song &s, const QString &musicPath, bool overwrite, bool copyCover)
 {
     jobAbortRequested=false;
     if (!isConnected()) {
@@ -267,9 +267,8 @@ void AudioCdDevice::copySongTo(const Song &s, const QString &baseDir, const QStr
     }
 
     QString source=device;
-    currentMpdDir=baseDir;
+    QString baseDir=MPDConnection::self()->getDetails().dir;
     currentDestFile=encoder.changeExtension(baseDir+musicPath);
-
     QDir dir(Utils::getDir(currentDestFile));
     if (!dir.exists() && !Utils::createWorldReadableDir(dir.absolutePath(), baseDir)) {
         emit actionStatus(DirCreationFaild);
@@ -320,17 +319,25 @@ void AudioCdDevice::copySongToResult(int status)
     if (Ok!=status) {
         emit actionStatus(status);
     } else {
-        currentSong.file=currentDestFile.mid(currentMpdDir.length());
+        currentSong.file=currentDestFile.mid(MPDConnection::self()->getDetails().dir.length());
+        QString origPath;
+        if (MPDConnection::self()->isMopdidy()) {
+            origPath=currentSong.file;
+            currentSong.file=Song::encodePath(currentSong.file);
+        }
         if (needToFixVa) {
             currentSong.revertVariousArtists();
         }
         Utils::setFilePerms(currentDestFile);
         MusicLibraryModel::self()->addSongToList(currentSong);
-        DirViewModel::self()->addFileToList(currentSong.file);
+        DirViewModel::self()->addFileToList(origPath.isEmpty() ? currentSong.file : origPath,
+                                            origPath.isEmpty() ? QString() : currentSong.file);
         emit actionStatus(Ok, job && job->coverCopied());
     }
 }
 
+static const int constBytesPerSecond=44100*4;
+
 void AudioCdDevice::setDetails(const CdAlbum &a)
 {
     bool differentAlbum=album!=a.name || artist!=a.artist;
@@ -344,8 +351,9 @@ void AudioCdDevice::setDetails(const CdAlbum &a)
     disc=a.disc;
     update=new MusicLibraryItemRoot();
     int totalDuration=0;
-    foreach (const Song &s, a.tracks) {
+    foreach (Song s, a.tracks) {
         totalDuration+=s.time;
+        s.size=s.time*constBytesPerSecond;
         update->append(new MusicLibraryItemSong(s, update));
     }
     setStatusMessage(QString());
@@ -357,12 +365,14 @@ void AudioCdDevice::setDetails(const CdAlbum &a)
     emit updating(id(), false);
     if (differentAlbum && !a.isDefault) {
         Song s;
-        s.artist=artist;
+        s.artist=s.albumartist=artist;
         s.album=album;
         s.file=AudioCdDevice::coverUrl(id());
+        s.title=id();
+        s.type=Song::Cdda;
         Covers::Image img=Covers::self()->requestImage(s, true);
         if (!img.img.isNull()) {
-            setCover(s, img.img, img.fileName);
+            setCover(img);
         }
     }
 
diff --git a/devices/audiocddevice.h b/devices/audiocddevice.h
index d1a8cc0..a80cdfe 100644
--- a/devices/audiocddevice.h
+++ b/devices/audiocddevice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,6 +26,7 @@
 
 #include "device.h"
 #include "covers.h"
+#include "httpserver.h"
 #ifdef ENABLE_KDE_SUPPORT
 #include <solid/opticaldrive.h>
 #else
@@ -66,7 +67,7 @@ public:
     void stop();
     QString path() const { return devPath; }
     void addSong(const Song &, bool, bool) { }
-    void copySongTo(const Song &s, const QString &baseDir, const QString &musicPath, bool overwrite, bool copyCover);
+    void copySongTo(const Song &s, const QString &musicPath, bool overwrite, bool copyCover);
     void removeSong(const Song &) { }
     void cleanDirs(const QSet<QString> &) { }
     double usedCapacity() { return 1.0; }
@@ -76,7 +77,7 @@ public:
     void saveOptions() { }
     QString subText() { return album; }
     quint32 totalTime();
-    bool canPlaySongs() const { return true; }
+    bool canPlaySongs() const { return HttpServer::self()->isAlive(); }
     QString albumName() const { return album; }
     QString albumArtist() const { return artist; }
     QString albumComposer() const { return composer; }
diff --git a/devices/audiocdsettings.cpp b/devices/audiocdsettings.cpp
index 1724860..04ab0ff 100644
--- a/devices/audiocdsettings.cpp
+++ b/devices/audiocdsettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/audiocdsettings.h b/devices/audiocdsettings.h
index 7100af5..68272ba 100644
--- a/devices/audiocdsettings.h
+++ b/devices/audiocdsettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/audiocdsettings.ui b/devices/audiocdsettings.ui
index 607e441..1c3779e 100644
--- a/devices/audiocdsettings.ui
+++ b/devices/audiocdsettings.ui
@@ -11,7 +11,16 @@
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="margin">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
     <number>0</number>
    </property>
    <item>
@@ -20,19 +29,9 @@
       <string>Album and Track Information Retrieval</string>
      </property>
      <layout class="QFormLayout" name="formLayout">
-      <item row="0" column="0">
-       <widget class="BuddyLabel" name="label_3">
-        <property name="text">
-         <string>Automatically lookup:</string>
-        </property>
-        <property name="buddy">
-         <cstring>cdAuto</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="OnOffButton" name="cdAuto"/>
-      </item>
+      <property name="fieldGrowthPolicy">
+       <enum>QFormLayout::ExpandingFieldsGrow</enum>
+      </property>
       <item row="1" column="0">
        <widget class="BuddyLabel" name="cdLookupLabel">
         <property name="text">
@@ -70,7 +69,7 @@
        </widget>
       </item>
       <item row="3" column="1">
-       <widget class="SpinBox" name="cddbPort">
+       <widget class="QSpinBox" name="cddbPort">
         <property name="minimum">
          <number>1</number>
         </property>
@@ -79,6 +78,13 @@
         </property>
        </widget>
       </item>
+      <item row="4" column="0" colspan="2">
+       <widget class="QCheckBox" name="cdAuto">
+        <property name="text">
+         <string>Lookup information as soon as CD is inserted</string>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
@@ -87,33 +93,21 @@
      <property name="title">
       <string>Audio Extraction</string>
      </property>
-     <layout class="QFormLayout" name="formLayout_2">
-      <item row="0" column="0">
-       <widget class="BuddyLabel" name="label_4">
+     <layout class="QVBoxLayout" name="verticalLayout_2">
+      <item>
+       <widget class="QCheckBox" name="paranoiaFull">
         <property name="text">
-         <string>Full paranoia mode (best quality):</string>
-        </property>
-        <property name="buddy">
-         <cstring>paranoiaFull</cstring>
+         <string>Full paranoia mode (best quality)</string>
         </property>
        </widget>
       </item>
-      <item row="0" column="1">
-       <widget class="OnOffButton" name="paranoiaFull"/>
-      </item>
-      <item row="1" column="0">
-       <widget class="BuddyLabel" name="label_5">
+      <item>
+       <widget class="QCheckBox" name="paranoiaNeverSkip">
         <property name="text">
-         <string>Never skip on read error:</string>
-        </property>
-        <property name="buddy">
-         <cstring>paranoiaNeverSkip</cstring>
+         <string>Never skip on read error</string>
         </property>
        </widget>
       </item>
-      <item row="1" column="1">
-       <widget class="OnOffButton" name="paranoiaNeverSkip"/>
-      </item>
      </layout>
     </widget>
    </item>
@@ -143,24 +137,7 @@
    <extends>QLineEdit</extends>
    <header>lineedit.h</header>
   </customwidget>
-  <customwidget>
-   <class>OnOffButton</class>
-   <extends>QCheckBox</extends>
-   <header>onoffbutton.h</header>
-  </customwidget>
-  <customwidget>
-   <class>SpinBox</class>
-   <extends>QSpinBox</extends>
-   <header>spinbox.h</header>
-  </customwidget>
  </customwidgets>
- <tabstops>
-  <tabstop>cdAuto</tabstop>
-  <tabstop>cddbHost</tabstop>
-  <tabstop>cddbPort</tabstop>
-  <tabstop>paranoiaFull</tabstop>
-  <tabstop>paranoiaNeverSkip</tabstop>
- </tabstops>
  <resources/>
  <connections/>
 </ui>
diff --git a/devices/avahi/avahi.cpp b/devices/avahi/avahi.cpp
index b13fd98..8f29bf7 100644
--- a/devices/avahi/avahi.cpp
+++ b/devices/avahi/avahi.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/avahi/avahi.h b/devices/avahi/avahi.h
index 948ebd1..f28385f 100644
--- a/devices/avahi/avahi.h
+++ b/devices/avahi/avahi.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/avahi/avahiservice.cpp b/devices/avahi/avahiservice.cpp
index 173cf5e..d3206b1 100644
--- a/devices/avahi/avahiservice.cpp
+++ b/devices/avahi/avahiservice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/avahi/avahiservice.h b/devices/avahi/avahiservice.h
index 7c67a6c..d79e7b7 100644
--- a/devices/avahi/avahiservice.h
+++ b/devices/avahi/avahiservice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/cdalbum.h b/devices/cdalbum.h
index eaf7205..0ae48ef 100644
--- a/devices/cdalbum.h
+++ b/devices/cdalbum.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/cddbinterface.cpp b/devices/cddbinterface.cpp
index 5c4a8ab..bbb99c9 100644
--- a/devices/cddbinterface.cpp
+++ b/devices/cddbinterface.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -140,7 +140,7 @@ void CddbInterface::readDisc()
         emit error(i18n("Failed to open CD device"));
         return;
     }
-    QByteArray unknown=i18n("Unknown").toUtf8();
+    QByteArray unknown=Song::unknown().toUtf8();
 
     #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
     struct ioc_toc_header th;
diff --git a/devices/cddbinterface.h b/devices/cddbinterface.h
index e20ed25..3a48a0c 100644
--- a/devices/cddbinterface.h
+++ b/devices/cddbinterface.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/cddbselectiondialog.cpp b/devices/cddbselectiondialog.cpp
index 0693346..4f802d8 100644
--- a/devices/cddbselectiondialog.cpp
+++ b/devices/cddbselectiondialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/cddbselectiondialog.h b/devices/cddbselectiondialog.h
index 50313e1..91fdb7d 100644
--- a/devices/cddbselectiondialog.h
+++ b/devices/cddbselectiondialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/cdparanoia.cpp b/devices/cdparanoia.cpp
index 55b3946..305616a 100644
--- a/devices/cdparanoia.cpp
+++ b/devices/cdparanoia.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -89,11 +89,11 @@ void CdParanoia::setParanoiaMode(int mode)
     }
 }
 
-void CdParanoia::setNeverSkip(bool b)
-{
-    neverSkip = b;
-    setParanoiaMode(paranoiaMode);
-}
+//void CdParanoia::setNeverSkip(bool b)
+//{
+//    neverSkip = b;
+//    setParanoiaMode(paranoiaMode);
+//}
 
 qint16 * CdParanoia::read()
 {
@@ -115,15 +115,15 @@ int CdParanoia::lastSectorOfTrack(int track)
     return paranoia ? cdda_track_lastsector(drive, track) : -1;
 }
 
-int CdParanoia::firstSectorOfDisc()
-{
-    return paranoia ? cdda_disc_firstsector(drive) : -1;
-}
+//int CdParanoia::firstSectorOfDisc()
+//{
+//    return paranoia ? cdda_disc_firstsector(drive) : -1;
+//}
 
-int CdParanoia::lastSectorOfDisc()
-{
-    return paranoia ? cdda_disc_lastsector(drive) : -1;
-}
+//int CdParanoia::lastSectorOfDisc()
+//{
+//    return paranoia ? cdda_disc_lastsector(drive) : -1;
+//}
 
 void CdParanoia::reset()
 {
diff --git a/devices/cdparanoia.h b/devices/cdparanoia.h
index cc0ba6e..99dfeb7 100644
--- a/devices/cdparanoia.h
+++ b/devices/cdparanoia.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -41,7 +41,7 @@ public:
 
     void setParanoiaMode(int mode);
     void setFullParanoiaMode(bool f) { setParanoiaMode(f ? 3 : 0); }
-    void setNeverSkip(bool b);
+//    void setNeverSkip(bool b);
     void setMaxRetries(int m) { maxRetries=m; }
 
     qint16 * read();
@@ -49,8 +49,8 @@ public:
 
     int firstSectorOfTrack(int track);
     int lastSectorOfTrack(int track);
-    int firstSectorOfDisc();
-    int lastSectorOfDisc();
+//    int firstSectorOfDisc();
+//    int lastSectorOfDisc();
     int length();
 
     int lengthOfTrack(int n);
diff --git a/devices/device.cpp b/devices/device.cpp
index 5a4eae9..74965c1 100644
--- a/devices/device.cpp
+++ b/devices/device.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -25,11 +25,12 @@
 #include "device.h"
 #include "covers.h"
 #include "utils.h"
+#include "mpdconnection.h"
 #include <QBuffer>
 #include <QDir>
 #include <QTemporaryFile>
 #include <QTimer>
-#ifndef Q_OS_WIN
+#ifdef ENABLE_DEVICES_SUPPORT
 #include "devicesmodel.h"
 #include "umsdevice.h"
 #ifdef MTP_FOUND
@@ -57,7 +58,7 @@
 #include "solid-lite/storagedrive.h"
 #include "solid-lite/opticaldisc.h"
 #endif // ENABLE_KDE_SUPPORT
-#endif // Q_OS_WIN
+#endif // ENABLE_DEVICES_SUPPORT
 
 void Device::moveDir(const QString &from, const QString &to, const QString &base, const QString &coverFile)
 {
@@ -67,19 +68,26 @@ void Device::moveDir(const QString &from, const QString &to, const QString &base
         QList<QString> extraFiles;
         QSet<QString> others=Covers::standardNames().toSet();
         others << coverFile << "albumart.pamp";
+        if (!coverFile.isEmpty()) {
+            if (coverFile.endsWith(QLatin1String(".jpg"))) {
+                others << coverFile.left(coverFile.length()-4)+QLatin1String(".png");
+            } else if (coverFile.endsWith(QLatin1String(".png"))) {
+                others << coverFile.left(coverFile.length()-4)+QLatin1String(".jpg");
+            }
+        }
 
         foreach (const QFileInfo &info, entries) {
             if (info.isDir()) {
                 return;
             }
-            if (!others.contains(info.fileName())) {
+            if (!others.contains(info.fileName()) && !MPDConnection::isPlaylist(info.fileName())) {
                 return;
             }
             extraFiles.append(info.fileName());
         }
 
-        foreach (const QString &cf, extraFiles) {
-            if (!QFile::rename(from+'/'+cf, to+'/'+cf)) {
+        foreach (const QString &f, extraFiles) {
+            if (!QFile::rename(from+'/'+f, to+'/'+f)) {
                 return;
             }
         }
@@ -145,7 +153,7 @@ Song Device::fixPath(const Song &orig, bool fullPath) const
     return s;
 }
 
-#ifndef Q_OS_WIN
+#ifdef ENABLE_DEVICES_SUPPORT
 
 #include <unistd.h>
 
@@ -272,6 +280,7 @@ QTemporaryFile * Device::copySongToTemp(Song &song)
         }
         if (!QFile::copy(song.file, temp->fileName())) {
             temp->remove();
+            delete temp;
             temp=0;
         }
     }
@@ -351,4 +360,4 @@ void Device::updatePercentage(int pc)
     setStatusMessage(i18n("Updating (%1%)...", pc));
 }
 
-#endif // Q_OS_WIN
+#endif // ENABLE_DEVICES_SUPPORT
diff --git a/devices/device.h b/devices/device.h
index 843da11..11e0de5 100644
--- a/devices/device.h
+++ b/devices/device.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,7 +26,7 @@
 
 #include "musiclibraryitemroot.h"
 #include "song.h"
-#ifndef Q_OS_WIN
+#ifdef ENABLE_DEVICES_SUPPORT
 #include "deviceoptions.h"
 #ifdef ENABLE_KDE_SUPPORT
 #include <solid/device.h>
@@ -51,7 +51,7 @@ class Device : public MusicLibraryItemRoot, public QObject
     Q_OBJECT
 
 public:
-    #ifndef Q_OS_WIN
+    #ifdef ENABLE_DEVICES_SUPPORT
     static const QLatin1String constNoCover;
     static const QLatin1String constEmbedCover;
     static Device * create(MusicModel *m, const QString &id);
@@ -92,12 +92,13 @@ public:
         AudioCd
     };
 
-    #ifdef Q_OS_WIN
+    #ifndef ENABLE_DEVICES_SUPPORT
     Device(MusicModel *m, const QString &name, const QString &id)
         : MusicLibraryItemRoot(name)
         , update(0)
         , needToFixVa(false)
-        , jobAbortRequested(false) {
+        , jobAbortRequested(false)
+        , transcoding(false) {
         setUseArtistImages(false);
         setUseAlbumImages(true);
         Q_UNUSED(m)
@@ -148,7 +149,7 @@ public:
     virtual void configure(QWidget *) { }
     virtual QString path() const =0;
     virtual void addSong(const Song &s, bool overwrite, bool copyCover)=0;
-    virtual void copySongTo(const Song &s, const QString &baseDir, const QString &musicPath, bool overwrite, bool copyCover)=0;
+    virtual void copySongTo(const Song &s, const QString &musicPath, bool overwrite, bool copyCover)=0;
     virtual void removeSong(const Song &s)=0;
     virtual void cleanDirs(const QSet<QString> &dirs)=0;
     virtual void requestCover(const Song &) { }
@@ -159,7 +160,7 @@ public:
     virtual void removeCache() { }
     virtual bool isDevice() const { return true; }
 
-    #ifndef Q_OS_WIN
+    #ifdef ENABLE_DEVICES_SUPPORT
     void toggleGrouping();
     virtual void saveCache();
     const QString & id() const { return deviceId; }
@@ -178,9 +179,6 @@ public:
     virtual bool isStdFs() const { return false; }
     virtual QString subText() { return QString(); }
     QModelIndex index() const;
-    #endif
-
-    #if !defined Q_OS_WIN && !defined WIN32
     void updateStatus();
 
 public Q_SLOTS:
@@ -204,7 +202,7 @@ Q_SIGNALS:
     void updatedDetails(const QList<Song> &songs);
 
 protected:
-    #ifndef Q_OS_WIN
+    #ifdef ENABLE_DEVICES_SUPPORT
     DeviceOptions opts;
     bool configured;
     Solid::Device solidDev;
@@ -213,7 +211,6 @@ protected:
     #endif
     MusicLibraryItemRoot *update;
     QString currentDestFile;
-    QString currentMpdDir;
     QString statusMsg;
     bool needToFixVa;
     bool jobAbortRequested;
diff --git a/devices/deviceoptions.cpp b/devices/deviceoptions.cpp
index 652bc3b..a507e4a 100644
--- a/devices/deviceoptions.cpp
+++ b/devices/deviceoptions.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -284,9 +284,6 @@ void DeviceOptions::save(const QString &group, bool isMpd, bool saveTrans, bool
     #ifndef ENABLE_KDE_SUPPORT
     cfg.endGroup();
     #endif
-    if (isMpd && HAS_GROUP(constMpdGroup)) {
-        REMOVE_GROUP(constMpdGroup);
-    }
 }
 
 QString DeviceOptions::clean(const QString &str) const
@@ -357,7 +354,7 @@ QString DeviceOptions::createFilename(const Song &s) const
     }
     path.replace(constTrackNumber, track);
     path.replace(constCdNumber, copy.disc<1 ? QLatin1String("") : QString::number(copy.disc));
-    path.replace(constGenre, copy.genre.isEmpty() ? i18n("Unknown") : copy.genre);
+    path.replace(constGenre, copy.genre.isEmpty() ? Song::unknown() : copy.genre);
     path.replace(constYear, copy.year<1 ? QLatin1String("") : QString::number(copy.year));
 
     // For songs about to be downloaded from streams, we hide the filetype in genre...
diff --git a/devices/deviceoptions.h b/devices/deviceoptions.h
index 7c412bb..6630baf 100644
--- a/devices/deviceoptions.h
+++ b/devices/deviceoptions.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/devicepropertiesdialog.cpp b/devices/devicepropertiesdialog.cpp
index 5341d65..61a91d7 100644
--- a/devices/devicepropertiesdialog.cpp
+++ b/devices/devicepropertiesdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/devicepropertiesdialog.h b/devices/devicepropertiesdialog.h
index ba7885b..452e0f7 100644
--- a/devices/devicepropertiesdialog.h
+++ b/devices/devicepropertiesdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/devicepropertieswidget.cpp b/devices/devicepropertieswidget.cpp
index 3e6a17d..1b5d34e 100644
--- a/devices/devicepropertieswidget.cpp
+++ b/devices/devicepropertieswidget.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -94,7 +94,6 @@ DevicePropertiesWidget::DevicePropertiesWidget(QWidget *parent)
                                        "will check if 'Album Artist' and 'Artist' are both set to 'Various Artists'. If so, it "
                                        "will attempt to extract the real artist from the 'Title' tag, and remove the artist name "
                                        "from the 'Title' tag.</p>"));
-    fixVariousArtistsLabel->setToolTip(fixVariousArtists->toolTip());
 
     useCache->setToolTip(i18n("<p>If you enable this, then Cantata will create a cache of the device's music library. "
                               "This will help to speed up subsequent library scans (as the cache file will be used instead of "
@@ -102,7 +101,6 @@ DevicePropertiesWidget::DevicePropertiesWidget(QWidget *parent)
                               "the device's library, then this cache will become out-of-date. To rectify this, simply "
                               "click on the 'refresh' icon in the device list. This will cause the cache file to be removed, and "
                               "the contents of the device re-scanned.</p>"));
-    useCacheLabel->setToolTip(useCache->toolTip());
 
     if (qobject_cast<QTabWidget *>(parent)) {
         verticalLayout->setMargin(4);
@@ -190,21 +188,18 @@ void DevicePropertiesWidget::update(const QString &path, const DeviceOptions &op
         connect(fixVariousArtists, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
     } else {
         REMOVE(fixVariousArtists);
-        REMOVE(fixVariousArtistsLabel);
     }
     if (props&Prop_Cache) {
         useCache->setChecked(opts.useCache);
         connect(useCache, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
     } else {
         REMOVE(useCache);
-        REMOVE(useCacheLabel);
     }
     if (props&Prop_AutoScan) {
         autoScan->setChecked(opts.autoScan);
         connect(autoScan, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
     } else {
         REMOVE(autoScan);
-        REMOVE(autoScanLabel);
     }
 
     if (props&Prop_Transcoder || props&Prop_Encoder) {
@@ -214,14 +209,12 @@ void DevicePropertiesWidget::update(const QString &path, const DeviceOptions &op
             transcoderName->addItem(i18n("Do not transcode"), QString());
             transcoderName->setCurrentIndex(0);
             transcoderValue->setVisible(false);
-            transcoderWhenDifferentLabel->setVisible(false);
             transcoderWhenDifferent->setVisible(false);
             transcoderWhenDifferent->setChecked(opts.transcoderWhenDifferent);
             connect(transcoderWhenDifferent, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
         } else {
             transcoderFrame->setTitle(i18n("Encoder"));
             REMOVE(transcoderWhenDifferent);
-            REMOVE(transcoderWhenDifferentLabel);
         }
 
         QList<Encoders::Encoder> encs=Encoders::getAvailable();
@@ -301,14 +294,12 @@ void DevicePropertiesWidget::transcoderChanged()
         transcoderName->setToolTip(QString());
         transcoderValue->setVisible(false);
         if (transcoderWhenDifferent) {
-            transcoderWhenDifferentLabel->setVisible(false);
             transcoderWhenDifferent->setVisible(false);
         }
     } else {
         Encoders::Encoder enc=Encoders::getEncoder(codec);
         transcoderName->setToolTip(enc.description);
         if (transcoderWhenDifferent) {
-            transcoderWhenDifferentLabel->setVisible(true);
             transcoderWhenDifferent->setVisible(true);
         }
         if (enc.values.count()) {
diff --git a/devices/devicepropertieswidget.h b/devices/devicepropertieswidget.h
index 4cf7d5e..d3dfb5b 100644
--- a/devices/devicepropertieswidget.h
+++ b/devices/devicepropertieswidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/devicepropertieswidget.ui b/devices/devicepropertieswidget.ui
index d6bda7f..0145483 100644
--- a/devices/devicepropertieswidget.ui
+++ b/devices/devicepropertieswidget.ui
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>549</width>
-    <height>496</height>
+    <height>528</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
@@ -76,55 +76,37 @@
        </property>
       </widget>
      </item>
+     <item row="3" column="1">
+      <widget class="QComboBox" name="defaultVolume"/>
+     </item>
      <item row="3" column="0">
-      <widget class="BuddyLabel" name="fixVariousArtistsLabel">
+      <widget class="QLabel" name="defaultVolumeLabel">
        <property name="text">
-        <string>'Various Artists' workaround:</string>
-       </property>
-       <property name="buddy">
-        <cstring>fixVariousArtists</cstring>
+        <string>Default volume:</string>
        </property>
       </widget>
      </item>
-     <item row="3" column="1">
-      <widget class="OnOffButton" name="fixVariousArtists"/>
-     </item>
-     <item row="4" column="0">
-      <widget class="BuddyLabel" name="autoScanLabel">
+     <item row="4" column="0" colspan="2">
+      <widget class="QCheckBox" name="fixVariousArtists">
        <property name="text">
-        <string>Automatically scan music when attached:</string>
-       </property>
-       <property name="buddy">
-        <cstring>autoScan</cstring>
+        <string>'Various Artists' workaround</string>
        </property>
       </widget>
      </item>
-     <item row="4" column="1">
-      <widget class="OnOffButton" name="autoScan"/>
-     </item>
-     <item row="5" column="0">
-      <widget class="BuddyLabel" name="useCacheLabel">
+     <item row="5" column="0" colspan="2">
+      <widget class="QCheckBox" name="autoScan">
        <property name="text">
-        <string>Use cache:</string>
-       </property>
-       <property name="buddy">
-        <cstring>useCache</cstring>
+        <string>Automatically scan music when attached</string>
        </property>
       </widget>
      </item>
-     <item row="5" column="1">
-      <widget class="OnOffButton" name="useCache"/>
-     </item>
-     <item row="6" column="0">
-      <widget class="QLabel" name="defaultVolumeLabel">
+     <item row="6" column="0" colspan="2">
+      <widget class="QCheckBox" name="useCache">
        <property name="text">
-        <string>Default volume:</string>
+        <string>Use cache</string>
        </property>
       </widget>
      </item>
-     <item row="6" column="1">
-      <widget class="QComboBox" name="defaultVolume"/>
-     </item>
     </layout>
    </item>
    <item>
@@ -136,57 +118,6 @@
       <property name="fieldGrowthPolicy">
        <enum>QFormLayout::ExpandingFieldsGrow</enum>
       </property>
-      <item row="1" column="0">
-       <widget class="BuddyLabel" name="label_3">
-        <property name="text">
-         <string>Use only ASCII characters:</string>
-        </property>
-        <property name="buddy">
-         <cstring>asciiOnly</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="OnOffButton" name="asciiOnly">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="0">
-       <widget class="BuddyLabel" name="label_4">
-        <property name="text">
-         <string>Replace spaces with underscores:</string>
-        </property>
-        <property name="buddy">
-         <cstring>replaceSpaces</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="OnOffButton" name="replaceSpaces">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="0">
-       <widget class="BuddyLabel" name="label_5">
-        <property name="text">
-         <string>Ignore 'The' in artist names:</string>
-        </property>
-        <property name="buddy">
-         <cstring>ignoreThe</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1">
-       <widget class="OnOffButton" name="ignoreThe">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
       <item row="4" column="0">
        <widget class="BuddyLabel" name="label_6">
         <property name="text">
@@ -224,20 +155,31 @@
         </item>
        </layout>
       </item>
-      <item row="0" column="1">
-       <widget class="OnOffButton" name="vfatSafe">
+      <item row="0" column="0" colspan="2">
+       <widget class="QCheckBox" name="vfatSafe">
         <property name="text">
-         <string/>
+         <string>VFAT safe</string>
         </property>
        </widget>
       </item>
-      <item row="0" column="0">
-       <widget class="BuddyLabel" name="label_2">
+      <item row="1" column="0" colspan="2">
+       <widget class="QCheckBox" name="asciiOnly">
         <property name="text">
-         <string>VFAT safe:</string>
+         <string>Use only ASCII characters</string>
         </property>
-        <property name="buddy">
-         <cstring>vfatSafe</cstring>
+       </widget>
+      </item>
+      <item row="2" column="0" colspan="2">
+       <widget class="QCheckBox" name="replaceSpaces">
+        <property name="text">
+         <string>Replace spaces with underscores</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0" colspan="2">
+       <widget class="QCheckBox" name="ignoreThe">
+        <property name="text">
+         <string>Ignore 'The' in artist names</string>
         </property>
        </widget>
       </item>
@@ -254,21 +196,11 @@
        <widget class="QComboBox" name="transcoderName"/>
       </item>
       <item>
-       <layout class="QFormLayout" name="formLayout_3">
-        <item row="0" column="0">
-         <widget class="BuddyLabel" name="transcoderWhenDifferentLabel">
-          <property name="text">
-           <string>Only transcode if source file is of a different format:</string>
-          </property>
-          <property name="buddy">
-           <cstring>transcoderWhenDifferent</cstring>
-          </property>
-         </widget>
-        </item>
-        <item row="0" column="1">
-         <widget class="OnOffButton" name="transcoderWhenDifferent"/>
-        </item>
-       </layout>
+       <widget class="QCheckBox" name="transcoderWhenDifferent">
+        <property name="text">
+         <string>Only transcode if source file is of a different format</string>
+        </property>
+       </widget>
       </item>
       <item>
        <widget class="ValueSlider" name="transcoderValue"/>
@@ -293,16 +225,16 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>OnOffButton</class>
-   <extends>QCheckBox</extends>
-   <header>onoffbutton.h</header>
-  </customwidget>
-  <customwidget>
    <class>LineEdit</class>
    <extends>QLineEdit</extends>
    <header>lineedit.h</header>
   </customwidget>
   <customwidget>
+   <class>BuddyLabel</class>
+   <extends>QLabel</extends>
+   <header>buddylabel.h</header>
+  </customwidget>
+  <customwidget>
    <class>PathRequester</class>
    <extends>QLineEdit</extends>
    <header>pathrequester.h</header>
@@ -313,20 +245,15 @@
    <extends>QSlider</extends>
    <header>valueslider.h</header>
   </customwidget>
-  <customwidget>
-   <class>BuddyLabel</class>
-   <extends>QLabel</extends>
-   <header>buddylabel.h</header>
-  </customwidget>
  </customwidgets>
  <tabstops>
   <tabstop>musicFolder</tabstop>
   <tabstop>albumCovers</tabstop>
   <tabstop>coverMaxSize</tabstop>
+  <tabstop>defaultVolume</tabstop>
   <tabstop>fixVariousArtists</tabstop>
   <tabstop>autoScan</tabstop>
   <tabstop>useCache</tabstop>
-  <tabstop>defaultVolume</tabstop>
   <tabstop>vfatSafe</tabstop>
   <tabstop>asciiOnly</tabstop>
   <tabstop>replaceSpaces</tabstop>
diff --git a/devices/devicespage.cpp b/devices/devicespage.cpp
index 1920d7b..468bc33 100644
--- a/devices/devicespage.cpp
+++ b/devices/devicespage.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -65,7 +65,6 @@ DevicesPage::DevicesPage(QWidget *p)
     copyAction = ActionCollection::get()->createAction("copytolibrary", i18n("Copy To Library"), Icons::self()->importIcon);
     copyToLibraryButton->setDefaultAction(copyAction);
     syncAction = ActionCollection::get()->createAction("syncdevice", i18n("Sync"), "folder-sync");
-    searchButton->setDefaultAction(StdActions::self()->searchAction);
     connect(syncAction, SIGNAL(triggered()), this, SLOT(sync()));
     #ifdef ENABLE_REMOTE_DEVICES
     forgetDeviceAction=ActionCollection::get()->createAction("forgetdevice", i18n("Forget Device"), "list-remove");
@@ -129,6 +128,7 @@ DevicesPage::DevicesPage(QWidget *p)
     proxy.setSourceModel(DevicesModel::self());
     view->setModel(&proxy);
     view->setRootIsDecorated(false);
+    view->setSearchResetLevel(1);
 }
 
 DevicesPage::~DevicesPage()
@@ -144,7 +144,7 @@ void DevicesPage::showEvent(QShowEvent *e)
 void DevicesPage::clear()
 {
     DevicesModel::self()->clear();
-    view->setLevel(0);
+    view->goToTop();
 }
 
 QString DevicesPage::activeFsDeviceUdi() const
@@ -203,8 +203,9 @@ QStringList DevicesPage::playableUrls() const
     return DevicesModel::self()->playableUrls(mapped);
 }
 
-QList<Song> DevicesPage::selectedSongs() const
+QList<Song> DevicesPage::selectedSongs(bool allowPlaylists) const
 {
+    Q_UNUSED(allowPlaylists)
     QModelIndexList selected = view->selectedIndexes();
     if (selected.isEmpty()) {
         return QList<Song>();
@@ -235,8 +236,9 @@ QList<Song> DevicesPage::selectedSongs() const
     return DevicesModel::self()->songs(mapped);
 }
 
-void DevicesPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty)
+void DevicesPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty, bool randomAlbums)
 {
+    Q_UNUSED(randomAlbums)
     QStringList files=playableUrls();
 
     if (!files.isEmpty()) {
@@ -251,8 +253,8 @@ void DevicesPage::addSelectionToPlaylist(const QString &name, bool replace, quin
 
 void DevicesPage::refresh()
 {
-    view->setLevel(0);
-    DevicesModel::self()->clearImages();
+    view->goToTop();
+    DevicesModel::self()->resetModel();
     if (ItemView::Mode_SimpleTree==view->viewMode() || ItemView::Mode_DetailedTree==view->viewMode()) {
         for (int i=0; i<DevicesModel::self()->rowCount(QModelIndex()); ++i) {
             view->setExpanded(proxy.mapFromSource(DevicesModel::self()->index(i, 0, QModelIndex())));
diff --git a/devices/devicespage.h b/devices/devicespage.h
index 4e9247b..534b8b4 100644
--- a/devices/devicespage.h
+++ b/devices/devicespage.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,7 +26,7 @@
 
 #include "ui_devicespage.h"
 #include "device.h"
-#include "config.h"
+#include "page.h"
 #ifdef ENABLE_REMOTE_DEVICES
 #include "remotefsdevice.h"
 #endif
@@ -35,7 +35,7 @@
 
 class Action;
 
-class DevicesPage : public QWidget, public Ui::DevicesPage
+class DevicesPage : public QWidget, public Ui::DevicesPage, public Page
 {
     Q_OBJECT
 
@@ -46,11 +46,10 @@ public:
     void clear();
     QString activeFsDeviceUdi() const;
     QStringList playableUrls() const;
-    QList<Song> selectedSongs() const;
-    void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0);
+    QList<Song> selectedSongs(bool allowPlaylists=false) const;
+    void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0, bool randomAlbums=false);
     void setView(int v) { view->setMode((ItemView::Mode)v); }
     void focusSearch() { view->focusSearch(); }
-    void goBack() { view->backActivated(); }
     void refresh();
     void showEvent(QShowEvent *e);
 
diff --git a/devices/devicespage.ui b/devices/devicespage.ui
index c16f1f5..db2da11 100644
--- a/devices/devicespage.ui
+++ b/devices/devicespage.ui
@@ -47,9 +47,6 @@
       <number>0</number>
      </property>
      <item>
-      <widget class="ToolButton" name="searchButton"/>
-     </item>
-     <item>
       <widget class="GenreCombo" name="genreCombo"/>
      </item>
      <item>
diff --git a/devices/encoders.cpp b/devices/encoders.cpp
index 9b5dbb7..903f733 100644
--- a/devices/encoders.cpp
+++ b/devices/encoders.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * Large portions of this file, mainly the textual descriptions, etc, are taken from
  * Amarok - hence the (c) notice below...
diff --git a/devices/encoders.h b/devices/encoders.h
index 61efe84..502fce7 100644
--- a/devices/encoders.h
+++ b/devices/encoders.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -41,7 +41,7 @@ namespace Encoders
 
     struct Encoder {
         Encoder()
-            : defaultValueIndex(0) {
+            : defaultValueIndex(0), ffmpegValueMultiplier(0), transcoder(false) {
         }
         Encoder(const QString &n, const QString &d, const QString &t, const QString &e, const QString &a, const QString &c,
                 const QString &f, const QString &v, const QList<Setting> &vs, const QString &l, const QString &h, int def, int mult=1)
diff --git a/devices/extractjob.cpp b/devices/extractjob.cpp
index c162539..6c8b6c6 100644
--- a/devices/extractjob.cpp
+++ b/devices/extractjob.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/extractjob.h b/devices/extractjob.h
index 3793fe4..da1d3ad 100644
--- a/devices/extractjob.h
+++ b/devices/extractjob.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/filejob.cpp b/devices/filejob.cpp
index ebf5d11..fd28e7f 100644
--- a/devices/filejob.cpp
+++ b/devices/filejob.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -55,6 +55,11 @@ FileThread::FileThread()
 {
 }
 
+FileThread::~FileThread()
+{
+    stop();
+}
+
 void FileThread::addJob(FileJob *job)
 {
     if (!thread) {
diff --git a/devices/filejob.h b/devices/filejob.h
index cdd9ee3..b875c39 100644
--- a/devices/filejob.h
+++ b/devices/filejob.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -40,6 +40,7 @@ public:
     static FileThread * self();
 
     FileThread();
+    ~FileThread();
     void addJob(FileJob *job);
     void stop();
 private:
diff --git a/devices/filenameschemedialog.cpp b/devices/filenameschemedialog.cpp
index d32595f..0b1d5e4 100644
--- a/devices/filenameschemedialog.cpp
+++ b/devices/filenameschemedialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,8 +26,9 @@
 #include "localize.h"
 #include "messagebox.h"
 
+static const char * constVariableProperty="cantata-var";
 FilenameSchemeDialog::FilenameSchemeDialog(QWidget *parent)
-    : Dialog(parent, "FilenameSchemeDialog")
+    : Dialog(parent)
 {
     setButtons(Ok|Cancel);
     setCaption(i18n("Filename Scheme"));
@@ -38,17 +39,26 @@ FilenameSchemeDialog::FilenameSchemeDialog(QWidget *parent)
     connect(pattern, SIGNAL(textChanged(const QString &)), this, SLOT(enableOkButton()));
     connect(pattern, SIGNAL(textChanged(const QString &)), this, SLOT(updateExample()));
     connect(help, SIGNAL(leftClickedUrl()), this, SLOT(showHelp()));
-    connect(albumArtist, SIGNAL(clicked()), this, SLOT(insertAlbumArtist()));
-    connect(composer, SIGNAL(clicked()), this, SLOT(insertComposer()));
-    connect(albumTitle, SIGNAL(clicked()), this, SLOT(insertAlbumTitle()));
-    connect(trackArtist, SIGNAL(clicked()), this, SLOT(insertTrackArtist()));
-    connect(trackTitle, SIGNAL(clicked()), this, SLOT(insertTrackTitle()));
-    connect(trackArtistAndTitle, SIGNAL(clicked()), this, SLOT(insertTrackArtistAndTitle()));
-    connect(trackNo, SIGNAL(clicked()), this, SLOT(insertTrackNumber()));
-    connect(cdNo, SIGNAL(clicked()), this, SLOT(insertCdNumber()));
-    connect(genre, SIGNAL(clicked()), this, SLOT(insertGenre()));
-    connect(year, SIGNAL(clicked()), this, SLOT(insertYear()));
-
+    connect(albumArtist, SIGNAL(clicked()), this, SLOT(insertVariable()));
+    connect(composer, SIGNAL(clicked()), this, SLOT(insertVariable()));
+    connect(albumTitle, SIGNAL(clicked()), this, SLOT(insertVariable()));
+    connect(trackArtist, SIGNAL(clicked()), this, SLOT(insertVariable()));
+    connect(trackTitle, SIGNAL(clicked()), this, SLOT(insertVariable()));
+    connect(trackArtistAndTitle, SIGNAL(clicked()), this, SLOT(insertVariable()));
+    connect(trackNo, SIGNAL(clicked()), this, SLOT(insertVariable()));
+    connect(cdNo, SIGNAL(clicked()), this, SLOT(insertVariable()));
+    connect(genre, SIGNAL(clicked()), this, SLOT(insertVariable()));
+    connect(year, SIGNAL(clicked()), this, SLOT(insertVariable()));
+    albumArtist->setProperty(constVariableProperty, DeviceOptions::constAlbumArtist);
+    albumTitle->setProperty(constVariableProperty, DeviceOptions::constAlbumTitle);
+    composer->setProperty(constVariableProperty, DeviceOptions::constComposer);
+    trackArtist->setProperty(constVariableProperty, DeviceOptions::constTrackArtist);
+    trackTitle->setProperty(constVariableProperty, DeviceOptions::constTrackTitle);
+    trackArtistAndTitle->setProperty(constVariableProperty, DeviceOptions::constTrackArtistAndTitle);
+    trackNo->setProperty(constVariableProperty, DeviceOptions::constTrackNumber);
+    cdNo->setProperty(constVariableProperty, DeviceOptions::constCdNumber);
+    year->setProperty(constVariableProperty, DeviceOptions::constYear);
+    genre->setProperty(constVariableProperty, DeviceOptions::constGenre);
     exampleSong.albumartist=i18nc("Example album artist", "Various Artists");
     exampleSong.artist=i18nc("Example artist", "Wibble");
     exampleSong.composer=i18nc("Example composer", "Vivaldi");
@@ -59,6 +69,8 @@ FilenameSchemeDialog::FilenameSchemeDialog(QWidget *parent)
     exampleSong.disc=2;
     exampleSong.year=2001;
     exampleSong.file="wibble.mp3";
+    adjustSize();
+    setMaximumHeight(height());
 }
 
 void FilenameSchemeDialog::show(const DeviceOptions &opts)
@@ -95,23 +107,23 @@ static QString stripAccelerator(QString str)
     return str.replace("&&", "____").replace("&", "").replace("____", "&");
 }
 
+static QString tableEntry(const QAbstractButton *widget)
+{
+    return QLatin1String("<tr><td>")+widget->property(constVariableProperty).toString()+
+           QLatin1String("</td><td>")+stripAccelerator(widget->text())+
+           QLatin1String("</td><td>")+widget->toolTip()+
+           QLatin1String("</td></tr>");
+}
+
 void FilenameSchemeDialog::showHelp()
 {
     MessageBox::information(this,
                            i18n("<p>The following variables will be replaced with their corresponding meaning for each track name.</p>")+
                            QLatin1String("<p><table border=\"1\">")+
-                           i18n("<tr><th><em>Button</em></th><th><em>Variable</em></th><th><em>Description</em></th></tr>")+
-                           i18n("<tr><td>%albumartist%</td><td>%1</td><td>The artist of the album. For most albums, this will be the same as the <i>Track Artist.</i> "
-                                "For compilations, this will often be <i>Various Artists.</i> </td></tr>", stripAccelerator(albumArtist->text()))+
-                           i18n("<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>", stripAccelerator(albumTitle->text()))+
-                           i18n("<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>", stripAccelerator(composer->text()))+
-                           i18n("<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>", stripAccelerator(trackArtist->text()))+
-                           i18n("<tr><td>%title%</td><td>%1</td><td>The track title (without <i>Track Artist</i>).</td></tr>", stripAccelerator(trackTitle->text()))+
-                           i18n("<tr><td>%artistandtitle%</td><td>%1</td><td>The track title (with <i>Track Artist</i>, if different to <i>Album Artist</i>).</td></tr>", stripAccelerator(trackArtistAndTitle->text()))+
-                           i18n("<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>", stripAccelerator(trackNo->text()))+
-                           i18n("<tr><td>%discnumber%</td><td>%1</td><td>The album number of a multi-album album. Often compilations consist of several albums.</td></tr>", stripAccelerator(cdNo->text()))+
-                           i18n("<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></tr>", stripAccelerator(year->text()))+
-                           i18n("<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>", stripAccelerator(genre->text()))+
+                           i18n("<tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</em></th></tr>")+
+                           tableEntry(albumArtist)+tableEntry(albumTitle)+tableEntry(composer)+tableEntry(trackArtist)+
+                           tableEntry(trackTitle)+tableEntry(trackArtistAndTitle)+tableEntry(trackNo)+tableEntry(cdNo)+
+                           tableEntry(year)+tableEntry(genre)+
                            QLatin1String("</table></p>"));
 }
 
@@ -121,61 +133,15 @@ void FilenameSchemeDialog::enableOkButton()
     enableButtonOk(!scheme.isEmpty() && scheme!=origOpts.scheme);
 }
 
-void FilenameSchemeDialog::insertAlbumArtist()
-{
-    insert(DeviceOptions::constAlbumArtist);
-}
-
-void FilenameSchemeDialog::insertComposer()
-{
-    insert(DeviceOptions::constComposer);
-}
-
-void FilenameSchemeDialog::insertAlbumTitle()
-{
-    insert(DeviceOptions::constAlbumTitle);
-}
-
-void FilenameSchemeDialog::insertTrackArtist()
-{
-    insert(DeviceOptions::constTrackArtist);
-}
-
-void FilenameSchemeDialog::insertTrackTitle()
-{
-    insert(DeviceOptions::constTrackTitle);
-}
-
-void FilenameSchemeDialog::insertTrackArtistAndTitle()
-{
-    insert(DeviceOptions::constTrackArtistAndTitle);
-}
-
-void FilenameSchemeDialog::insertTrackNumber()
-{
-    insert(DeviceOptions::constTrackNumber);
-}
-
-void FilenameSchemeDialog::insertCdNumber()
-{
-    insert(DeviceOptions::constCdNumber);
-}
-
-void FilenameSchemeDialog::insertGenre()
-{
-    insert(DeviceOptions::constGenre);
-}
-
-void FilenameSchemeDialog::insertYear()
-{
-    insert(DeviceOptions::constYear);
-}
-
-void FilenameSchemeDialog::insert(const QString &str)
+void FilenameSchemeDialog::insertVariable()
 {
     QString text(pattern->text());
-    text.insert(pattern->cursorPosition(), str);
+    QString insert=sender()->property(constVariableProperty).toString();
+    int pos=pattern->cursorPosition();
+    text.insert(pos, insert);
     pattern->setText(text);
+    pattern->setCursorPosition(pos+insert.length());
+    pattern->setFocus();
     updateExample();
 }
 
@@ -183,6 +149,10 @@ void FilenameSchemeDialog::updateExample()
 {
     QString saveScheme=origOpts.scheme;
     origOpts.scheme=pattern->text();
-    example->setText(origOpts.createFilename(exampleSong)+QLatin1String(".mp3"));
+    QString exampleStr=origOpts.createFilename(exampleSong);
+    if (!exampleStr.endsWith(QLatin1String(".mp3"))) {
+        exampleStr+=QLatin1String(".mp3");
+    }
+    example->setText(exampleStr);
     origOpts.scheme=saveScheme;
 }
diff --git a/devices/filenameschemedialog.h b/devices/filenameschemedialog.h
index 044c0ff..c2392c0 100644
--- a/devices/filenameschemedialog.h
+++ b/devices/filenameschemedialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -43,21 +43,11 @@ Q_SIGNALS:
 private Q_SLOTS:
     void showHelp();
     void enableOkButton();
-    void insertAlbumArtist();
-    void insertComposer();
-    void insertAlbumTitle();
-    void insertTrackArtist();
-    void insertTrackTitle();
-    void insertTrackArtistAndTitle();
-    void insertTrackNumber();
-    void insertCdNumber();
-    void insertGenre();
-    void insertYear();
+    void insertVariable();
     void updateExample();
 
 private:
     void slotButtonClicked(int button);
-    void insert(const QString &str);
 
 private:
     DeviceOptions origOpts;
diff --git a/devices/filenameschemedialog.ui b/devices/filenameschemedialog.ui
index 7ae2d7b..d2ad025 100644
--- a/devices/filenameschemedialog.ui
+++ b/devices/filenameschemedialog.ui
@@ -6,12 +6,21 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>378</width>
-    <height>155</height>
+    <width>504</width>
+    <height>180</height>
    </rect>
   </property>
   <layout class="QGridLayout" name="gridLayout">
-   <property name="margin">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
     <number>0</number>
    </property>
    <item row="0" column="0" colspan="5">
@@ -66,6 +75,9 @@
    </item>
    <item row="4" column="0">
     <widget class="QPushButton" name="albumArtist">
+     <property name="toolTip">
+      <string>The artist of the album. For most albums, this will be the same as the <i>Track Artist.</i> For compilations, this will often be <i>Various Artists.</i></string>
+     </property>
      <property name="text">
       <string>Album Artist</string>
      </property>
@@ -73,6 +85,9 @@
    </item>
    <item row="4" column="1">
     <widget class="QPushButton" name="albumTitle">
+     <property name="toolTip">
+      <string>The name of the album.</string>
+     </property>
      <property name="text">
       <string>Album Title</string>
      </property>
@@ -80,6 +95,9 @@
    </item>
    <item row="4" column="2">
     <widget class="QPushButton" name="composer">
+     <property name="toolTip">
+      <string>The composer.</string>
+     </property>
      <property name="text">
       <string>Composer</string>
      </property>
@@ -87,6 +105,9 @@
    </item>
    <item row="4" column="3">
     <widget class="QPushButton" name="trackArtist">
+     <property name="toolTip">
+      <string>The artist of each track.</string>
+     </property>
      <property name="text">
       <string>Track Artist</string>
      </property>
@@ -94,6 +115,9 @@
    </item>
    <item row="4" column="4">
     <widget class="QPushButton" name="trackTitle">
+     <property name="toolTip">
+      <string>The track title (without <i>Track Artist</i>).</string>
+     </property>
      <property name="text">
       <string>Track Title</string>
      </property>
@@ -113,6 +137,9 @@
        <height>16777215</height>
       </size>
      </property>
+     <property name="toolTip">
+      <string>The track title (with <i>Track Artist</i>, if different to <i>Album Artist</i>).</string>
+     </property>
      <property name="text">
       <string>Track Title (+Artist)</string>
      </property>
@@ -120,6 +147,9 @@
    </item>
    <item row="5" column="1">
     <widget class="QPushButton" name="trackNo">
+     <property name="toolTip">
+      <string>The track number.</string>
+     </property>
      <property name="text">
       <string>Track #</string>
      </property>
@@ -127,6 +157,9 @@
    </item>
    <item row="5" column="2">
     <widget class="QPushButton" name="cdNo">
+     <property name="toolTip">
+      <string>The album number of a multi-album album. Often compilations consist of several albums.</string>
+     </property>
      <property name="text">
       <string>CD #</string>
      </property>
@@ -134,6 +167,9 @@
    </item>
    <item row="5" column="3">
     <widget class="QPushButton" name="year">
+     <property name="toolTip">
+      <string>The year of the album's release.</string>
+     </property>
      <property name="text">
       <string>Year</string>
      </property>
@@ -141,6 +177,9 @@
    </item>
    <item row="5" column="4">
     <widget class="QPushButton" name="genre">
+     <property name="toolTip">
+      <string>The genre of the album.</string>
+     </property>
      <property name="text">
       <string>Genre</string>
      </property>
diff --git a/devices/freespaceinfo.cpp b/devices/freespaceinfo.cpp
index 0979061..8febbc3 100644
--- a/devices/freespaceinfo.cpp
+++ b/devices/freespaceinfo.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/freespaceinfo.h b/devices/freespaceinfo.h
index 7391749..5fea463 100644
--- a/devices/freespaceinfo.h
+++ b/devices/freespaceinfo.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/fsdevice.cpp b/devices/fsdevice.cpp
index b3ab184..b1e1e88 100644
--- a/devices/fsdevice.cpp
+++ b/devices/fsdevice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -33,6 +33,7 @@
 #include "devicepropertieswidget.h"
 #include "utils.h"
 #include "mpdparseutils.h"
+#include "mpdconnection.h"
 #include "encoders.h"
 #include "transcodingjob.h"
 #include "actiondialog.h"
@@ -66,6 +67,7 @@ MusicScanner::MusicScanner()
     , stopRequested(false)
     , count(0)
     , lastUpdate(0)
+    , lastCacheProg(-1)
 {
     thread=new Thread(metaObject()->className());
     moveToThread(thread);
@@ -84,7 +86,7 @@ void MusicScanner::scan(const QString &folder, const QString &cacheFile, bool re
         MusicLibraryItemRoot *lib=new MusicLibraryItemRoot;
         MusicLibraryModel::convertCache(cacheFile);
         readProgress(0.0);
-        if (lib->fromXML(cacheFile, QDateTime(), folder)) {
+        if (lib->fromXML(cacheFile, QDateTime(), 0, folder)) {
             lib->applyGrouping();
             if (!stopRequested) {
                 emit libraryUpdated(lib);
@@ -442,7 +444,7 @@ void FsDevice::addSong(const Song &s, bool overwrite, bool copyCover)
     }
 }
 
-void FsDevice::copySongTo(const Song &s, const QString &baseDir, const QString &musicPath, bool overwrite, bool copyCover)
+void FsDevice::copySongTo(const Song &s, const QString &musicPath, bool overwrite, bool copyCover)
 {
     jobAbortRequested=false;
     if (!isConnected()) {
@@ -471,14 +473,13 @@ void FsDevice::copySongTo(const Song &s, const QString &baseDir, const QString &
         return;
     }
 
+    QString baseDir=MPDConnection::self()->getDetails().dir;
     if (!overwrite && QFile::exists(baseDir+musicPath)) {
         emit actionStatus(FileExists);
         return;
     }
 
-    currentMpdDir=baseDir;
     currentDestFile=baseDir+musicPath;
-
     QDir dir(Utils::getDir(currentDestFile));
     if (!dir.exists() && !Utils::createWorldReadableDir(dir.absolutePath(), baseDir)) {
         emit actionStatus(DirCreationFaild);
@@ -595,13 +596,19 @@ void FsDevice::copySongToResult(int status)
     if (Ok!=status) {
         emit actionStatus(status);
     } else {
-        currentSong.file=currentDestFile.mid(currentMpdDir.length());
+        currentSong.file=currentDestFile.mid(MPDConnection::self()->getDetails().dir.length());
+        QString origPath;
+        if (MPDConnection::self()->isMopdidy()) {
+            origPath=currentSong.file;
+            currentSong.file=Song::encodePath(currentSong.file);
+        }
         if (needToFixVa) {
             currentSong.revertVariousArtists();
         }
         Utils::setFilePerms(currentDestFile);
         MusicLibraryModel::self()->addSongToList(currentSong);
-        DirViewModel::self()->addFileToList(currentSong.file);
+        DirViewModel::self()->addFileToList(origPath.isEmpty() ? currentSong.file : origPath,
+                                            origPath.isEmpty() ? QString() : currentSong.file);
         emit actionStatus(Ok, job && job->coverCopied());
     }
 }
diff --git a/devices/fsdevice.h b/devices/fsdevice.h
index c0891e3..89d0b2c 100644
--- a/devices/fsdevice.h
+++ b/devices/fsdevice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -29,6 +29,7 @@
 #include "utils.h"
 #include "freespaceinfo.h"
 #include "musiclibraryitemroot.h"
+#include "httpserver.h"
 #include <QStringList>
 
 class Thread;
@@ -119,7 +120,7 @@ public:
     QString path() const { return audioFolder; }
     QString coverFile() const { return opts.coverName; }
     void addSong(const Song &s, bool overwrite, bool copyCover);
-    void copySongTo(const Song &s, const QString &baseDir, const QString &musicPath, bool overwrite, bool copyCover);
+    void copySongTo(const Song &s, const QString &musicPath, bool overwrite, bool copyCover);
     void removeSong(const Song &s);
     void cleanDirs(const QSet<QString> &dirs);
     void requestCover(const Song &s);
@@ -128,7 +129,7 @@ public:
     void saveCache();
     void removeCache();
     bool isStdFs() const { return true; }
-    bool canPlaySongs() const { return true; }
+    bool canPlaySongs() const { return HttpServer::self()->isAlive(); }
 
 Q_SIGNALS:
     // For talking to scanner...
diff --git a/devices/mounter/main.cpp b/devices/mounter/main.cpp
index fb9350f..24dd211 100644
--- a/devices/mounter/main.cpp
+++ b/devices/mounter/main.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/mounter/mounter.cpp b/devices/mounter/mounter.cpp
index 4241d0a..94b085d 100644
--- a/devices/mounter/mounter.cpp
+++ b/devices/mounter/mounter.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/mounter/mounter.h b/devices/mounter/mounter.h
index 9d326ef..7b0b479 100644
--- a/devices/mounter/mounter.h
+++ b/devices/mounter/mounter.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/mountpoints.cpp b/devices/mountpoints.cpp
index 5517a67..0963664 100644
--- a/devices/mountpoints.cpp
+++ b/devices/mountpoints.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/mountpoints.h b/devices/mountpoints.h
index d4ba7be..f842edf 100644
--- a/devices/mountpoints.h
+++ b/devices/mountpoints.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/mtpdevice.cpp b/devices/mtpdevice.cpp
index a087cee..5005725 100644
--- a/devices/mtpdevice.cpp
+++ b/devices/mtpdevice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -67,21 +67,22 @@ static const QString constMusicFolder=QLatin1String("Music");
 
 static int progressMonitor(uint64_t const processed, uint64_t const total, void const * const data)
 {
-    ((MtpConnection *)data)->emitProgress((int)(((processed*1.0)/(total*1.0)*100.0)+0.5));
-    return ((MtpConnection *)data)->abortRequested() ? -1 : 0;
+    const MtpConnection *con=static_cast<const MtpConnection *>(data);
+    const_cast<MtpConnection *>(con)->emitProgress((int)(((processed*1.0)/(total*1.0)*100.0)+0.5));
+    return con->abortRequested() ? -1 : 0;
 }
 
 static int trackListMonitor(uint64_t const processed, uint64_t const total, void const * const data)
 {
-    Q_UNUSED(total)
-    ((MtpConnection *)data)->trackListProgress(((processed*100.0)/(total*1.0))+0.5);
-    return ((MtpConnection *)data)->abortRequested() ? -1 : 0;
+    const MtpConnection *con=static_cast<const MtpConnection *>(data);
+    const_cast<MtpConnection *>(con)->trackListProgress(((processed*100.0)/(total*1.0))+0.5);
+    return con->abortRequested() ? -1 : 0;
 }
 
 static uint16_t fileReceiver(void *params, void *priv, uint32_t sendlen, unsigned char *data, uint32_t *putlen)
 {
     Q_UNUSED(params)
-    QByteArray *byteData=(QByteArray *)priv;
+    QByteArray *byteData=static_cast<QByteArray *>(priv);
     (*byteData)+=QByteArray((char *)data, (int)sendlen);
     *putlen = sendlen;
     return LIBMTP_HANDLER_RETURN_OK;
@@ -348,7 +349,6 @@ void MtpConnection::updateLibrary()
     QMap<QString, MtpAlbum> albumMap;
     QMap<uint32_t, MtpFolder> folders;
     bool getAlbumArtistFromPath=dev->options().scheme.startsWith(DeviceOptions::constAlbumArtist+QChar('/')+DeviceOptions::constAlbumTitle+QChar('/'));
-    QString va=i18n("Various Artists");
     #endif
     #ifdef TIME_MTP_OPERATIONS
     qWarning() << "Tracks update:" << timer.elapsed();
@@ -385,7 +385,7 @@ void MtpConnection::updateLibrary()
             if (folderParts.length()>=3) {
                 MtpFolder folder(folderParts.at(1), folderParts.at(2));
                 folders.insert(track->parent_id, folder);
-                if (folder.album==s.album && (folder.artist==QLatin1String("Various Artists") || folder.artist==va)) {
+                if (folder.album==s.album && Song::isVariousArtists(folder.artist)) {
                     s.albumartist=folder.artist;
                 }
             }
@@ -448,7 +448,7 @@ void MtpConnection::updateLibrary()
                         break;
                     } else {
                         if (shortestArtist.isEmpty() || s->song().artist.length()<shortestArtist.length()) {
-                            shortestArtist=s->song().artist.length();
+                            shortestArtist=s->song().artist;
                         }
                         tracks.insert(s->track());
                     }
@@ -464,7 +464,7 @@ void MtpConnection::updateLibrary()
                     foreach (const QString &artist, (*it).artists) {
                         if (!artist.contains(shortestArtist)) {
                             // Found an artist that did not contain 'shortestArtist', so use 'Various Artists' for album artist
-                            albumArtist=!f.artist.isEmpty() && f.album==it.key() ? f.artist : i18n("Various Artists");
+                            albumArtist=!f.artist.isEmpty() && f.album==it.key() ? f.artist : Song::variousArtists();
                             break;
                         }
                     }
@@ -857,6 +857,7 @@ static QTemporaryFile * saveImageToTemp(const QImage &img, const QString &name)
         temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX");
     }
     img.save(temp);
+    temp->close();
     return temp;
 }
 
@@ -1425,7 +1426,7 @@ void MtpDevice::addSong(const Song &s, bool overwrite, bool copyCover)
     emit putSong(currentSong, needToFixVa, opts, overwrite, copyCover);
 }
 
-void MtpDevice::copySongTo(const Song &s, const QString &baseDir, const QString &musicPath, bool overwrite, bool copyCover)
+void MtpDevice::copySongTo(const Song &s, const QString &musicPath, bool overwrite, bool copyCover)
 {
     jobAbortRequested=false;
     transcoding=false;
@@ -1453,7 +1454,7 @@ void MtpDevice::copySongTo(const Song &s, const QString &baseDir, const QString
         return;
     }
 
-    currentMpdDir=baseDir;
+    QString baseDir=MPDConnection::self()->getDetails().dir;
     currentDestFile=baseDir+musicPath;
     QDir dir(Utils::getDir(currentDestFile));
     if (!dir.exists() && !Utils::createWorldReadableDir(dir.absolutePath(), baseDir)) {
@@ -1569,13 +1570,19 @@ void MtpDevice::getSongStatus(bool ok, bool copiedCover)
     if (!ok) {
         emit actionStatus(Failed);
     } else {
-        currentSong.file=currentDestFile.mid(currentMpdDir.length());
+        currentSong.file=currentDestFile.mid(MPDConnection::self()->getDetails().dir.length());
+        QString origPath;
+        if (MPDConnection::self()->isMopdidy()) {
+            origPath=currentSong.file;
+            currentSong.file=Song::encodePath(currentSong.file);
+        }
         if (needToFixVa) {
             currentSong.revertVariousArtists();
         }
         Utils::setFilePerms(currentDestFile);
         MusicLibraryModel::self()->addSongToList(currentSong);
-        DirViewModel::self()->addFileToList(currentSong.file);
+        DirViewModel::self()->addFileToList(origPath.isEmpty() ? currentSong.file : origPath,
+                                            origPath.isEmpty() ? QString() : currentSong.file);
         emit actionStatus(Ok, copiedCover);
     }
 }
diff --git a/devices/mtpdevice.h b/devices/mtpdevice.h
index e96c50d..a6d5f9b 100644
--- a/devices/mtpdevice.h
+++ b/devices/mtpdevice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -165,7 +165,7 @@ public:
     void configure(QWidget *parent);
     QString path() const { return QString(); } // audioFolder; }
     void addSong(const Song &s, bool overwrite, bool copyCover);
-    void copySongTo(const Song &s, const QString &baseDir, const QString &musicPath, bool overwrite, bool copyCover);
+    void copySongTo(const Song &s, const QString &musicPath, bool overwrite, bool copyCover);
     void removeSong(const Song &s);
     void cleanDirs(const QSet<QString> &dirs);
     void requestCover(const Song &song);
diff --git a/devices/musicbrainz.cpp b/devices/musicbrainz.cpp
index a2aacf0..ddfccbf 100644
--- a/devices/musicbrainz.cpp
+++ b/devices/musicbrainz.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -199,10 +199,9 @@ void MusicBrainz::readDisc()
     #endif
     close(fd);
 
-    QString unknown(i18n("Unknown"));
-    initial.name=unknown;
-    initial.artist=unknown;
-    initial.genre=unknown;
+    initial.name=Song::unknown();
+    initial.artist=Song::unknown();
+    initial.genre=Song::unknown();
     initial.isDefault=true;
 
     if (tracks.count()>1) {
@@ -215,7 +214,7 @@ void MusicBrainz::readDisc()
             Song s;
             s.track=i+1;
             s.title=i18n("Track %1", s.track).toUtf8();
-            s.artist=unknown;
+            s.artist=Song::unknown();
             s.albumartist=initial.artist;
             s.album=initial.name;
             s.id=s.track;
@@ -321,7 +320,7 @@ void MusicBrainz::lookup(bool full)
                                 album.disc=medium->Position();
                             }
                             album.artist=artistFromCreditList(fullRelease->ArtistCredit());
-                            album.genre=i18n("Unknown");
+                            album.genre=Song::unknown();
 
                             QString date = QString::fromUtf8(fullRelease->Date().c_str());
                             QRegExp yearRe("^(\\d{4,4})(-\\d{1,2}-\\d{1,2})?$");
diff --git a/devices/musicbrainz.h b/devices/musicbrainz.h
index 4c07c3f..1ec7809 100644
--- a/devices/musicbrainz.h
+++ b/devices/musicbrainz.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/devices/remotedevicepropertiesdialog.cpp b/devices/remotedevicepropertiesdialog.cpp
index 3350211..2408861 100644
--- a/devices/remotedevicepropertiesdialog.cpp
+++ b/devices/remotedevicepropertiesdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/remotedevicepropertiesdialog.h b/devices/remotedevicepropertiesdialog.h
index 676c55c..09dc0f1 100644
--- a/devices/remotedevicepropertiesdialog.h
+++ b/devices/remotedevicepropertiesdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/remotedevicepropertieswidget.cpp b/devices/remotedevicepropertieswidget.cpp
index 77a603d..2288daf 100644
--- a/devices/remotedevicepropertieswidget.cpp
+++ b/devices/remotedevicepropertieswidget.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/remotedevicepropertieswidget.h b/devices/remotedevicepropertieswidget.h
index fda11ea..8b32dba 100644
--- a/devices/remotedevicepropertieswidget.h
+++ b/devices/remotedevicepropertieswidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/remotedevicepropertieswidget.ui b/devices/remotedevicepropertieswidget.ui
index b60404b..f5b5760 100644
--- a/devices/remotedevicepropertieswidget.ui
+++ b/devices/remotedevicepropertieswidget.ui
@@ -93,7 +93,7 @@
              </widget>
             </item>
             <item row="1" column="1">
-             <widget class="SpinBox" name="smbPort">
+             <widget class="QSpinBox" name="smbPort">
               <property name="maximum">
                <number>65535</number>
               </property>
@@ -310,7 +310,7 @@
              </widget>
             </item>
             <item row="1" column="1">
-             <widget class="SpinBox" name="sshPort">
+             <widget class="QSpinBox" name="sshPort">
               <property name="maximum">
                <number>65535</number>
               </property>
@@ -441,11 +441,6 @@
    <extends>QLabel</extends>
    <header>buddylabel.h</header>
   </customwidget>
-  <customwidget>
-   <class>SpinBox</class>
-   <extends>QSpinBox</extends>
-   <header>spinbox.h</header>
-  </customwidget>
  </customwidgets>
  <tabstops>
   <tabstop>type</tabstop>
diff --git a/devices/remotefsdevice.cpp b/devices/remotefsdevice.cpp
index 09b707b..6988488 100644
--- a/devices/remotefsdevice.cpp
+++ b/devices/remotefsdevice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -273,9 +273,7 @@ RemoteFsDevice::~RemoteFsDevice() {
 void RemoteFsDevice::toggle()
 {
     if (isConnected()) {
-        if (scanner) {
-            scanner->stop();
-        }
+        stopScanner();
         unmount();
     } else {
         mount();
diff --git a/devices/remotefsdevice.h b/devices/remotefsdevice.h
index 861f023..2b10128 100644
--- a/devices/remotefsdevice.h
+++ b/devices/remotefsdevice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/splitlabelwidget.cpp b/devices/splitlabelwidget.cpp
new file mode 100644
index 0000000..c60f991
--- /dev/null
+++ b/devices/splitlabelwidget.cpp
@@ -0,0 +1,100 @@
+/*
+ * Cantata
+ *
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
+ *
+ * ----
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "splitlabelwidget.h"
+#include "squeezedtextlabel.h"
+#include <QFormLayout>
+#include <QBoxLayout>
+
+#define REMOVE(w) \
+    w->setVisible(false); \
+    w->deleteLater()
+
+SplitLabelWidget::SplitLabelWidget(QWidget *p)
+    : QStackedWidget(p)
+{
+    QWidget *singlePage=new QWidget(this);
+    QBoxLayout *singleLayout=new QBoxLayout(QBoxLayout::TopToBottom, singlePage);
+    single=new QLabel(singlePage);
+    single->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter);
+    single->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+    singleLayout->addWidget(single);
+
+    multiplePage=new QWidget(this);
+    QFormLayout *multipleLayout=new QFormLayout(multiplePage);
+    message=new QLabel(multiplePage);
+    multipleLayout->setSpacing(0);
+    multipleLayout->setWidget(0, QFormLayout::SpanningRole, message);
+    addWidget(singlePage);
+    addWidget(multiplePage);
+    setCurrentIndex(0);
+}
+
+void SplitLabelWidget::setText(const QString &text)
+{
+    setCurrentIndex(0);
+    single->setText(text);
+}
+
+void SplitLabelWidget::setText(const QList<QPair<QString, QString> > &details, const QString &msg)
+{
+    if (details.isEmpty()) {
+        setText(msg);
+        return;
+    }
+
+    setCurrentIndex(1);
+    if (details.count()!=labels.count()) {
+        if (details.count()<labels.count()) {
+            int diff=labels.count()-details.count();
+            for (int i=0; i<diff; ++i) {
+                QLabel *l=labels.takeLast();
+                SqueezedTextLabel *v=values.takeLast();
+                REMOVE(l);
+                REMOVE(v);
+            }
+        } else {
+            QFormLayout *lay=static_cast<QFormLayout *>(multiplePage->layout());
+            int diff=details.count()-labels.count();
+            for (int i=0; i<diff; ++i) {
+                QLabel *l=new QLabel(multiplePage);
+                SqueezedTextLabel *v=new SqueezedTextLabel(multiplePage);
+                lay->addRow(l, v);
+                labels.append(l);
+                values.append(v);
+            }
+        }
+    }
+
+    if (msg.isEmpty()) {
+        message->setVisible(false);
+    } else {
+        message->setVisible(true);
+        message->setText(msg);
+    }
+
+    for (int i=0; i<details.count(); ++i) {
+        labels.at(i)->setText(details.at(i).first);
+        values.at(i)->setText(QLatin1String("  ")+details.at(i).second);
+    }
+}
diff --git a/gui/qxtmediakeys.h b/devices/splitlabelwidget.h
similarity index 59%
copy from gui/qxtmediakeys.h
copy to devices/splitlabelwidget.h
index 202e3c9..f876bd9 100644
--- a/gui/qxtmediakeys.h
+++ b/devices/splitlabelwidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -21,28 +21,32 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef QXT_MEDIA_KEYS_H
-#define QXT_MEDIA_KEYS_H
+#ifndef SPLIT_LABEL_WIDGET
+#define SPLIT_LABEL_WIDGET
 
-#include "multimediakeysinterface.h"
+#include <QStackedWidget>
 #include <QList>
+#include <QPair>
 
-class QxtGlobalShortcut;
+class QLabel;
+class QStackedWidget;
+class SqueezedTextLabel;
 
-class QxtMediaKeys : public MultiMediaKeysInterface
+class SplitLabelWidget : public QStackedWidget
 {
 public:
-    QxtMediaKeys(QObject *p);
-    virtual ~QxtMediaKeys() { clear(); }
-
-    void activate(bool a);
+    SplitLabelWidget(QWidget *p);
+    void setText(const QString &text);
+    void setText(const QList<QPair<QString, QString> > &details, const QString &msg=QString());
 
 private:
-    void createShortcuts();
-    void clear();
+    QLabel *single;
 
-private:
-    QList<QxtGlobalShortcut *> shortcuts;
+    QWidget *multiplePage;
+    QLabel *message;
+    QList<QLabel *> labels;
+    QList<SqueezedTextLabel *> values;
 };
 
+
 #endif
diff --git a/devices/synccollectionwidget.cpp b/devices/synccollectionwidget.cpp
index 876edb0..50fff9a 100644
--- a/devices/synccollectionwidget.cpp
+++ b/devices/synccollectionwidget.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -35,10 +35,11 @@
 
 SyncCollectionWidget::SyncCollectionWidget(QWidget *parent, const QString &title, const QString &action, bool showCovers)
     : QWidget(parent)
+    , performedSearch(false)
     , searchTimer(0)
 {
     setupUi(this);
-    groupBox->setTitle(title);
+    titleLabel->setText(title);
     button->setText(action);
     button->setEnabled(false);
 
@@ -140,7 +141,11 @@ void SyncCollectionWidget::delaySearchItems()
         if (searchTimer) {
             searchTimer->stop();
         }
+        if (performedSearch) {
+            tree->collapseToLevel(0);
+        }
         searchItems();
+        performedSearch=false;
     } else {
         if (!searchTimer) {
             searchTimer=new QTimer(this);
@@ -158,6 +163,7 @@ void SyncCollectionWidget::searchItems()
     if (proxy->enabled() && !text.isEmpty()) {
         tree->expandAll();
     }
+    performedSearch=true;
 }
 
 void SyncCollectionWidget::expandAll()
diff --git a/devices/synccollectionwidget.h b/devices/synccollectionwidget.h
index 6fbdddf..bd99661 100644
--- a/devices/synccollectionwidget.h
+++ b/devices/synccollectionwidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -68,6 +68,7 @@ private:
     void updateStats();
 
 private:
+    bool performedSearch;
     MusicLibraryModel *model;
     MusicLibraryProxyModel *proxy;
     QTimer *searchTimer;
diff --git a/devices/synccollectionwidget.ui b/devices/synccollectionwidget.ui
index e6f3dd8..72a8d48 100644
--- a/devices/synccollectionwidget.ui
+++ b/devices/synccollectionwidget.ui
@@ -2,40 +2,39 @@
 <ui version="4.0">
  <class>SyncCollectionWidget</class>
  <widget class="QWidget" name="SyncCollectionWidget">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>302</width>
-    <height>239</height>
-   </rect>
-  </property>
   <layout class="QGridLayout" name="gridLayout_2">
-   <item row="0" column="0">
-    <widget class="QGroupBox" name="groupBox">
-     <layout class="QGridLayout" name="gridLayout">
-      <item row="0" column="0" colspan="2">
-       <widget class="LineEdit" name="search"/>
-      </item>
-      <item row="1" column="0" colspan="2">
-       <widget class="TreeView" name="tree"/>
-      </item>
-      <item row="2" column="0">
-       <widget class="SqueezedTextLabel" name="selection">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="QPushButton" name="button"/>
-      </item>
-     </layout>
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <item row="0" column="0" colspan="2">
+    <widget class="QLabel" name="titleLabel">
+     <property name="font">
+      <font>
+       <weight>75</weight>
+       <bold>true</bold>
+      </font>
+     </property>
     </widget>
    </item>
+   <item row="1" column="0" colspan="2">
+    <widget class="LineEdit" name="search"/>
+   </item>
+   <item row="2" column="0" colspan="2">
+    <widget class="TreeView" name="tree"/>
+   </item>
+   <item row="3" column="0">
+    <widget class="SqueezedTextLabel" name="selection">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+    </widget>
+   </item>
+   <item row="4" column="1">
+    <widget class="QPushButton" name="button"/>
+   </item>
   </layout>
  </widget>
  <customwidgets>
diff --git a/devices/syncdialog.cpp b/devices/syncdialog.cpp
index c927d21..8eff924 100644
--- a/devices/syncdialog.cpp
+++ b/devices/syncdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/syncdialog.h b/devices/syncdialog.h
index 80eb651..b8ac390 100644
--- a/devices/syncdialog.h
+++ b/devices/syncdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/transcodingjob.cpp b/devices/transcodingjob.cpp
index 7e6cc92..0ede588 100644
--- a/devices/transcodingjob.cpp
+++ b/devices/transcodingjob.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/transcodingjob.h b/devices/transcodingjob.h
index f2b9e8e..d198a5a 100644
--- a/devices/transcodingjob.h
+++ b/devices/transcodingjob.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  */
 /****************************************************************************************
  * Copyright (c) 2010 Téo Mrnjavac <teo at kde.org>                                        *
diff --git a/devices/umsdevice.cpp b/devices/umsdevice.cpp
index 073b335..e912e16 100644
--- a/devices/umsdevice.cpp
+++ b/devices/umsdevice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -31,6 +31,11 @@
 #include <QFile>
 #include <QFileInfo>
 #include <QTextStream>
+#ifdef ENABLE_KDE_SUPPORT
+#include <solid/storagedrive.h>
+#else
+#include "solid-lite/storagedrive.h"
+#endif
 
 static const QLatin1String constSettingsFile("/.is_audio_player");
 static const QLatin1String constMusicFolderKey("audio_folder");
@@ -40,6 +45,19 @@ UmsDevice::UmsDevice(MusicModel *m, Solid::Device &dev)
     , access(dev.as<Solid::StorageAccess>())
 {
     spaceInfo.setPath(access->filePath());
+
+    QString details=QLatin1String(" (")+Utils::formatByteSize(spaceInfo.size());
+
+    QStringList udiParts=dev.udi().split(QLatin1Char('/'), QString::SkipEmptyParts);
+    if (udiParts.length()>1) {
+        details+=QLatin1String(" - ")+udiParts.last();
+    }
+
+    if (!details.isEmpty()) {
+        details+=QLatin1Char(')');
+    }
+
+    setData(data()+details);
     setup();
 }
 
@@ -66,9 +84,7 @@ void UmsDevice::toggle()
 {
     if (solidDev.isValid() && access && access->isValid()) {
         if (access->isAccessible()) {
-            if (scanner) {
-                scanner->stop();
-            }
+            stopScanner();
             access->teardown();
         } else {
             access->setup();
diff --git a/devices/umsdevice.h b/devices/umsdevice.h
index 70ab33e..bb09336 100644
--- a/devices/umsdevice.h
+++ b/devices/umsdevice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/devices/valueslider.cpp b/devices/valueslider.cpp
index 55d7151..8395fd6 100644
--- a/devices/valueslider.cpp
+++ b/devices/valueslider.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /****************************************************************************************
diff --git a/devices/valueslider.h b/devices/valueslider.h
index bf27c03..1c14426 100644
--- a/devices/valueslider.h
+++ b/devices/valueslider.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /****************************************************************************************
diff --git a/dynamic/cantata-dynamic b/dynamic/cantata-dynamic
index e5338fa..14160c3 100755
--- a/dynamic/cantata-dynamic
+++ b/dynamic/cantata-dynamic
@@ -1,8 +1,8 @@
-#!/usr/bin/env perl
+#!/usr/bin/perl
 
 #  Cantata-Dynamic
 #
-#  Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+#  Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
 #
 #  ----
 #
diff --git a/dynamic/dynamic.cpp b/dynamic/dynamic.cpp
index d098bd6..f0fb257 100644
--- a/dynamic/dynamic.cpp
+++ b/dynamic/dynamic.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -81,31 +81,31 @@ static const QString constStatusStateResp=QLatin1String("STATE:");
 static const QString constStatusRuleResp=QLatin1String("RULES:");
 static const QString constUpdateRequiredResp=QLatin1String("UPDATE_REQUIRED");
 
-Dynamic::Command Dynamic::toCommand(const QString &cmd)
-{
-    if (constIdCmd==cmd) {
-        return Id;
-    }
-    if (constListCmd==cmd) {
-        return List;
-    }
-    if (constStatusCmd==cmd) {
-        return Status;
-    }
-    if (constSaveCmd==cmd) {
-        return Save;
-    }
-    if (constDeleteCmd==cmd) {
-        return Del;
-    }
-    if (constSetActiveCmd==cmd) {
-        return SetActive;
-    }
-    if (constControlCmd==cmd) {
-        return Control;
-    }
-    return Unknown;
-}
+//Dynamic::Command Dynamic::toCommand(const QString &cmd)
+//{
+//    if (constIdCmd==cmd) {
+//        return Id;
+//    }
+//    if (constListCmd==cmd) {
+//        return List;
+//    }
+//    if (constStatusCmd==cmd) {
+//        return Status;
+//    }
+//    if (constSaveCmd==cmd) {
+//        return Save;
+//    }
+//    if (constDeleteCmd==cmd) {
+//        return Del;
+//    }
+//    if (constSetActiveCmd==cmd) {
+//        return SetActive;
+//    }
+//    if (constControlCmd==cmd) {
+//        return Control;
+//    }
+//    return Unknown;
+//}
 
 QString Dynamic::toString(Command cmd)
 {
diff --git a/dynamic/dynamic.h b/dynamic/dynamic.h
index 7dd5c9b..f53607f 100644
--- a/dynamic/dynamic.h
+++ b/dynamic/dynamic.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -68,7 +68,7 @@ public:
         Control
     };
 
-    static Command toCommand(const QString &cmd);
+//    static Command toCommand(const QString &cmd);
     static QString toString(Command cmd);
     static void enableDebug();
 
diff --git a/dynamic/dynamicpage.cpp b/dynamic/dynamicpage.cpp
index c04260a..305f9ef 100644
--- a/dynamic/dynamicpage.cpp
+++ b/dynamic/dynamicpage.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -41,7 +41,6 @@ DynamicPage::DynamicPage(QWidget *p)
     addAction = ActionCollection::get()->createAction("adddynamic", i18n("Add Dynamic Rules"), "document-new");
     editAction = ActionCollection::get()->createAction("editdynamic", i18n("Edit Dynamic Rules"), Icons::self()->editIcon);
     removeAction = ActionCollection::get()->createAction("removedynamic", i18n("Remove Dynamic Rules"), "list-remove");
-    searchButton->setDefaultAction(StdActions::self()->searchAction);
     toggleAction = new Action(this);
 
     refreshBtn->setDefaultAction(refreshAction);
diff --git a/dynamic/dynamicpage.h b/dynamic/dynamicpage.h
index f0a2218..2f0ba4d 100644
--- a/dynamic/dynamicpage.h
+++ b/dynamic/dynamicpage.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,10 +26,11 @@
 
 #include "ui_dynamicpage.h"
 #include "dynamicproxymodel.h"
+#include "page.h"
 
 class Action;
 
-class DynamicPage : public QWidget, public Ui::DynamicPage
+class DynamicPage : public QWidget, public Ui::DynamicPage, public Page
 {
     Q_OBJECT
 
diff --git a/dynamic/dynamicpage.ui b/dynamic/dynamicpage.ui
index 0215864..278adcf 100644
--- a/dynamic/dynamicpage.ui
+++ b/dynamic/dynamicpage.ui
@@ -46,9 +46,6 @@
       <item>
        <widget class="ToolButton" name="refreshBtn"/>
       </item>
-      <item>
-       <widget class="ToolButton" name="searchButton"/>
-      </item>
        <item>
        <spacer name="horizontalSpacer">
         <property name="orientation">
diff --git a/dynamic/dynamicproxymodel.cpp b/dynamic/dynamicproxymodel.cpp
index 82e5300..91cedb2 100644
--- a/dynamic/dynamicproxymodel.cpp
+++ b/dynamic/dynamicproxymodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/dynamic/dynamicproxymodel.h b/dynamic/dynamicproxymodel.h
index a4a75e2..1f57754 100644
--- a/dynamic/dynamicproxymodel.h
+++ b/dynamic/dynamicproxymodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/dynamic/dynamicrule.ui b/dynamic/dynamicrule.ui
index 39447ea..3078f25 100644
--- a/dynamic/dynamicrule.ui
+++ b/dynamic/dynamicrule.ui
@@ -2,16 +2,17 @@
 <ui version="4.0">
  <class>DynamicRule</class>
  <widget class="QWidget" name="DynamicRule">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>397</width>
-    <height>333</height>
-   </rect>
-  </property>
   <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="margin">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
     <number>0</number>
    </property>
    <item>
@@ -19,6 +20,30 @@
      <property name="fieldGrowthPolicy">
       <enum>QFormLayout::ExpandingFieldsGrow</enum>
      </property>
+     <item row="0" column="0">
+      <widget class="BuddyLabel" name="label_9">
+       <property name="text">
+        <string>Type:</string>
+       </property>
+       <property name="buddy">
+        <cstring>typeCombo</cstring>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QComboBox" name="typeCombo">
+       <item>
+        <property name="text">
+         <string>Include songs that match the following:</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>Exclude songs that match the following:</string>
+        </property>
+       </item>
+      </widget>
+     </item>
      <item row="1" column="0">
       <widget class="BuddyLabel" name="label">
        <property name="text">
@@ -32,6 +57,19 @@
      <item row="1" column="1">
       <widget class="CompletionCombo" name="artistText"/>
      </item>
+     <item row="2" column="0">
+      <widget class="BuddyLabel" name="similarArtistsText_label">
+       <property name="text">
+        <string>Artists similar to:</string>
+       </property>
+       <property name="buddy">
+        <cstring>similarArtistsText</cstring>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="1">
+      <widget class="CompletionCombo" name="similarArtistsText"/>
+     </item>
      <item row="3" column="0">
       <widget class="BuddyLabel" name="label_2">
        <property name="text">
@@ -108,7 +146,7 @@
       </widget>
      </item>
      <item row="8" column="1">
-      <widget class="SpinBox" name="dateFromSpin">
+      <widget class="QSpinBox" name="dateFromSpin">
        <property name="minimumSize">
         <size>
          <width>72</width>
@@ -131,7 +169,7 @@
       </widget>
      </item>
      <item row="9" column="1">
-      <widget class="SpinBox" name="dateToSpin">
+      <widget class="QSpinBox" name="dateToSpin">
        <property name="minimumSize">
         <size>
          <width>72</width>
@@ -143,56 +181,13 @@
        </property>
       </widget>
      </item>
-     <item row="10" column="0">
-      <widget class="BuddyLabel" name="label_5x">
-       <property name="text">
-        <string>Exact match:</string>
-       </property>
-       <property name="buddy">
-        <cstring>exactCheck</cstring>
-       </property>
-      </widget>
-     </item>
-     <item row="10" column="1">
-      <widget class="OnOffButton" name="exactCheck"/>
-     </item>
-     <item row="0" column="0">
-      <widget class="BuddyLabel" name="label_9">
-       <property name="text">
-        <string>Type:</string>
-       </property>
-       <property name="buddy">
-        <cstring>typeCombo</cstring>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="1">
-      <widget class="QComboBox" name="typeCombo">
-       <item>
-        <property name="text">
-         <string>Include songs that match the following:</string>
-        </property>
-       </item>
-       <item>
-        <property name="text">
-         <string>Exclude songs that match the following:</string>
-        </property>
-       </item>
-      </widget>
-     </item>
-     <item row="2" column="0">
-      <widget class="BuddyLabel" name="similarArtistsText_label">
+     <item row="10" column="0" colspan="2">
+      <widget class="QCheckBox" name="exactCheck">
        <property name="text">
-        <string>Artists similar to:</string>
-       </property>
-       <property name="buddy">
-        <cstring>similarArtistsText</cstring>
+        <string>Exact match</string>
        </property>
       </widget>
      </item>
-     <item row="2" column="1">
-      <widget class="CompletionCombo" name="similarArtistsText"/>
-     </item>
     </layout>
    </item>
    <item>
@@ -213,23 +208,23 @@
    </item>
    <item>
     <widget class="QLabel" name="errorLabel"/>
-  </item>
-  <item>
-   <spacer name="verticalSpacer_3xz">
-    <property name="orientation">
-     <enum>Qt::Vertical</enum>
-    </property>
-    <property name="sizeType">
-     <enum>QSizePolicy::Fixed</enum>
-    </property>
-    <property name="sizeHint" stdset="0">
-     <size>
-      <width>20</width>
-      <height>4</height>
-     </size>
-    </property>
-   </spacer>
-  </item>
+   </item>
+   <item>
+    <spacer name="verticalSpacer_3xz">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Fixed</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>4</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
    <item>
     <widget class="QLabel" name="label_7">
      <property name="text">
@@ -238,25 +233,28 @@
      <property name="alignment">
       <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
      </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
     </widget>
-  </item>
-  <item>
-   <spacer name="verticalSpacer_3x">
-    <property name="orientation">
-     <enum>Qt::Vertical</enum>
-    </property>
-    <property name="sizeType">
-     <enum>QSizePolicy::Fixed</enum>
-    </property>
-    <property name="sizeHint" stdset="0">
-     <size>
-      <width>20</width>
-      <height>4</height>
-     </size>
-    </property>
-   </spacer>
-  </item>
-  <item>
+   </item>
+   <item>
+    <spacer name="verticalSpacer_3x">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Fixed</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>4</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
     <widget class="QLabel" name="label_7x">
      <property name="text">
       <string><i><b>NOTE</b> For genre, end string with an asterisk to match various genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. </i></string>
@@ -264,6 +262,9 @@
      <property name="alignment">
       <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
      </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
     </widget>
    </item>
    <item>
@@ -286,9 +287,9 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>OnOffButton</class>
-   <extends>QCheckBox</extends>
-   <header>onoffbutton.h</header>
+   <class>BuddyLabel</class>
+   <extends>QLabel</extends>
+   <header>buddylabel.h</header>
   </customwidget>
   <customwidget>
    <class>LineEdit</class>
@@ -300,29 +301,7 @@
    <extends>QComboBox</extends>
    <header>completioncombo.h</header>
   </customwidget>
-  <customwidget>
-   <class>BuddyLabel</class>
-   <extends>QLabel</extends>
-   <header>buddylabel.h</header>
-  </customwidget>
-  <customwidget>
-   <class>SpinBox</class>
-   <extends>QSpinBox</extends>
-   <header>spinbox.h</header>
-  </customwidget>
  </customwidgets>
- <tabstops>
-  <tabstop>typeCombo</tabstop>
-  <tabstop>artistText</tabstop>
-  <tabstop>albumArtistText</tabstop>
-  <tabstop>composerText</tabstop>
-  <tabstop>albumText</tabstop>
-  <tabstop>titleText</tabstop>
-  <tabstop>genreText</tabstop>
-  <tabstop>dateFromSpin</tabstop>
-  <tabstop>dateToSpin</tabstop>
-  <tabstop>exactCheck</tabstop>
- </tabstops>
  <resources/>
  <connections/>
 </ui>
diff --git a/dynamic/dynamicruledialog.cpp b/dynamic/dynamicruledialog.cpp
index 3014a2d..6e548c8 100644
--- a/dynamic/dynamicruledialog.cpp
+++ b/dynamic/dynamicruledialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -30,7 +30,7 @@ static const int constMaxDate=2100;
 static const QChar constDateSep('-');
 
 DynamicRuleDialog::DynamicRuleDialog(QWidget *parent)
-    : Dialog(parent, "DynamicRuleDialog")
+    : Dialog(parent)
     , addingRules(false)
 {
     QWidget *mainWidet = new QWidget(this);
@@ -90,6 +90,15 @@ DynamicRuleDialog::DynamicRuleDialog(QWidget *parent)
     artistText->setFocus();
     errorLabel->setVisible(false);
     errorLabel->setStyleSheet(QLatin1String("QLabel{color:red;}"));
+    adjustSize();
+    int h=height();
+    int w=width();
+    int minW=500*(Utils::isHighDpi() ? 2 : 1);
+    setMinimumWidth(minW);
+    setMinimumHeight(h);
+    if (w<minW) {
+        resize(minW, h);
+    }
 }
 
 DynamicRuleDialog::~DynamicRuleDialog()
diff --git a/dynamic/dynamicruledialog.h b/dynamic/dynamicruledialog.h
index 4c7716e..8ca2277 100644
--- a/dynamic/dynamicruledialog.h
+++ b/dynamic/dynamicruledialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/dynamic/dynamicrulesdialog.cpp b/dynamic/dynamicrulesdialog.cpp
index 0dfc09c..f697628 100644
--- a/dynamic/dynamicrulesdialog.cpp
+++ b/dynamic/dynamicrulesdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/dynamic/dynamicrulesdialog.h b/dynamic/dynamicrulesdialog.h
index 34d178a..42119f0 100644
--- a/dynamic/dynamicrulesdialog.h
+++ b/dynamic/dynamicrulesdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/gui/albumspage.cpp b/gui/albumspage.cpp
index 36189a6..75b13a2 100644
--- a/gui/albumspage.cpp
+++ b/gui/albumspage.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -35,13 +35,10 @@
 
 AlbumsPage::AlbumsPage(QWidget *p)
     : QWidget(p)
-    , coverLoad(Settings::self()->albumViewLoadAll() ? CL_LoadAll : CL_LoadAsRequired)
 {
     setupUi(this);
     addToPlayQueue->setDefaultAction(StdActions::self()->addToPlayQueueAction);
     replacePlayQueue->setDefaultAction(StdActions::self()->replacePlayQueueAction);
-    libraryUpdate->setDefaultAction(StdActions::self()->refreshAction);
-    searchButton->setDefaultAction(StdActions::self()->searchAction);
 
     view->addAction(StdActions::self()->addToPlayQueueAction);
     view->addAction(StdActions::self()->addRandomToPlayQueueAction);
@@ -70,15 +67,17 @@ AlbumsPage::AlbumsPage(QWidget *p)
     view->setModel(&proxy);
 
     connect(MusicLibraryModel::self(), SIGNAL(updateGenres(const QSet<QString> &)), genreCombo, SLOT(update(const QSet<QString> &)));
-    connect(AlbumsModel::self(), SIGNAL(updated()), this, SLOT(albumsUpdated()));
     connect(this, SIGNAL(add(const QStringList &, bool, quint8)), MPDConnection::self(), SLOT(add(const QStringList &, bool, quint8)));
     connect(this, SIGNAL(addSongsToPlaylist(const QString &, const QStringList &)), MPDConnection::self(), SLOT(addToPlaylist(const QString &, const QStringList &)));
     connect(genreCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(searchItems()));
     connect(view, SIGNAL(searchItems()), this, SLOT(searchItems()));
     connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions()));
+    connect(view, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(itemDoubleClicked(const QModelIndex &)));
     connect(view, SIGNAL(rootIndexSet(QModelIndex)), this, SLOT(updateGenres(QModelIndex)));
-    connect(MPDConnection::self(), SIGNAL(updatingLibrary()), view, SLOT(showSpinner()));
-    connect(MPDConnection::self(), SIGNAL(updatedLibrary()), view, SLOT(hideSpinner()));
+    connect(MPDConnection::self(), SIGNAL(updatingLibrary()), this, SLOT(showSpinner()));
+    connect(MPDConnection::self(), SIGNAL(updatedLibrary()), this, SLOT(hideSpinner()));
+    connect(MPDConnection::self(), SIGNAL(updatingDatabase()), this, SLOT(showSpinner()));
+    connect(MPDConnection::self(), SIGNAL(updatedDatabase()), this, SLOT(hideSpinner()));
 }
 
 AlbumsPage::~AlbumsPage()
@@ -89,15 +88,12 @@ void AlbumsPage::setView(int v)
 {
     setItemSize(v);
     view->setMode((ItemView::Mode)v);
+    AlbumsModel::self()->setIconMode(ItemView::Mode_IconTop==v);
 }
 
 void AlbumsPage::showEvent(QShowEvent *e)
 {
     view->focusView();
-    if (CL_LoadAll==coverLoad) {
-        AlbumsModel::self()->loadAllCovers();
-        coverLoad=CL_Loaded;
-    }
     QWidget::showEvent(e);
 }
 
@@ -121,20 +117,6 @@ void AlbumsPage::setItemSize(int v)
     }
 }
 
-void AlbumsPage::albumsUpdated()
-{
-    if (CL_LoadAsRequired==coverLoad) {
-        return;
-    }
-
-    if (isVisible()) {
-        AlbumsModel::self()->loadAllCovers();
-        coverLoad=CL_Loaded;
-    } else {
-        coverLoad=CL_LoadAll;
-    }
-}
-
 QStringList AlbumsPage::selectedFiles(bool allowPlaylists, bool randomAlbums) const
 {
     QModelIndexList selected = view->selectedIndexes();
@@ -238,7 +220,7 @@ void AlbumsPage::deleteSongs()
 }
 #endif
 
-void AlbumsPage::itemActivated(const QModelIndex &)
+void AlbumsPage::itemDoubleClicked(const QModelIndex &)
 {
     if (1==view->selectedIndexes(false).size()) {//doubleclick should only have one selected item
         addSelectionToPlaylist();
@@ -299,3 +281,15 @@ void AlbumsPage::controlActions()
     }
     StdActions::self()->addRandomToPlayQueueAction->setEnabled(allowRandomAlbum);
 }
+
+void AlbumsPage::showSpinner()
+{
+    view->showSpinner();
+    view->showMessage(i18n("Updating..."), -1);
+}
+
+void AlbumsPage::hideSpinner()
+{
+    view->hideSpinner();
+    view->showMessage(QString(), 0);
+}
diff --git a/gui/albumspage.h b/gui/albumspage.h
index 006e71c..3360210 100644
--- a/gui/albumspage.h
+++ b/gui/albumspage.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,22 +26,15 @@
 
 #include "ui_albumspage.h"
 #include "albumsproxymodel.h"
-#include "config.h"
+#include "page.h"
 
 class Action;
 class MusicLibraryItemRoot;
 
-class AlbumsPage : public QWidget, public Ui::AlbumsPage
+class AlbumsPage : public QWidget, public Ui::AlbumsPage, public Page
 {
     Q_OBJECT
 
-    enum CoverLoad
-    {
-        CL_LoadAsRequired,
-        CL_LoadAll,
-        CL_Loaded
-    };
-
 public:
     AlbumsPage(QWidget *p);
     virtual ~AlbumsPage();
@@ -58,8 +51,7 @@ public:
     void setView(int v);
     ItemView::Mode viewMode() const { return view->viewMode(); }
     void focusSearch() { view->focusSearch(); }
-    void goBack() { view->backActivated(); }
-    void goTop() { view->setLevel(0); }
+    void goTop() { view->goToTop(); }
     void showEvent(QShowEvent *e);
 
 private:
@@ -74,14 +66,14 @@ Q_SIGNALS:
     void deleteSongs(const QString &from, const QList<Song> &songs);
 
 public Q_SLOTS:
-    void itemActivated(const QModelIndex &);
+    void itemDoubleClicked(const QModelIndex &);
     void controlActions();
     void searchItems();
     void updateGenres(const QModelIndex &);
-    void albumsUpdated();
+    void showSpinner();
+    void hideSpinner();
 
 private:
-    CoverLoad coverLoad;
     AlbumsProxyModel proxy;
 };
 
diff --git a/gui/albumspage.ui b/gui/albumspage.ui
index b8a6351..66ab462 100644
--- a/gui/albumspage.ui
+++ b/gui/albumspage.ui
@@ -47,12 +47,6 @@
       <number>0</number>
      </property>
      <item>
-      <widget class="ToolButton" name="libraryUpdate"/>
-     </item>
-     <item>
-      <widget class="ToolButton" name="searchButton"/>
-     </item>
-     <item>
       <widget class="GenreCombo" name="genreCombo"/>
      </item>
      <item>
diff --git a/gui/application.cpp b/gui/application.cpp
index e87a72d..37c2a0f 100644
--- a/gui/application.cpp
+++ b/gui/application.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -27,6 +27,8 @@
 #include <KDE/KCmdLineArgs>
 #include <KDE/KStartupInfo>
 #include "initialsettingswizard.h"
+#include "thread.h"
+#include "song.h"
 #else
 #include <QIcon>
 #ifdef Q_OS_WIN
@@ -77,10 +79,11 @@ int Application::newInstance() {
     }
 
     if (w) {
-        if (!w->isVisible()) {
-            w->showNormal();
-        }
+        w->restoreWindow();
     } else {
+        // Ensure ThreadCleaner is in GUI thread...
+        ThreadCleaner::self();
+        Song::initTranslations();
         if (Settings::self()->firstRun()) {
             InitialSettingsWizard wz;
             if (QDialog::Rejected==wz.exec()) {
@@ -270,6 +273,8 @@ bool Application::start()
         return true;
     }
     loadFiles();
+    // ...and activate window!
+    QDBusConnection::sessionBus().send(QDBusMessage::createMethodCall("com.googlecode.cantata", "/org/mpris/MediaPlayer2", "", "Raise"));
     return false;
 }
 
@@ -284,7 +289,7 @@ void Application::setupIconTheme()
     }
 
     // BUG:130 Some non-DE environments (IceWM, etc) seem to set theme to HiColor, and this has missing
-    // icons. So cehck for a themed icon,if the current theme does not have this - then see if oxygen
+    // icons. So check for a themed icon, if the current theme does not have this - then see if oxygen
     // or gnome icon themes are installed, and set theme to one of those.
     if (!QIcon::hasThemeIcon("document-save-as")) {
         QStringList themes=QStringList() << QLatin1String("oxygen") << QLatin1String("gnome");
diff --git a/gui/application.h b/gui/application.h
index 5e21baa..a379367 100644
--- a/gui/application.h
+++ b/gui/application.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/gui/cachesettings.cpp b/gui/cachesettings.cpp
index 85e92de..e32f907 100644
--- a/gui/cachesettings.cpp
+++ b/gui/cachesettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This file is part of Clementine.
@@ -27,6 +27,7 @@
 #include "albumview.h"
 #include "songview.h"
 #include "contextwidget.h"
+#include "wikipediasettings.h"
 #include "covers.h"
 #include "musiclibrarymodel.h"
 #include "utils.h"
@@ -35,8 +36,12 @@
 #include "thread.h"
 #include "settings.h"
 #include "basicitemdelegate.h"
+#ifdef ENABLE_STREAMS
 #include "streamsmodel.h"
+#endif
+#ifdef ENABLE_ONLINE_SERVICES
 #include "podcastsearchdialog.h"
+#endif
 #include "squeezedtextlabel.h"
 #include <QLabel>
 #include <QPushButton>
@@ -211,7 +216,7 @@ void CacheTree::showEvent(QShowEvent *e)
 {
     if (!calculated) {
         for (int i=0; i<topLevelItemCount(); ++i) {
-            ((CacheItem *)topLevelItem(i))->calculate();
+            static_cast<CacheItem *>(topLevelItem(i))->calculate();
         }
         calculated=true;
     }
@@ -242,9 +247,10 @@ CacheSettings::CacheSettings(QWidget *parent)
     layout->setMargin(0);
     int row=0;
     int col=0;
-    QLabel *label=new QLabel(i18n("To speed up loading of the music library, Cantata caches a local copy of the MPD listing. Cantata might also have cached "
-                                  "covers, or lyrics, if these have been downloaded and could not be saved into the MPD folder (because Cantata cannot access it, "
-                                  "or you have configured Cantata to not save these items there). Below is a summary of Cantata's cache usage."), this);
+    QLabel *label=new QLabel(i18n("Cantata caches a local copy of the MPD listing to speed up loading of the music library. Cantata might also have cached "
+                                  "covers, lyrics, or artist images, if these have been downloaded and could not be saved into the MPD folder (because "
+                                  "Cantata cannot access it, or you have configured Cantata to not save these items there). Below is a summary of Cantata's "
+                                  "current cache usage."), this);
     label->setWordWrap(true);
     layout->addWidget(label, row++, col, 1, 2);
     layout->addItem(new QSpacerItem(spacing, spacing, QSizePolicy::Fixed, QSizePolicy::Fixed), row++, 0);
@@ -255,15 +261,21 @@ CacheSettings::CacheSettings(QWidget *parent)
     new CacheItem(i18n("Music Library"), Utils::cacheDir(MusicLibraryModel::constLibraryCache, false),
                   QStringList() << "*"+MusicLibraryModel::constLibraryExt << "*"+MusicLibraryModel::constLibraryCompressedExt, tree);
     new CacheItem(i18n("Covers"), Utils::cacheDir(Covers::constCoverDir, false), QStringList() << "*.jpg" << "*.png", tree);
+    new CacheItem(i18n("Scaled Covers"), Utils::cacheDir(Covers::constScaledCoverDir, false), QStringList() << "*.jpg" << "*.png", tree);
     new CacheItem(i18n("Backdrops"), Utils::cacheDir(ContextWidget::constCacheDir, false), QStringList() << "*.jpg" << "*.png", tree);
     new CacheItem(i18n("Lyrics"), Utils::cacheDir(SongView::constLyricsDir, false), QStringList() << "*"+SongView::constExtension, tree);
     new CacheItem(i18n("Artist Information"), Utils::cacheDir(ArtistView::constCacheDir, false), QStringList() << "*"+ArtistView::constInfoExt
                   << "*"+ArtistView::constSimilarInfoExt << "*.json.gz" << "*.jpg" << "*.png", tree);
     new CacheItem(i18n("Album Information"), Utils::cacheDir(AlbumView::constCacheDir, false), QStringList() << "*"+AlbumView::constInfoExt << "*.jpg" << "*.png", tree);
-    new CacheItem(i18n("Streams"), Utils::cacheDir(StreamsModel::constSubDir, false), QStringList() << "*"+StreamsModel::constCacheExt, tree);
+    #ifdef ENABLE_STREAMS
+    new CacheItem(i18n("Stream Listings"), Utils::cacheDir(StreamsModel::constSubDir, false), QStringList() << "*"+StreamsModel::constCacheExt, tree);
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     new CacheItem(i18n("Jamendo"), Utils::cacheDir("jamendo", false), QStringList() << "*"+MusicLibraryModel::constLibraryCompressedExt << "*.jpg" << "*.png", tree);
     new CacheItem(i18n("Magnatune"), Utils::cacheDir("magnatune", false), QStringList() << "*"+MusicLibraryModel::constLibraryCompressedExt << "*.jpg" << "*.png", tree);
     new CacheItem(i18n("Podcast Directories"), Utils::cacheDir(PodcastSearchDialog::constCacheDir, false), QStringList() << "*"+PodcastSearchDialog::constExt, tree);
+    #endif
+    new CacheItem(i18n("Wikipedia Languages"), Utils::cacheDir(WikipediaSettings::constSubDir, false), QStringList() << "*.xml.gz", tree);
 
     for (int i=0; i<tree->topLevelItemCount(); ++i) {
         connect(static_cast<CacheItem *>(tree->topLevelItem(i)), SIGNAL(updated()), this, SLOT(updateSpace()));
@@ -287,7 +299,7 @@ void CacheSettings::controlButton()
 {
     button->setEnabled(false);
     for (int i=0; i<tree->topLevelItemCount(); ++i) {
-        CacheItem *item=(CacheItem *)tree->topLevelItem(i);
+        CacheItem *item=static_cast<CacheItem *>(tree->topLevelItem(i));
 
         if (item->isSelected() && !item->isEmpty()) {
             button->setEnabled(true);
@@ -300,7 +312,7 @@ void CacheSettings::deleteAll()
 {
     QList<CacheItem *> toDelete;
     for (int i=0; i<tree->topLevelItemCount(); ++i) {
-        CacheItem *item=(CacheItem *)tree->topLevelItem(i);
+        CacheItem *item=static_cast<CacheItem *>(tree->topLevelItem(i));
 
         if (item->isSelected() && !item->isEmpty()) {
             toDelete.append(item);
diff --git a/gui/cachesettings.h b/gui/cachesettings.h
index 023326e..bb5bbda 100644
--- a/gui/cachesettings.h
+++ b/gui/cachesettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This file is part of Clementine.
diff --git a/gui/coverdialog.cpp b/gui/coverdialog.cpp
index 1ec433b..9c78417 100644
--- a/gui/coverdialog.cpp
+++ b/gui/coverdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -30,7 +30,9 @@
 #include "mpdconnection.h"
 #include "utils.h"
 #include "spinner.h"
+#include "messageoverlay.h"
 #include "icon.h"
+#include "icons.h"
 #include "qjson/parser.h"
 #include "config.h"
 #include <QVBoxLayout>
@@ -67,6 +69,8 @@
 #include <QDomElement>
 #include <QDebug>
 
+#define DBUG if (Covers::debugEnabled()) qWarning() << "CoverDialog" << __FUNCTION__
+
 static int iCount=0;
 static const int constMaxTempFiles=20;
 
@@ -90,19 +94,22 @@ bool canUse(int w, int h)
     return w>90 && h>90 && (w==h || (h<=(w*1.1) && w<=(h*1.1)));
 }
 
+enum Providers {
+    Prov_LastFm   = 0x0001,
+    Prov_Google   = 0x0002,
+    Prov_DiscoGs  = 0x0004,
+    Prov_CoverArt = 0x0008,
+    Prov_Deezer   = 0x0010,
+    Prov_Spotify  = 0x0020,
+    Prov_ITunes   = 0x0040,
+
+    Prov_All      = 0x007F
+};
+
 class CoverItem : public QListWidgetItem
 {
 public:
-    enum Type {
-        Type_Existing,
-        Type_Local,
-        Type_LastFm,
-        Type_Google,
-        Type_Discogs,
-        Type_CoverArtArchive
-    };
-
-    CoverItem(const QString &u, const QString &tu, QListWidget *parent)
+    CoverItem(const QString &u, const QString &tu, const QImage &img, const QString &text, QListWidget *parent, int w=-1, int h=-1, int sz=-1)
         : QListWidgetItem(parent)
         , imgUrl(u)
         , thmbUrl(tu)
@@ -110,15 +117,21 @@ public:
         setSizeHint(parent->gridSize());
         setTextAlignment(Qt::AlignHCenter | Qt::AlignTop);
         setToolTip(u);
+        if (!img.isNull()) {
+            setImage(img);
+        }
+        if (sz>0) {
+            setText(i18nc("name\nwidth x height (file size)", "%1\n%2 x %3 (%4)", text, w, h, Utils::formatByteSize(sz)));
+        } else if (w>0 && h>0) {
+            setText(i18nc("name\nwidth x height", "%1\n%2 x %3", text, w, h));
+        } else {
+            setText(text);
+        }
     }
-    virtual quint32 key() const =0;
-    virtual Type type() const =0;
     const QString & url() const { return imgUrl; }
     const QString & thumbUrl() const { return thmbUrl; }
-
-    //bool operator<(const CoverItem &o) const {
-    //    return key()<o.key();
-    //}
+    virtual bool isLocal() const { return false; }
+    virtual bool isExisting() const { return false; }
 
 protected:
     void setImage(const QImage &img) {
@@ -142,108 +155,81 @@ protected:
     QListWidget *list;
 };
 
-class LastFmCover : public CoverItem
+class ExistingCover : public CoverItem
 {
 public:
-    LastFmCover(const QString &u, const QString &tu, const QImage &img, QListWidget *parent)
-        : CoverItem(u, tu, parent) {
-        setImage(img);
-        setText(i18n("Last.fm"));
+    ExistingCover(const Covers::Image &i, QListWidget *parent)
+        : CoverItem(i.fileName, QString(), i.img, i18n("Current Cover"), parent, i.img.width(), i.img.height(), QFileInfo(i.fileName).size())
+        , img(i.img) {
+        QFont f(font());
+        f.setBold((true));
+        setFont(f);
     }
-
-    quint32 key() const { return 0xFFFFFFFD; }
-    Type type()  const { return Type_LastFm; }
+    bool isExisting() const { return true; }
+    const QImage & image() const { return img; }
+private:
+    QImage img;
 };
 
 class LocalCover : public CoverItem
 {
 public:
     LocalCover(const QString &u, const QImage &i, QListWidget *parent)
-        : CoverItem(u, QString(), parent)
-        , img(i) {
-        setImage(i);
-        setText(i18nc("name\nwidth x height (file size)", "%1\n%2 x %3 (%4)",
-                Utils::getFile(u), img.width(), img.height(), Utils::formatByteSize(QFileInfo(u).size())));
-    }
-
-    quint32 key() const { return 0xFFFFFFFE; }
-    Type type()  const { return Type_Local; }
+        : CoverItem(u, QString(), i, Utils::getFile(u), parent, img.width(), img.height(), QFileInfo(u).size())
+        , img(i) { }
+    bool isLocal() const { return true; }
     const QImage & image() const { return img; }
 private:
     QImage img;
 };
 
+class LastFmCover : public CoverItem
+{
+public:
+    LastFmCover(const QString &u, const QString &tu, const QImage &img, QListWidget *parent)
+        : CoverItem(u, tu, img, QLatin1String("Last.fm"), parent) { }
+};
+
 class GoogleCover : public CoverItem
 {
 public:
     GoogleCover(const QString &u, const QString &tu, const QImage &img, int w, int h, int size, QListWidget *parent)
-        : CoverItem(u, tu, parent)
-        , width(w)
-        , height(h) {
-        setImage(img);
-        setText(i18nc("Google\nwidth x height (file size)", "Google\n%1 x %2 (%3)", width, height, Utils::formatByteSize(size*1024)));
-    }
-
-    quint32 key() const { return width*height; }
-    Type type()  const { return Type_Google; }
-
-private:
-    int width;
-    int height;
+        : CoverItem(u, tu, img, QLatin1String("Google"), parent, w, h, size*1024) { }
 };
 
 class DiscogsCover : public CoverItem
 {
 public:
     DiscogsCover(const QString &u, const QString &tu, const QImage &img, int w, int h, QListWidget *parent)
-        : CoverItem(u, tu, parent)
-        , width(w)
-        , height(h) {
-        setImage(img);
-        setText(width>10 && height>10
-                    ? i18nc("Discogs\nwidth x height", "Discogs\n%1 x %2", width, height)
-                    : QLatin1String("Discogs"));
-    }
-
-    quint32 key() const { return width*height; }
-    Type type()  const { return Type_Discogs; }
-private:
-    int width;
-    int height;
+        : CoverItem(u, tu, img, QLatin1String("Discogs"), parent, w, h) { }
 };
 
 class CoverArtArchiveCover : public CoverItem
 {
 public:
     CoverArtArchiveCover(const QString &u, const QString &tu, const QImage &img, QListWidget *parent)
-        : CoverItem(u, tu, parent)  {
-        setImage(img);
-        setText("coverartarchive.org");
-    }
-
-    quint32 key() const { return 0xFFFFFFFC; }
-    Type type()  const { return Type_CoverArtArchive; }
+        : CoverItem(u, tu, img, i18n("CoverArt Archive"), parent)  { }
 };
 
-class ExistingCover : public CoverItem
+class DeezerCover : public CoverItem
 {
 public:
-    ExistingCover(const Covers::Image &i, QListWidget *parent)
-        : CoverItem(i.fileName, QString(), parent)
-        , img(i) {
-        setImage(img.img);
-        QFont f(font());
-        f.setBold((true));
-        setFont(f);
-        setText(i18nc("Current Cover\nwidth x height", "Current Cover\n%1 x %2", img.img.width(), img.img.height()));
-    }
+    DeezerCover(const QString &u, const QString &tu, const QImage &img, QListWidget *parent)
+        : CoverItem(u, tu, img, QLatin1String("Deezer"), parent)  { }
+};
 
-    quint32 key() const { return 0xFFFFFFFF; }
-    Type type()  const { return Type_Existing; }
-    const QImage & image() const { return img.img; }
+class SpotifyCover : public CoverItem
+{
+public:
+    SpotifyCover(const QString &u, const QString &tu, const QImage &img, QListWidget *parent)
+        : CoverItem(u, tu, img, QLatin1String("Spotify"), parent, 640, 640)  { }
+};
 
-private:
-    Covers::Image img;
+class ITunesCover : public CoverItem
+{
+public:
+    ITunesCover(const QString &u, const QString &tu, const QImage &img, QListWidget *parent)
+        : CoverItem(u, tu, img, QLatin1String("iTunes"), parent, 600, 600)  { }
 };
 
 CoverPreview::CoverPreview(QWidget *p)
@@ -356,15 +342,25 @@ void CoverPreview::wheelEvent(QWheelEvent *event)
 CoverDialog::CoverDialog(QWidget *parent)
     : Dialog(parent, "CoverDialog")
     , existing(0)
+    , currentQueryProviders(0)
     , preview(0)
     , saving(false)
     , isArtist(false)
     , spinner(0)
+    , msgOverlay(0)
     , page(0)
     , menu(0)
     , showAction(0)
     , removeAction(0)
 {
+    #ifdef ENABLE_KDE_SUPPORT
+    KConfigGroup cfg(KGlobal::config(), "CoverDialog");
+    #else
+    QSettings cfg;
+    cfg.beginGroup("CoverDialog");
+    #endif
+    enabledProviders=GET_INT("enabledProviders", (int)Prov_All);
+
     iCount++;
     QWidget *mainWidet = new QWidget(this);
     setupUi(mainWidet);
@@ -376,14 +372,13 @@ CoverDialog::CoverDialog(QWidget *parent)
     connect(list, SIGNAL(itemSelectionChanged()), SLOT(checkStatus()));
     connect(search, SIGNAL(clicked()), SLOT(sendQuery()));
     connect(query, SIGNAL(returnPressed()), SLOT(sendQuery()));
-    connect(cancelButton, SIGNAL(clicked()), SLOT(cancelQuery()));
     connect(addFileButton, SIGNAL(clicked()), SLOT(addLocalFile()));
     connect(list, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(menuRequested(const QPoint&)));
 
     QFont f(list->font());
     QFontMetrics origFm(f);
     iSize=origFm.height()*7;
-    iSize=((iSize/10)*10)+(iSize%10 ? 10 : 0);
+    iSize=((iSize/10)*10)+((iSize%10) ? 10 : 0);
     f.setPointSizeF(f.pointSizeF()*0.75);
     QFontMetrics fm(f);
     list->setFont(f);
@@ -406,15 +401,34 @@ CoverDialog::CoverDialog(QWidget *parent)
     list->setSortingEnabled(false);
 
     addFileButton->setIcon(Icon("document-open"));
-    cancelButton->setIcon(Icon("stop"));
-    cancelButton->setEnabled(false);
-    cancelButton->setAutoRaise(true);
     addFileButton->setAutoRaise(true);
+
+    configureButton->setIcon(Icons::self()->configureIcon);
+    configureButton->setAutoRaise(true);
+
+    QMenu *configMenu=new QMenu(configureButton);
+    addProvider(configMenu, QLatin1String("Last.fm"), Prov_LastFm, enabledProviders);
+    addProvider(configMenu, i18n("CoverArt Archive"), Prov_CoverArt, enabledProviders);
+    addProvider(configMenu, QLatin1String("Google"), Prov_Google, enabledProviders);
+    addProvider(configMenu, QLatin1String("Discogs"), Prov_DiscoGs, enabledProviders);
+    addProvider(configMenu, QLatin1String("Deezer"), Prov_Deezer, enabledProviders);
+    addProvider(configMenu, QLatin1String("Spotify"), Prov_Spotify, enabledProviders);
+    addProvider(configMenu, QLatin1String("iTunes"), Prov_ITunes, enabledProviders);
+    configureButton->setMenu(configMenu);
+    configureButton->setPopupMode(QToolButton::InstantPopup);
     setAcceptDrops(true);
 }
 
 CoverDialog::~CoverDialog()
 {
+    #ifdef ENABLE_KDE_SUPPORT
+    KConfigGroup cfg(KGlobal::config(), "CoverDialog");
+    #else
+    QSettings cfg;
+    cfg.beginGroup("CoverDialog");
+    #endif
+    SET_VALUE("enabledProviders", enabledProviders);
+
     iCount--;
     cancelQuery();
     clearTempFiles();
@@ -435,17 +449,18 @@ void CoverDialog::show(const Song &s, const Covers::Image &current)
         return;
     }
     if (isArtist) {
-        setCaption(song.albumartist);
+        setCaption(i18n("'%1' Artist Image", song.albumartist));
     } else {
-        setCaption(i18nc("Album by Artist", "%1 by %2", song.album, song.albumArtist()));
+        setCaption(i18nc("'Artist - Album' Album Cover", "'%1 - %2' Album Cover", song.albumArtist(), song.album));
     }
     if (!img.img.isNull()) {
         existing=new ExistingCover(isArtist ? Covers::Image(cropImage(img.img, true), img.fileName) : img, list);
         list->addItem(existing);
     }
-    query->setText(isArtist ? song.albumartist : QString(song.album+" "+song.albumArtist()));
-    sendQuery();
+    query->setText(isArtist ? song.albumartist : QString(song.albumArtist()+QLatin1String(" ")+song.album));
+    adjustSize();
     Dialog::show();
+    sendQuery();
 }
 
 static const char * constHostProperty="host";
@@ -459,68 +474,51 @@ static const char * constLastFmHost="ws.audioscrobbler.com";
 static const char * constGoogleHost="images.google.com";
 static const char * constDiscogsHost="api.discogs.com";
 static const char * constCoverArtArchiveHost="coverartarchive.org";
+static const char * constSpotifyHost="ws.spotify.com";
+static const char * constITunesHost="itunes.apple.com";
+static const char * constDeezerHost="api.deezer.com";
 
 void CoverDialog::queryJobFinished()
 {
     NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
-    if (!reply || !currentQuery.contains(reply)) {
+    if (!reply) {
+        return;
+    }
+    reply->deleteLater();
+    if (!currentQuery.contains(reply)) {
         return;
     }
 
+    DBUG << reply->origUrl().toString() << reply->ok();
     currentQuery.remove(reply);
     if (reply->ok()) {
         QString host=reply->property(constHostProperty).toString();
         QByteArray resp=reply->readAll();
         if (constLastFmHost==host) {
-            parseLstFmQueryResponse(resp);
+            parseLastFmQueryResponse(resp);
         } else if (constGoogleHost==host) {
             parseGoogleQueryResponse(resp);
         } else if (constDiscogsHost==host) {
             parseDiscogsQueryResponse(resp);
         } else if (constCoverArtArchiveHost==host) {
             parseCoverArtArchiveQueryResponse(resp);
+        } else if (constSpotifyHost==host) {
+            parseSpotifyQueryResponse(resp);
+        } else if (constITunesHost==host) {
+            parseITunesQueryResponse(resp);
+        } else if (constDeezerHost==host) {
+            parseDeezerQueryResponse(resp);
         }
     }
-    reply->deleteLater();
-    if (spinner && currentQuery.isEmpty()) {
-        spinner->stop();
+    if (currentQuery.isEmpty()) {
+        setSearching(false);
     }
 }
 
 void CoverDialog::insertItem(CoverItem *item)
 {
-    /*
-    int pos=0;
-    for (; pos<list->count(); ++pos) {
-        CoverItem *c=(CoverItem *)list->item(pos);
-        if (c->key()<item->key()) {
-            break;
-        }
-    }
-
-    qWarning() << "INSERT" << pos << item->key();
-    list->insertItem(pos, item);
-
-    for (; pos<list->count(); ++pos) {
-        CoverItem *c=(CoverItem *)list->item(pos);
-        qWarning() << "...      " << pos << c->key();
-    }*/
-
-    /*
-    QMultiMap<int, CoverItem *> sortItems;
-    for (int pos=0; pos<list->count(); ++pos) {
-        CoverItem *i=(CoverItem *)list->item(pos);
-        sortItems.insert(i->key(), i);
-    }
-    sortItems.insert(item->key(), item);
-    QList<CoverItem *> coverItems = sortItems.values();
-
-    foreach (CoverItem *i, coverItems) {
-        list->addItem(i);
-    }
-    */
     list->addItem(item);
-    if (CoverItem::Type_Local==item->type()) {
+    if (item->isLocal()) {
         list->scrollToItem(item);
         list->setItemSelected(item, true);
     }
@@ -529,7 +527,11 @@ void CoverDialog::insertItem(CoverItem *item)
 void CoverDialog::downloadJobFinished()
 {
     NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
-    if (!reply || !currentQuery.contains(reply)) {
+    if (!reply) {
+        return;
+    }
+    reply->deleteLater();
+    if (!currentQuery.contains(reply)) {
         return;
     }
 
@@ -539,22 +541,23 @@ void CoverDialog::downloadJobFinished()
         saving=false;
     }
 
+    DBUG << reply->origUrl().toString() << reply->ok();
     currentQuery.remove(reply);
     if (reply->ok()) {
         QString host=reply->property(constHostProperty).toString();
         QString url=reply->url().toString();
         QByteArray data=reply->readAll();
-        FileType fileType=url.endsWith(".jpg") || url.endsWith(".jpeg") ? FT_Jpg : (url.endsWith(".png") ? FT_Png : FT_Other);
-        QImage img=QImage::fromData(data, FT_Jpg==fileType ? "JPG" : (FT_Png==fileType ? "PNG" : 0));
+        const char *format=Covers::imageFormat(data);
+        QImage img=QImage::fromData(data, format);
         if (!img.isNull()) {
             bool isLarge=reply->property(constThumbProperty).toString().isEmpty();
             QTemporaryFile *temp=0;
 
             if (isLarge || (reply->property(constThumbProperty).toString()==reply->property(constLargeProperty).toString())) {
-                temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX."+(FT_Jpg==fileType ? "jpg" : "png"));
+                temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX."+(format ? QString(QLatin1String(format)).toLower() : "png"));
 
                 if (temp->open()) {
-                    if (FT_Other==fileType) {
+                    if (!format) {
                         img.save(temp, "PNG");
                     } else {
                         temp->write(data);
@@ -564,6 +567,7 @@ void CoverDialog::downloadJobFinished()
                         last->remove();
                         delete last;
                     }
+                    temp->close();
                     temp->setProperty(constLargeProperty, reply->property(constLargeProperty));
                     tempFiles.prepend(temp);
                 } else {
@@ -594,6 +598,12 @@ void CoverDialog::downloadJobFinished()
                                           reply->property(constHeightProperty).toInt(), list);
                 } else if (constCoverArtArchiveHost==host) {
                     item=new CoverArtArchiveCover(reply->property(constLargeProperty).toString(), url, img, list);
+                } else if (constSpotifyHost==host) {
+                    item=new SpotifyCover(reply->property(constLargeProperty).toString(), url, img, list);
+                } else if (constITunesHost==host) {
+                    item=new ITunesCover(reply->property(constLargeProperty).toString(), url, img, list);
+                } else if (constDeezerHost==host) {
+                    item=new DeezerCover(reply->property(constLargeProperty).toString(), url, img, list);
                 }
                 if (item) {
                     insertItem(item);
@@ -606,10 +616,8 @@ void CoverDialog::downloadJobFinished()
         }
         MessageBox::error(this, i18n("Failed to download image!"));
     }
-    reply->deleteLater();
-    if (spinner && currentQuery.isEmpty()) {
-        spinner->stop();
-        cancelButton->setEnabled(false);
+    if (currentQuery.isEmpty()) {
+        setSearching(false);
     }
 }
 
@@ -619,14 +627,14 @@ void CoverDialog::showImage(QListWidgetItem *item)
         return;
     }
 
-    CoverItem *cover=(CoverItem *)item;
+    CoverItem *cover=static_cast<CoverItem *>(item);
 
-    if (CoverItem::Type_Existing==cover->type()) {
+    if (cover->isExisting()) {
         previewDialog()->downloading(cover->url());
-        previewDialog()->showImage(((ExistingCover *)cover)->image(), cover->url());
-    } else if (CoverItem::Type_Local==cover->type()) {
+        previewDialog()->showImage(static_cast<ExistingCover *>(cover)->image(), cover->url());
+    } else if (cover->isLocal()) {
         previewDialog()->downloading(cover->url());
-        previewDialog()->showImage(((LocalCover *)cover)->image(), cover->url());
+        previewDialog()->showImage(static_cast<LocalCover *>(cover)->image(), cover->url());
     } else {
         previewDialog()->downloading(cover->url());
         NetworkJob *j=downloadImage(cover->url(), DL_LargePreview);
@@ -657,7 +665,7 @@ void CoverDialog::sendQuery()
         return;
     }
 
-    if (currentQueryString==fixedQuery) {
+    if (currentQueryString==fixedQuery && enabledProviders==currentQueryProviders) {
         page++;
     } else {
         page=0;
@@ -667,8 +675,8 @@ void CoverDialog::sendQuery()
         QList<CoverItem *> keep;
 
         while (list->count()) {
-            CoverItem *item=(CoverItem *)list->takeItem(0);
-            if (CoverItem::Type_Existing==item->type() || CoverItem::Type_Local==item->type()) {
+            CoverItem *item=static_cast<CoverItem *>(list->takeItem(0));
+            if (item->isExisting() || item->isLocal()) {
                 keep.append(item);
             } else {
                 currentUrls.remove(item->url());
@@ -684,17 +692,29 @@ void CoverDialog::sendQuery()
         cancelQuery();
     }
 
-
-    if (!spinner) {
-        spinner=new Spinner(this);
-        spinner->setWidget(list->viewport());
-    }
-    spinner->start();
-    cancelButton->setEnabled(true);
     currentQueryString=fixedQuery;
-    sendLastFmQuery(fixedQuery, page);
-    sendGoogleQuery(fixedQuery, page);
-    sendDiscoGsQuery(fixedQuery, page);
+    if (enabledProviders&Prov_LastFm) {
+        sendLastFmQuery(fixedQuery, page);
+    }
+    if (enabledProviders&Prov_Google) {
+        sendGoogleQuery(fixedQuery, page);
+    }
+    if (enabledProviders&Prov_DiscoGs) {
+        sendDiscoGsQuery(fixedQuery, page);
+    }
+    if (page==0) {
+        if (enabledProviders&Prov_Spotify) {
+            sendSpotifyQuery(fixedQuery);
+        }
+        if (enabledProviders&Prov_ITunes) {
+            sendITunesQuery(fixedQuery);
+        }
+        if (enabledProviders&Prov_Deezer) {
+            sendDeezerQuery(fixedQuery);
+        }
+    }
+    currentQueryProviders=enabledProviders;
+    setSearching(!currentQuery.isEmpty());
 }
 
 void CoverDialog::sendLastFmQuery(const QString &fixedQuery, int page)
@@ -762,29 +782,86 @@ void CoverDialog::sendDiscoGsQuery(const QString &fixedQuery, int page)
     sendQueryRequest(url);
 }
 
+void CoverDialog::sendSpotifyQuery(const QString &fixedQuery)
+{
+    #ifdef ENABLE_HTTPS_SUPPORT
+    QUrl url;
+    #if QT_VERSION < 0x050000
+    QUrl &query=url;
+    #else
+    QUrlQuery query;
+    #endif
+    url.setScheme("http");
+    url.setHost(constSpotifyHost);
+    url.setPath(isArtist ? "/search/1/artist.json" : "/search/1/album.json");
+    query.addQueryItem("q", fixedQuery);
+    #if QT_VERSION >= 0x050000
+    url.setQuery(query);
+    #endif
+    sendQueryRequest(url);
+    #else
+    Q_UNUSED(fixedQuery)
+    #endif
+}
+
+void CoverDialog::sendITunesQuery(const QString &fixedQuery)
+{
+    if (isArtist) { // TODO???
+        return;
+    }
+
+    QUrl url;
+    #if QT_VERSION < 0x050000
+    QUrl &query=url;
+    #else
+    QUrlQuery query;
+    #endif
+    url.setScheme("http");
+    url.setHost(constITunesHost);
+    url.setPath("/search");
+    query.addQueryItem("term", fixedQuery);
+    query.addQueryItem("limit", QString::number(10));
+    query.addQueryItem("media", "music");
+    query.addQueryItem("entity", "album");
+    #if QT_VERSION >= 0x050000
+    url.setQuery(query);
+    #endif
+    sendQueryRequest(url);
+}
+
+void CoverDialog::sendDeezerQuery(const QString &fixedQuery)
+{
+    QUrl url;
+    #if QT_VERSION < 0x050000
+    QUrl &query=url;
+    #else
+    QUrlQuery query;
+    #endif
+    url.setScheme("http");
+    url.setHost(constDeezerHost);
+    url.setPath(isArtist ? "/search/artist" : "/search/album");
+    query.addQueryItem("q", fixedQuery);
+    query.addQueryItem("nb_items", QString::number(10));
+    query.addQueryItem("output", "json");
+    #if QT_VERSION >= 0x050000
+    url.setQuery(query);
+    #endif
+    sendQueryRequest(url);
+}
+
 void CoverDialog::checkStatus()
 {
     QList<QListWidgetItem*> items=list->selectedItems();
-    enableButtonOk(1==items.size() && CoverItem::Type_Existing!=((CoverItem *)items.at(0))->type());
+    enableButtonOk(1==items.size() && !static_cast<CoverItem *>(items.at(0))->isExisting());
 }
 
 void CoverDialog::cancelQuery()
 {
     foreach (NetworkJob *job, currentQuery) {
-        if (DL_Query==job->property(constTypeProperty).toInt()) {
-            disconnect(job, SIGNAL(finished()), this, SLOT(queryJobFinished()));
-        } else {
-            disconnect(job, SIGNAL(finished()), this, SLOT(downloadJobFinished()));
-        }
-        job->close();
-        job->deleteLater();
+        job->cancelAndDelete();
     }
     currentQuery.clear();
-
-    if (spinner) {
-        spinner->stop();
-    }
-    cancelButton->setEnabled(false);
+    setSearching(false);
 }
 
 void CoverDialog::addLocalFile()
@@ -825,8 +902,7 @@ void CoverDialog::menuRequested(const QPoint &pos)
     removeAction->setEnabled(!items.isEmpty());
     if (removeAction->isEnabled()) {
         foreach (QListWidgetItem *i, items) {
-            CoverItem *c=(CoverItem *)i;
-            if (CoverItem::Type_Existing==c->type()) {
+            if (static_cast<CoverItem *>(i)->isExisting()) {
                 removeAction->setEnabled(false);
             }
         }
@@ -850,6 +926,27 @@ void CoverDialog::removeImages()
     }
 }
 
+void CoverDialog::updateProviders()
+{
+    QAction *s=qobject_cast<QAction *>(sender());
+    enabledProviders=0;
+
+    if (s) {
+        if (Prov_LastFm==s->data().toUInt() && !s->isChecked()) {
+            providers[Prov_CoverArt]->setChecked(false);
+        } else if (Prov_CoverArt==s->data().toUInt() && s->isChecked()) {
+            providers[Prov_LastFm]->setChecked(true);
+        }
+    }
+
+    foreach (const QAction *act, configureButton->menu()->actions()) {
+        if (act->isChecked()) {
+            enabledProviders|=act->data().toUInt();
+        }
+    }
+    DBUG << enabledProviders;
+}
+
 void CoverDialog::clearTempFiles()
 {
     foreach (QTemporaryFile *file, tempFiles) {
@@ -860,6 +957,7 @@ void CoverDialog::clearTempFiles()
 
 void CoverDialog::sendQueryRequest(const QUrl &url, const QString &host)
 {
+    DBUG << url.toString();
     NetworkJob *j=NetworkAccessManager::self()->get(QNetworkRequest(url));
     j->setProperty(constHostProperty, host.isEmpty() ? url.host() : host);
     j->setProperty(constTypeProperty, (int)DL_Query);
@@ -869,6 +967,7 @@ void CoverDialog::sendQueryRequest(const QUrl &url, const QString &host)
 
 NetworkJob * CoverDialog::downloadImage(const QString &url, DownloadType dlType)
 {
+    DBUG << url << dlType;
     if (DL_Thumbnail==dlType) {
         if (currentUrls.contains(url)) {
             return 0;
@@ -912,8 +1011,31 @@ NetworkJob * CoverDialog::downloadImage(const QString &url, DownloadType dlType)
     return j;
 }
 
+void CoverDialog::downloadThumbnail(const QString &thumbUrl, const QString &largeUrl, const QString &host, int w, int h, int sz)
+{
+    if (thumbUrl.isEmpty() || largeUrl.isEmpty()) {
+        return;
+    }
+
+    NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail);
+    if (j) {
+        j->setProperty(constThumbProperty, thumbUrl);
+        j->setProperty(constLargeProperty, largeUrl);
+        j->setProperty(constHostProperty, host);
+        if (w>0) {
+            j->setProperty(constWidthProperty, w);
+        }
+        if (h>0) {
+            j->setProperty(constHeightProperty, h);
+        }
+        if (sz>0) {
+            j->setProperty(constSizeProperty, sz);
+        }
+    }
+}
+
 typedef QMap<QString, QString> SizeMap;
-void CoverDialog::parseLstFmQueryResponse(const QByteArray &resp)
+void CoverDialog::parseLastFmQueryResponse(const QByteArray &resp)
 {
     bool inSection=false;
     QXmlStreamReader doc(resp);
@@ -969,23 +1091,17 @@ void CoverDialog::parseLstFmQueryResponse(const QByteArray &resp)
                 break;
             }
         }
-
-        if (!largeUrl.isEmpty() && !thumbUrl.isEmpty()) {
-            NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail);
-            if (j) {
-                j->setProperty(constHostProperty, constLastFmHost);
-                j->setProperty(constLargeProperty, largeUrl);
-                j->setProperty(constThumbProperty, thumbUrl);
-            }
-        }
+        downloadThumbnail(thumbUrl, largeUrl, constLastFmHost);
     }
 
-    foreach (const QString &id, musibBrainzIds) {
-        QUrl coverartUrl;
-        coverartUrl.setScheme("http");
-        coverartUrl.setHost(constCoverArtArchiveHost);
-        coverartUrl.setPath("/release/"+id);
-        sendQueryRequest(coverartUrl);
+    if (enabledProviders&Prov_CoverArt) {
+        foreach (const QString &id, musibBrainzIds) {
+            QUrl coverartUrl;
+            coverartUrl.setScheme("http");
+            coverartUrl.setHost(constCoverArtArchiveHost);
+            coverartUrl.setPath("/release/"+id);
+            sendQueryRequest(coverartUrl);
+        }
     }
 }
 
@@ -1010,19 +1126,7 @@ void CoverDialog::parseGoogleQueryResponse(const QByteArray &resp)
         int width=url.queryItemValue("w").toInt();
         int height=url.queryItemValue("h").toInt();
         if (canUse(width, height)) {
-            QString largeUrl=url.queryItemValue("imgurl");
-            QString thumbUrl=rx.cap(2);
-            if (!thumbUrl.isEmpty() && !largeUrl.isEmpty()) {
-                NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail);
-                if (j) {
-                    j->setProperty(constHostProperty, constGoogleHost);
-                    j->setProperty(constLargeProperty, largeUrl);
-                    j->setProperty(constThumbProperty, thumbUrl);
-                    j->setProperty(constWidthProperty, width);
-                    j->setProperty(constHeightProperty, height);
-                    j->setProperty(constSizeProperty, url.queryItemValue("sz").toInt());
-                }
-            }
+            downloadThumbnail(rx.cap(2), url.queryItemValue("imgurl"), constGoogleHost, width, height, url.queryItemValue("sz").toInt());
         }
         pos += rx.matchedLength();
     }
@@ -1064,13 +1168,7 @@ void CoverDialog::parseDiscogsQueryResponse(const QByteArray &resp)
                         } else if (isArtist && rm.contains("thumb")) {
                             QString thumbUrl=rm["thumb"].toString();
                             if (thumbUrl.contains("/image/A-150-")) {
-                                QString largeUrl=thumbUrl.replace("image/A-150-", "/image/A-");
-                                NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail);
-                                if (j) {
-                                    j->setProperty(constHostProperty, constDiscogsHost);
-                                    j->setProperty(constLargeProperty, largeUrl);
-                                    j->setProperty(constThumbProperty, thumbUrl);
-                                }
+                                downloadThumbnail(thumbUrl, QString(thumbUrl).replace("image/A-150-", "/image/A-"), constDiscogsHost);
                             }
                         }
                     }
@@ -1084,18 +1182,8 @@ void CoverDialog::parseDiscogsQueryResponse(const QByteArray &resp)
                     QVariantMap im=i.toMap();
                     if (im.contains("uri") && im.contains("uri150") && im.contains("width") && im.contains("height") &&
                         canUse(im["width"].toString().toInt(), im["height"].toString().toInt())) {
-                        QString thumbUrl=im["uri150"].toString();
-                        QString largeUrl=im["uri"].toString();
-                        if (!thumbUrl.isEmpty() && !largeUrl.isEmpty()) {
-                            NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail);
-                            if (j) {
-                                j->setProperty(constHostProperty, constDiscogsHost);
-                                j->setProperty(constLargeProperty, largeUrl);
-                                j->setProperty(constThumbProperty, thumbUrl);
-                                j->setProperty(constWidthProperty, im["width"].toString().toInt());
-                                j->setProperty(constHeightProperty, im["height"].toString().toInt());
-                            }
-                        }
+                        downloadThumbnail(im["uri150"].toString(), im["uri"].toString(), constDiscogsHost,
+                                          im["width"].toString().toInt(), im["height"].toString().toInt());
                     }
                 }
             }
@@ -1121,15 +1209,73 @@ void CoverDialog::parseCoverArtArchiveQueryResponse(const QByteArray &resp)
                 } else if (thumb.contains("large")) {
                     thumbUrl=thumb["large"].toString();
                 }
-                if (!thumbUrl.isEmpty() && !largeUrl.isEmpty()) {
-                    NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail);
-                    if (j) {
-                        j->setProperty(constHostProperty, constCoverArtArchiveHost);
-                        j->setProperty(constLargeProperty, largeUrl);
-                        j->setProperty(constThumbProperty, thumbUrl);
+                downloadThumbnail(thumbUrl, largeUrl, constCoverArtArchiveHost);
+            }
+        }
+    }
+}
+
+void CoverDialog::parseSpotifyQueryResponse(const QByteArray &resp)
+{
+    QJson::Parser parser;
+    bool ok=false;
+    QVariantMap parsed=parser.parse(resp, &ok).toMap();
+    if (ok) {
+        if (parsed.contains("info")) { // Initial query response...
+            const QString key=QLatin1String(isArtist ? "artists" : "albums");
+            const QString href=QLatin1String("spotify:")+QLatin1String(isArtist ? "artist:" : "album:");
+            const QString baseUrl=QLatin1String("https://embed.spotify.com/oembed/?url=http://open.spotify.com/")+QLatin1String(isArtist ? "artist/" : "album/");
+            if (parsed.contains(key)) {
+                QVariantList results=parsed[key].toList();
+                foreach (const QVariant &res, results) {
+                    QVariantMap item=res.toMap();
+                    if (item.contains("href")) {
+                        QString url=item["href"].toString();
+                        if (url.contains(href)) {
+                            url=baseUrl+url.remove(href);
+                            sendQueryRequest(QUrl(url), constSpotifyHost);
+                        }
                     }
                 }
             }
+        } else if (parsed.contains("provider_url") && parsed.contains("thumbnail_url")) { // Response to query above
+            QString thumbUrl=parsed["thumbnail_url"].toString();
+            downloadThumbnail(thumbUrl, QString(thumbUrl).replace("/cover/", "/640/"), constSpotifyHost);
+        }
+    }
+}
+
+void CoverDialog::parseITunesQueryResponse(const QByteArray &resp)
+{
+    QJson::Parser parser;
+    bool ok=false;
+    QVariantMap parsed=parser.parse(resp, &ok).toMap();
+    if (ok && parsed.contains("results")) {
+        QVariantList results=parsed["results"].toList();
+        foreach (const QVariant &res, results) {
+            QVariantMap item=res.toMap();
+            if (item.contains("artworkUrl100")) {
+                QString thumbUrl=item["artworkUrl100"].toString();
+                downloadThumbnail(thumbUrl, QString(thumbUrl).replace("100x100", "600x600"), constITunesHost);
+            }
+        }
+    }
+}
+
+void CoverDialog::parseDeezerQueryResponse(const QByteArray &resp)
+{
+    const QString key=QLatin1String(isArtist ? "picture" : "cover");
+    QJson::Parser parser;
+    bool ok=false;
+    QVariantMap parsed=parser.parse(resp, &ok).toMap();
+    if (ok && parsed.contains("data")) {
+        QVariantList results=parsed["data"].toList();
+        foreach (const QVariant &res, results) {
+            QVariantMap item=res.toMap();
+            if (item.contains(key)) {
+                QString thumbUrl=item[key].toString();
+                downloadThumbnail(thumbUrl, thumbUrl+"&size=big", constDeezerHost);
+            }
         }
     }
 }
@@ -1140,12 +1286,12 @@ void CoverDialog::slotButtonClicked(int button)
     case Ok: {
         QList<QListWidgetItem*> items=list->selectedItems();
         if (1==items.size()) {
-            CoverItem *cover=(CoverItem *)items.at(0);
-            if (CoverItem::Type_Local==cover->type()) {
-                if (saveCover(cover->url(), ((LocalCover *)cover)->image())) {
+            CoverItem *cover=static_cast<CoverItem *>(items.at(0));
+            if (cover->isLocal()) {
+                if (saveCover(cover->url(), static_cast<LocalCover *>(cover)->image())) {
                     accept();
                 }
-            } else if (CoverItem::Type_Existing!=cover->type()) {
+            } else if (!cover->isExisting()) {
                 NetworkJob *j=downloadImage(cover->url(), DL_LargeSave);
                 if (j) {
                     j->setProperty(constLargeProperty, cover->url());
@@ -1166,10 +1312,11 @@ void CoverDialog::slotButtonClicked(int button)
 
 bool CoverDialog::saveCover(const QString &src, const QImage &img)
 {
+    QString filePath=song.filePath();
     if (song.isCdda()) {
         QString dir = Utils::cacheDir(Covers::constCddaCoverDir, true);
         if (!dir.isEmpty()) {
-            QString destName=dir+song.file.mid(7)+src.mid(src.length()-4);
+            QString destName=dir+filePath.mid(7)+src.mid(src.length()-4);
             if (QFile::exists(destName)) {
                 QFile::remove(destName);
             }
@@ -1198,23 +1345,21 @@ bool CoverDialog::saveCover(const QString &src, const QImage &img)
     bool saveInMpd=Settings::self()->storeCoversInMpdDir();
 
     if (saveInMpd) {
-        bool haveAbsPath=song.file.startsWith('/');
+        bool haveAbsPath=filePath.startsWith('/');
         mpdDir=MPDConnection::self()->getDetails().dir;
         if (haveAbsPath || !mpdDir.isEmpty()) {
-            dirName=song.file.endsWith('/') ? (haveAbsPath ? QString() : mpdDir)+song.file
-                                            : Utils::getDir((haveAbsPath ? QString() : mpdDir)+song.file);
+            dirName=filePath.endsWith('/') ? (haveAbsPath ? QString() : mpdDir)+filePath
+                                            : Utils::getDir((haveAbsPath ? QString() : mpdDir)+filePath);
         }
     }
 
     if (isArtist) {
-        if (saveInMpd) {
-            if (!mpdDir.isEmpty() && dirName.startsWith(mpdDir) && 2==dirName.mid(mpdDir.length()).split('/', QString::SkipEmptyParts).count()) {
-                QDir d(dirName);
-                d.cdUp();
-                destName=d.absolutePath()+'/'+Covers::artistFileName(song)+src.mid(src.length()-4);
-            }
+        if (saveInMpd && !mpdDir.isEmpty() && dirName.startsWith(mpdDir) && 2==dirName.mid(mpdDir.length()).split('/', QString::SkipEmptyParts).count()) {
+            QDir d(dirName);
+            d.cdUp();
+            destName=d.absolutePath()+'/'+Covers::artistFileName(song)+src.mid(src.length()-4);
         } else {
-            destName=Utils::cacheDir(Covers::constCoverDir)+Covers::encodeName(song.albumartist)+src.mid(src.length()-4);
+            destName=Utils::cacheDir(Covers::constCoverDir, true)+Covers::encodeName(song.albumartist)+src.mid(src.length()-4);
         }
     } else {
         if (saveInMpd) {
@@ -1277,3 +1422,36 @@ void CoverDialog::dropEvent(QDropEvent *event)
         }
     }
 }
+
+void CoverDialog::setSearching(bool s)
+{
+    if (!spinner && !s) {
+        return;
+    }
+    if (!spinner) {
+        spinner=new Spinner(this);
+        spinner->setWidget(list);
+    }
+    if (!msgOverlay) {
+        msgOverlay=new MessageOverlay(this);
+        msgOverlay->setWidget(list);
+        connect(msgOverlay, SIGNAL(cancel()), SLOT(cancelQuery()));
+    }
+    if (s) {
+        spinner->start();
+        msgOverlay->setText(i18n("Searching..."));
+    } else {
+        spinner->stop();
+        msgOverlay->setText(QString());
+    }
+}
+
+void CoverDialog::addProvider(QMenu *mnu, const QString &name, int bit, int value)
+{
+    QAction *act=mnu->addAction(name);
+    act->setData(bit);
+    act->setCheckable(true);
+    act->setChecked(value&bit);
+    connect(act, SIGNAL(toggled(bool)), this, SLOT(updateProviders()));
+    providers.insert(bit, act);
+}
diff --git a/gui/coverdialog.h b/gui/coverdialog.h
index bc487d0..4492602 100644
--- a/gui/coverdialog.h
+++ b/gui/coverdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -31,6 +31,7 @@
 #include "covers.h"
 #include <QSet>
 #include <QList>
+#include <QMap>
 
 class NetworkJob;
 class QUrl;
@@ -43,6 +44,7 @@ class QWheelEvent;
 class CoverItem;
 class ExistingCover;
 class Spinner;
+class MessageOverlay;
 class QAction;
 class QMenu;
 
@@ -89,12 +91,6 @@ public:
         DL_LargeSave
     };
 
-    enum FileType {
-        FT_Jpg,
-        FT_Png,
-        FT_Other
-    };
-
     CoverDialog(QWidget *parent);
     virtual ~CoverDialog();
 
@@ -115,29 +111,41 @@ private Q_SLOTS:
     void menuRequested(const QPoint &pos);
     void showImage();
     void removeImages();
+    void updateProviders();
 
 private:
     void sendLastFmQuery(const QString &fixedQuery, int page);
     void sendGoogleQuery(const QString &fixedQuery, int page);
     void sendDiscoGsQuery(const QString &fixedQuery, int page);
+    void sendSpotifyQuery(const QString &fixedQuery);
+    void sendITunesQuery(const QString &fixedQuery);
+    void sendDeezerQuery(const QString &fixedQuery);
     CoverPreview *previewDialog();
     void insertItem(CoverItem *item);
     NetworkJob * downloadImage(const QString &url, DownloadType dlType);
+    void downloadThumbnail(const QString &thumbUrl, const QString &largeUrl, const QString &host, int w=-1, int h=-1, int sz=-1);
     void clearTempFiles();
     void sendQueryRequest(const QUrl &url, const QString &host=QString());
-    void parseLstFmQueryResponse(const QByteArray &resp);
+    void parseLastFmQueryResponse(const QByteArray &resp);
     void parseGoogleQueryResponse(const QByteArray &resp);
     void parseDiscogsQueryResponse(const QByteArray &resp);
     void parseCoverArtArchiveQueryResponse(const QByteArray &resp);
+    void parseSpotifyQueryResponse(const QByteArray &resp);
+    void parseITunesQueryResponse(const QByteArray &resp);
+    void parseDeezerQueryResponse(const QByteArray &resp);
     void slotButtonClicked(int button);
     bool saveCover(const QString &src, const QImage &img);
     void dragEnterEvent(QDragEnterEvent *event);
     void dropEvent(QDropEvent *event);
+    void setSearching(bool s);
+    void addProvider(QMenu *mnu, const QString &name, int bit, int value);
 
 private:
+    int enabledProviders;
     Song song;
     ExistingCover *existing;
     QString currentQueryString;
+    int currentQueryProviders;
     QSet<NetworkJob *> currentQuery;
     QSet<QString> currentUrls;
     QSet<QString> currentLocalCovers;
@@ -147,10 +155,12 @@ private:
     bool isArtist;
     int iSize;
     Spinner *spinner;
+    MessageOverlay *msgOverlay;
     int page;
     QMenu *menu;
     QAction *showAction;
     QAction *removeAction;
+    QMap<int, QAction *> providers;
 };
 
 #endif
diff --git a/gui/coverdialog.ui b/gui/coverdialog.ui
index d5130c4..92e66b9 100644
--- a/gui/coverdialog.ui
+++ b/gui/coverdialog.ui
@@ -18,23 +18,23 @@
     <widget class="LineEdit" name="query"/>
    </item>
    <item row="0" column="1">
-    <widget class="QToolButton" name="cancelButton">
-     <property name="toolTip">
-      <string><html><head/><body><p>Cancel current query</p></body></html></string>
+    <widget class="QPushButton" name="search">
+     <property name="text">
+      <string>Search</string>
      </property>
     </widget>
    </item>
    <item row="0" column="2">
-    <widget class="QPushButton" name="search">
-     <property name="text">
-      <string>Search</string>
+    <widget class="QToolButton" name="addFileButton">
+     <property name="toolTip">
+      <string>Add a local file</string>
      </property>
     </widget>
    </item>
    <item row="0" column="3">
-    <widget class="QToolButton" name="addFileButton">
+    <widget class="QToolButton" name="configureButton">
      <property name="toolTip">
-      <string><html><head/><body><p>Add a local file</p></body></html></string>
+      <string>Configure</string>
      </property>
     </widget>
    </item>
@@ -50,11 +50,6 @@
    <header>lineedit.h</header>
   </customwidget>
   </customwidgets>
- <tabstops>
-  <tabstop>query</tabstop>
-  <tabstop>search</tabstop>
-  <tabstop>list</tabstop>
- </tabstops>
  <resources/>
  <connections/>
 </ui>
diff --git a/gui/covers.cpp b/gui/covers.cpp
index a2c5e9d..b7662af 100644
--- a/gui/covers.cpp
+++ b/gui/covers.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -30,9 +30,11 @@
 #include "config.h"
 #include "deviceoptions.h"
 #include "thread.h"
+#ifdef ENABLE_ONLINE_SERVICES
 #include "soundcloudservice.h"
 #include "podcastservice.h"
 #include "onlineservicesmodel.h"
+#endif
 #ifdef TAGLIB_FOUND
 #include "tags.h"
 #endif
@@ -56,7 +58,6 @@
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KStandardDirs>
 #include <KDE/KGlobal>
-#include <KDE/KTemporaryFile>
 #include <QApplication>
 K_GLOBAL_STATIC(Covers, instance)
 #endif
@@ -77,12 +78,14 @@ bool Covers::debugEnabled()
 
 const QLatin1String Covers::constLastFmApiKey("11172d35eb8cc2fd33250a9e45a2d486");
 const QLatin1String Covers::constCoverDir("covers/");
+const QLatin1String Covers::constScaledCoverDir("covers-scaled/");
 const QLatin1String Covers::constCddaCoverDir("cdda/");
 const QLatin1String Covers::constFileName("cover");
 const QLatin1String Covers::constArtistImage("artist");
 
 static const char * constExtensions[]={".jpg", ".png", 0};
 static bool saveInMpdDir=true;
+static bool fetchCovers=true;
 static QString constCoverInTagPrefix=QLatin1String("{tag}");
 
 static bool canSaveTo(const QString &dir)
@@ -93,9 +96,9 @@ static bool canSaveTo(const QString &dir)
 
 static const QString typeFromRaw(const QByteArray &raw)
 {
-    if (raw.size()>9 && /*raw[0]==0xFF && raw[1]==0xD8 && raw[2]==0xFF*/ raw[6]=='J' && raw[7]=='F' && raw[8]=='I' && raw[9]=='F') {
+    if (Covers::isJpg((raw))) {
         return constExtensions[0];
-    } else if (raw.size()>4 && /*raw[0]==0x89 &&*/ raw[1]=='P' && raw[2]=='N' && raw[3]=='G') {
+    } else if (Covers::isPng(raw)) {
         return constExtensions[1];
     }
     return QString();
@@ -137,6 +140,24 @@ static QString save(const QString &mimeType, const QString &extension, const QSt
     return QString();
 }
 
+static QImage loadImage(const QString &fileName)
+{
+    QImage img(fileName);
+    if (img.isNull()) {
+        // Failed to load, perhaps extension is wrong? If so try PNG for .jpg, and vice versa...
+        QFile f(fileName);
+        if (f.open(QIODevice::ReadOnly)) {
+            QByteArray header=f.read(10);
+            f.reset();
+            img.load(&f, typeFromRaw(header).toLatin1());
+            if (!img.isNull()) {
+                DBUG_CLASS("Covers") << fileName << "has wrong extension!";
+            }
+        }
+    }
+    return img;
+}
+
 static inline QString albumKey(const Song &s)
 {
     return "{"+s.albumArtist()+"}{"+s.album+"}";
@@ -147,6 +168,100 @@ static inline QString artistKey(const Song &s)
     return "{"+s.albumArtist()+"}";
 }
 
+static const QLatin1String constScaledFormat(".jpg");
+static bool cacheScaledCovers=true;
+
+static QString getScaledCoverName(const QString &artist, const QString &album, int size, bool createDir)
+{
+    if (album.isEmpty()) {
+        QString dir=Utils::cacheDir(Covers::constScaledCoverDir+QString::number(size)+QLatin1Char('/'), createDir);
+        return dir.isEmpty() ? QString() : (dir+Covers::encodeName(artist)+constScaledFormat);
+    }
+
+    QString dir=Utils::cacheDir(Covers::constScaledCoverDir+QString::number(size)+QLatin1Char('/')+Covers::encodeName(artist), createDir);
+    return dir.isEmpty() ? QString() : (dir+Covers::encodeName(album)+constScaledFormat);
+}
+
+static void clearScaledCache(const Song &song)
+{
+    bool artistImage=song.isArtistImageRequest();
+    QString dirName=Utils::cacheDir(Covers::constScaledCoverDir, false);
+    if (dirName.isEmpty()) {
+        return;
+    }
+
+    QDir d(dirName);
+    if (!d.exists()) {
+        return;
+    }
+
+    QStringList sizeDirNames=d.entryList(QStringList() << "*", QDir::Dirs|QDir::NoDotAndDotDot);
+
+    if (artistImage) {
+        QString fileName=Covers::encodeName(song.artist)+constScaledFormat;
+        foreach (const QString &sizeDirName, sizeDirNames) {
+            QString fname=dirName+sizeDirName+QLatin1Char('/')+fileName;
+            if (QFile::exists(fname)) {
+                QFile::remove(fname);
+            }
+        }
+    } else {
+        QString subDir=Covers::encodeName(song.artist);
+        QString fileName=Covers::encodeName(song.album)+constScaledFormat;
+        foreach (const QString &sizeDirName, sizeDirNames) {
+            QString fname=dirName+sizeDirName+QLatin1Char('/')+subDir+QLatin1Char('/')+fileName;
+            if (QFile::exists(fname)) {
+                QFile::remove(fname);
+            }
+        }
+    }
+}
+
+QPixmap * Covers::getScaledCover(const QString &artist, const QString &album, int size)
+{
+    if (!cacheScaledCovers) {
+        return 0;
+    }
+
+    DBUG_CLASS("Covers") << artist << album << size;
+    QString cache=getScaledCoverName(artist, album, size, true);
+    if (!cache.isEmpty() && QFile::exists(cache)) {
+        QImage img(cache);
+        if (!img.isNull() && (img.width()==size || img.height()==size)) {
+            DBUG_CLASS("Covers") << artist << album << size << "scaled cover found";
+            return new QPixmap(QPixmap::fromImage(img));
+        }
+    }
+    return 0;
+}
+
+bool Covers::saveScaledCover(const QImage &img, const QString &artist, const QString &album, int size)
+{
+    if (!cacheScaledCovers) {
+        return false;
+    }
+
+    QString fileName=getScaledCoverName(artist, album, size, true);
+    bool status=img.save(fileName);
+    DBUG_CLASS("Covers") << artist << album << size << fileName << status;
+    return status;
+}
+
+bool Covers::isJpg(const QByteArray &data)
+{
+    return data.size()>9 && /*data[0]==0xFF && data[1]==0xD8 && data[2]==0xFF*/ data[6]=='J' && data[7]=='F' && data[8]=='I' && data[9]=='F';
+}
+
+bool Covers::isPng(const QByteArray &data)
+{
+    return data.size()>4 && /*data[0]==0x89 &&*/ data[1]=='P' && data[2]=='N' && data[3]=='G';
+}
+
+const char * Covers::imageFormat(const QByteArray &data)
+{
+    return isJpg(data) ? "JPG" : (isPng(data) ? "PNG" : 0);
+}
+
 QString Covers::encodeName(QString name)
 {
     name.replace("/", "_");
@@ -267,10 +382,10 @@ Covers * Covers::self()
     #endif
 }
 
-bool Covers::isCoverFile(const QString &file)
-{
-    return standardNames().contains(file);
-}
+//bool Covers::isCoverFile(const QString &file)
+//{
+//    return standardNames().contains(file);
+//}
 
 static bool fExists(const QString &dir, const QString &file)
 {
@@ -398,19 +513,22 @@ void CoverDownloader::download(const Song &song)
     }
 
     QString dirName;
-    bool haveAbsPath=song.file.startsWith(Utils::constDirSep);
+    QString fileName=song.filePath();
+    bool haveAbsPath=fileName.startsWith(Utils::constDirSep);
 
     if (haveAbsPath || !MPDConnection::self()->getDetails().dir.isEmpty()) {
-        dirName=song.file.endsWith(Utils::constDirSep) ? (haveAbsPath ? QString() : MPDConnection::self()->getDetails().dir)+song.file
-                                        : Utils::getDir((haveAbsPath ? QString() : MPDConnection::self()->getDetails().dir)+song.file);
+        dirName=fileName.endsWith(Utils::constDirSep) ? (haveAbsPath ? QString() : MPDConnection::self()->getDetails().dir)+fileName
+                                                      : Utils::getDir((haveAbsPath ? QString() : MPDConnection::self()->getDetails().dir)+fileName);
     }
 
     Job job(song, dirName, isArtistImage);
 
     if (!MPDConnection::self()->getDetails().dir.isEmpty() && MPDConnection::self()->getDetails().dir.startsWith(QLatin1String("http://"))) {
         downloadViaHttp(job, JobHttpJpg);
-    } else {
+    } else if (fetchCovers) {
         downloadViaLastFm(job);
+    } else {
+        failed(job);
     }
 }
 
@@ -420,7 +538,7 @@ bool CoverDownloader::downloadViaHttp(Job &job, JobType type)
     bool isArtistImage=job.song.isArtistImageRequest();
     QString coverName=isArtistImage ? Covers::artistFileName(job.song) : Covers::albumFileName(job.song);
     coverName+=constExtensions[JobHttpJpg==type ? 0 : 1];
-    QString dir=Utils::getDir(job.song.file);
+    QString dir=Utils::getDir(job.filePath);
     if (isArtistImage) {
         if (job.level) {
             QStringList parts=dir.split(Utils::constDirSep, QString::SkipEmptyParts);
@@ -537,19 +655,7 @@ void CoverDownloader::lastFmCallFinished()
             DBUG << "download" << u.toString();
             jobs.insert(j, job);
         } else {
-            if (job.isArtist) {
-                DBUG << "Failed to download artist image";
-                emit artistImage(job.song, QImage(), QString());
-            } else {
-                #if defined Q_OS_WIN
-                DBUG << "Failed to download cover image";
-                emit cover(job.song, QImage(), QString());
-                #else
-                DBUG << "Failed to download cover image - try other app";
-                Covers::Image img=otherAppCover(job);
-                emit cover(job.song, img.img, img.fileName);
-                #endif
-            }
+            failed(job);
         }
     }
     reply->deleteLater();
@@ -569,10 +675,8 @@ void CoverDownloader::jobFinished()
 
     if (it!=end) {
         QByteArray data=reply->ok() ? reply->readAll() : QByteArray();
-        QString url=reply->url().toString();
         Covers::Image img;
-        img.img= data.isEmpty() ? QImage() : QImage::fromData(data, url.endsWith(".jpg", Qt::CaseInsensitive) || url.endsWith(".jpeg", Qt::CaseInsensitive)
-                                                              ? "JPG" : (url.endsWith(".png", Qt::CaseInsensitive) ? "PNG" : 0));
+        img.img= data.isEmpty() ? QImage() : QImage::fromData(data, Covers::imageFormat(data));
         Job job=it.value();
 
         if (!img.img.isNull() && img.img.size().width()<32) {
@@ -586,8 +690,10 @@ void CoverDownloader::jobFinished()
                     job.level=0;
                     downloadViaHttp(job, JobHttpPng);
                 }
-            } else if (JobHttpPng==job.type && (!job.level || !downloadViaHttp(job, JobHttpPng))) {
+            } else if (fetchCovers && JobHttpPng==job.type && (!job.level || !downloadViaHttp(job, JobHttpPng))) {
                 downloadViaLastFm(job);
+            } else {
+                failed(job);
             }
         } else {
             if (!img.img.isNull()) {
@@ -618,6 +724,23 @@ void CoverDownloader::jobFinished()
     reply->deleteLater();
 }
 
+void CoverDownloader::failed(const Job &job)
+{
+    if (job.isArtist) {
+        DBUG << "failed to download artist image";
+        emit artistImage(job.song, QImage(), QString());
+    } else {
+        #if defined Q_OS_WIN
+        DBUG << "Failed to download cover image";
+        emit cover(job.song, QImage(), QString());
+        #else
+        DBUG << "failed to download cover image - try other app";
+        Covers::Image img=otherAppCover(job);
+        emit cover(job.song, img.img, img.fileName);
+        #endif
+    }
+}
+
 QString CoverDownloader::saveImg(const Job &job, const QImage &img, const QByteArray &raw)
 {
     QString mimeType=typeFromRaw(raw);
@@ -627,7 +750,7 @@ QString CoverDownloader::saveImg(const Job &job, const QImage &img, const QByteA
     if (job.song.isCdda()) {
         QString dir = Utils::cacheDir(Covers::constCddaCoverDir, true);
         if (!dir.isEmpty()) {
-            savedName=save(mimeType, extension, dir+job.song.file.mid(7), img, raw);
+            savedName=save(mimeType, extension, dir+job.filePath.mid(7), img, raw);
             if (!savedName.isEmpty()) {
                 DBUG << job.song.file << savedName;
                 return savedName;
@@ -637,7 +760,7 @@ QString CoverDownloader::saveImg(const Job &job, const QImage &img, const QByteA
     }
 
     if (job.isArtist) {
-        if (saveInMpdDir && canSaveTo(job.dir)) {
+        if (saveInMpdDir && !job.song.isNonMPD() && canSaveTo(job.dir)) {
             QString mpdDir=MPDConnection::self()->getDetails().dir;
             if (!mpdDir.isEmpty() && job.dir.startsWith(mpdDir) && 2==job.dir.mid(mpdDir.length()).split(Utils::constDirSep, QString::SkipEmptyParts).count()) {
                 QDir d(job.dir);
@@ -650,9 +773,9 @@ QString CoverDownloader::saveImg(const Job &job, const QImage &img, const QByteA
             }
         }
 
-        QString dir = Utils::cacheDir(Covers::constCoverDir);
+        QString dir = Utils::cacheDir(Covers::constCoverDir, true);
         if (!dir.isEmpty()) {
-            savedName=save(mimeType, extension, dir+Covers::encodeName(job.song.albumartist), img, raw);
+            savedName=save(mimeType, extension, dir+Covers::encodeName(job.song.basicArtist()), img, raw);
             if (!savedName.isEmpty()) {
                 DBUG << job.song.file << savedName;
                 return savedName;
@@ -660,7 +783,7 @@ QString CoverDownloader::saveImg(const Job &job, const QImage &img, const QByteA
         }
     } else {
         // Try to save as cover.jpg in album dir...
-        if (saveInMpdDir && canSaveTo(job.dir)) {
+        if (saveInMpdDir && !job.song.isNonMPD() && canSaveTo(job.dir)) {
             QString coverName=Covers::albumFileName(job.song);
             savedName=save(mimeType, extension, job.dir+coverName, img, raw);
             if (!savedName.isEmpty()) {
@@ -670,7 +793,7 @@ QString CoverDownloader::saveImg(const Job &job, const QImage &img, const QByteA
         }
 
         // Could not save with album, save in cache dir...
-        QString dir = Utils::cacheDir(Covers::constCoverDir+Covers::encodeName(job.song.albumArtist()));
+        QString dir = Utils::cacheDir(Covers::constCoverDir+Covers::encodeName(job.song.albumArtist()), true);
         if (!dir.isEmpty()) {
             savedName=save(mimeType, extension, dir+Covers::encodeName(job.song.album), img, raw);
             if (!savedName.isEmpty()) {
@@ -769,7 +892,6 @@ Covers::Covers()
 
     qRegisterMetaType<LocatedCover>("LocatedCover");
     qRegisterMetaType<QList<LocatedCover> >("QList<LocatedCover>");
-    saveInMpdDir=Settings::self()->storeCoversInMpdDir();
     downloader=new CoverDownloader();
     locator=new CoverLocator();
     connect(this, SIGNAL(download(Song)), downloader, SLOT(download(Song)), Qt::QueuedConnection);
@@ -779,6 +901,13 @@ Covers::Covers()
     connect(this, SIGNAL(locate(Song)), locator, SLOT(locate(Song)), Qt::QueuedConnection);
 }
 
+void Covers::readConfig()
+{
+    saveInMpdDir=Settings::self()->storeCoversInMpdDir();
+    cacheScaledCovers=Settings::self()->cacheScaledCovers();
+    fetchCovers=Settings::self()->fetchCovers();
+}
+
 void Covers::stop()
 {
     disconnect(downloader, SIGNAL(artistImage(Song,QImage,QString)), this, SLOT(artistImageDownloaded(Song,QImage,QString)));
@@ -791,9 +920,9 @@ void Covers::stop()
     #endif
 }
 
-static inline quint32 cacheKey(const Song &song, int size)
+static inline QString cacheKey(const Song &song, int size)
 {
-    return (song.key<<16)+(size&0xffffff);
+    return albumKey(song)+QString::number(size);
 }
 
 QPixmap * Covers::get(const Song &song, int size)
@@ -802,11 +931,12 @@ QPixmap * Covers::get(const Song &song, int size)
         return 0;
     }
 
-    quint32 key=cacheKey(song, size);
+    QString key=cacheKey(song, size);
     QPixmap *pix(cache.object(key));
 
     if (!pix) {
         QImage img;
+        #ifdef ENABLE_ONLINE_SERVICES
         if (song.isFromOnlineService()) {
             if (SoundCloudService::constName==song.onlineService()) {
                 img=QImage(SoundCloudService::iconPath());
@@ -814,6 +944,7 @@ QPixmap * Covers::get(const Song &song, int size)
                 img=QImage(PodcastService::iconPath());
             }
         }
+        #endif
 
         if (img.isNull()) {
             img=findImage(song, false).img;
@@ -854,10 +985,11 @@ void Covers::artistImageDownloaded(const Song &song, const QImage &img, const QS
 //                   the next time get() is called, it can read the saved file!
 void Covers::clearCache(const Song &song, const QImage &img, bool dummyEntriesOnly)
 {
+    clearScaledCache(song);
     bool hadDummy=false;
     bool hadEntries=false;
     foreach (int s, cacheSizes) {
-        quint32 key=cacheKey(song, s);
+        QString key=cacheKey(song, s);
         QPixmap *pix(cache.object(key));
 
         if (pix && (!dummyEntriesOnly || pix->width()<2)) {
@@ -898,9 +1030,11 @@ Covers::Image Covers::findImage(const Song &song, bool emitResult)
 Covers::Image Covers::locateImage(const Song &song)
 {
     DBUG_CLASS("Covers") << song.file << song.artist << song.albumartist << song.album << song.type;
+    #ifdef ENABLE_ONLINE_SERVICES
     if (Song::OnlineSvrTrack==song.type) {
         return OnlineServicesModel::self()->readImage(song);
     }
+    #endif
     bool isArtistImage=song.isArtistImageRequest();
     QString prevFileName=Covers::self()->getFilename(song, isArtistImage);
     if (!prevFileName.isEmpty()) {
@@ -909,7 +1043,7 @@ Covers::Image Covers::locateImage(const Song &song)
         if (prevFileName.startsWith(constCoverInTagPrefix)) {
             img=Tags::readImage(prevFileName.mid(constCoverInTagPrefix.length()));
         } else {
-            img=QImage(prevFileName);
+            img=loadImage(prevFileName);
         }
         #else
         QImage img(prevFileName);
@@ -920,9 +1054,9 @@ Covers::Image Covers::locateImage(const Song &song)
         }
     }
 
-    QString songFile=song.file;
+    QString songFile=song.filePath();
     QString dirName;
-    bool haveAbsPath=song.file.startsWith(Utils::constDirSep);
+    bool haveAbsPath=songFile.startsWith(Utils::constDirSep);
 
     if (song.isCantataStream()) {
         #if QT_VERSION < 0x050000
@@ -934,20 +1068,42 @@ Covers::Image Covers::locateImage(const Song &song)
         songFile=u.hasQueryItem("file") ? u.queryItemValue("file") : QString();
     }
 
-    if (!songFile.isEmpty() && !song.file.startsWith(("http:/")) &&
+    QStringList coverFileNames;
+    if (isArtistImage) {
+        QString artistFile=artistFileName(song);
+        QString basicArtist=song.basicArtist();
+        coverFileNames=QStringList() << basicArtist+".jpg" << basicArtist+".png" << artistFile+".jpg" << artistFile+".png";
+    } else {
+        QString mpdCover=albumFileName(song);
+        if (!mpdCover.isEmpty()) {
+            for (int e=0; constExtensions[e]; ++e) {
+                coverFileNames << mpdCover+constExtensions[e];
+            }
+        }
+        coverFileNames << standardNames();
+        for (int e=0; constExtensions[e]; ++e) {
+            coverFileNames+=Utils::changeExtension(Utils::getFile(songFile), constExtensions[e]);
+        }
+        for (int e=0; constExtensions[e]; ++e) {
+            coverFileNames+=song.albumArtist()+QLatin1String(" - ")+song.album+constExtensions[e];
+        }
+        for (int e=0; constExtensions[e]; ++e) {
+            coverFileNames+=song.album+constExtensions[e];
+        }
+    }
+
+    if (!songFile.isEmpty() && !songFile.startsWith(("http:/")) &&
         (haveAbsPath || (!MPDConnection::self()->getDetails().dir.isEmpty() && !MPDConnection::self()->getDetails().dir.startsWith(QLatin1String("http://")) ) ) ) {
         dirName=songFile.endsWith(Utils::constDirSep) ? (haveAbsPath ? QString() : MPDConnection::self()->getDetails().dir)+songFile
                                        : Utils::getDir((haveAbsPath ? QString() : MPDConnection::self()->getDetails().dir)+songFile);
 
 
         if (isArtistImage) {
-            QString artistFile=artistFileName(song);
-            QStringList names=QStringList() << song.albumartist+".jpg" << song.albumartist+".png" << artistFile+".jpg" << artistFile+".png";
+            QString basicArtist=song.basicArtist();
             for (int level=0; level<2; ++level) {
-                foreach (const QString &fileName, names) {
+                foreach (const QString &fileName, coverFileNames) {
                     if (QFile::exists(dirName+fileName)) {
-                        QImage img(dirName+fileName);
-
+                        QImage img=loadImage(dirName+fileName);
                         if (!img.isNull()) {
                             DBUG_CLASS("Covers") << "Got artist image" << QString(dirName+fileName);
                             return Image(img, dirName+fileName);
@@ -958,28 +1114,28 @@ Covers::Image Covers::locateImage(const Song &song)
                 d.cdUp();
                 dirName=Utils::fixPath(d.absolutePath());
             }
-        } else {
-            QStringList names;
-            QString mpdCover=albumFileName(song);
-            if (!mpdCover.isEmpty()) {
-                for (int e=0; constExtensions[e]; ++e) {
-                    names << mpdCover+constExtensions[e];
+
+            // For various artists tracks, or for non-MPD files, see if we have a matching backdrop in MPD.
+            // e.g. artist=Wibble, look for $mpdDir/Wibble/backdrop.png
+            if (song.isVariousArtists() || song.isNonMPD()) {
+                dirName=MPDConnection::self()->getDetails().dirReadable ? MPDConnection::self()->getDetails().dir : QString();
+                if (!dirName.isEmpty() && !dirName.startsWith(QLatin1String("http:/"))) {
+                    dirName+=basicArtist+Utils::constDirSep;
+                    foreach (const QString &fileName, coverFileNames) {
+                        if (QFile::exists(dirName+fileName)) {
+                            QImage img=loadImage(dirName+fileName);
+                            if (!img.isNull()) {
+                                DBUG_CLASS("Covers") << "Got artist image" << QString(dirName+fileName);
+                                return Image(img, dirName+fileName);
+                            }
+                        }
+                    }
                 }
             }
-            names << standardNames();
-            for (int e=0; constExtensions[e]; ++e) {
-                names+=Utils::changeExtension(Utils::getFile(song.file), constExtensions[e]);
-            }
-            for (int e=0; constExtensions[e]; ++e) {
-                names+=song.albumArtist()+QLatin1String(" - ")+song.album+constExtensions[e];
-            }
-            for (int e=0; constExtensions[e]; ++e) {
-                names+=song.album+constExtensions[e];
-            }
-            foreach (const QString &fileName, names) {
+        } else {
+            foreach (const QString &fileName, coverFileNames) {
                 if (QFile::exists(dirName+fileName)) {
-                    QImage img(dirName+fileName);
-
+                    QImage img=loadImage(dirName+fileName);
                     if (!img.isNull()) {
                         DBUG_CLASS("Covers") << "Got cover image" << QString(dirName+fileName);
                         return Image(img, dirName+fileName);
@@ -988,7 +1144,7 @@ Covers::Image Covers::locateImage(const Song &song)
             }
 
             #ifdef TAGLIB_FOUND
-            QString fileName=haveAbsPath ? song.file : (MPDConnection::self()->getDetails().dir+songFile);
+            QString fileName=haveAbsPath ? songFile : (MPDConnection::self()->getDetails().dir+songFile);
             if (QFile::exists(fileName)) {
                 QImage img(Tags::readImage(fileName));
                 if (!img.isNull()) {
@@ -1000,8 +1156,7 @@ Covers::Image Covers::locateImage(const Song &song)
 
             QStringList files=QDir(dirName).entryList(QStringList() << QLatin1String("*.jpg") << QLatin1String("*.png"), QDir::Files|QDir::Readable);
             foreach (const QString &fileName, files) {
-                QImage img(dirName+fileName);
-
+                QImage img=loadImage(dirName+fileName);
                 if (!img.isNull()) {
                     DBUG_CLASS("Covers") << "Got cover image" << QString(dirName+fileName);
                     return Image(img, dirName+fileName);
@@ -1013,10 +1168,29 @@ Covers::Image Covers::locateImage(const Song &song)
     QString artist=encodeName(song.albumArtist());
 
     if (isArtistImage) {
+        // For non-MPD tracks, see if we actually have a saved MPD cover...
+        if (MPDConnection::self()->getDetails().dirReadable) {
+            QString songDir=encodeName(song.albumArtist())+Utils::constDirSep;
+            if (!song.file.startsWith(songDir)) {
+                QString dirName=MPDConnection::self()->getDetails().dir+songDir;
+                if (QDir(dirName).exists()) {
+                    foreach (const QString &fileName, coverFileNames) {
+                        if (QFile::exists(dirName+fileName)) {
+                            QImage img=loadImage(dirName+fileName);
+                            if (!img.isNull()) {
+                                DBUG_CLASS("Covers") << "Got artist image" << QString(dirName+fileName);
+                                return Image(img, dirName+fileName);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        // Check if cover is already cached
         QString dir(Utils::cacheDir(constCoverDir, false));
         for (int e=0; constExtensions[e]; ++e) {
             if (QFile::exists(dir+artist+constExtensions[e])) {
-                QImage img(dir+artist+constExtensions[e]);
+                QImage img=loadImage(dir+artist+constExtensions[e]);
                 if (!img.isNull()) {
                     DBUG_CLASS("Covers") << "Got cached artist image" << QString(dir+artist+constExtensions[e]);
                     return Image(img, dir+artist+constExtensions[e]);
@@ -1025,11 +1199,29 @@ Covers::Image Covers::locateImage(const Song &song)
         }
     } else {
         QString album=encodeName(song.album);
+        // For non-MPD tracks, see if we actually have a saved MPD cover...
+        if (MPDConnection::self()->getDetails().dirReadable) {
+            QString songDir=encodeName(song.albumArtist())+Utils::constDirSep+album+Utils::constDirSep;
+            if (!song.file.startsWith(songDir)) {
+                QString dirName=MPDConnection::self()->getDetails().dir+songDir;
+                if (QDir(dirName).exists()) {
+                    foreach (const QString &fileName, coverFileNames) {
+                        if (QFile::exists(dirName+fileName)) {
+                            QImage img=loadImage(dirName+fileName);
+                            if (!img.isNull()) {
+                                DBUG_CLASS("Covers") << "Got cover image" << QString(dirName+fileName);
+                                return Image(img, dirName+fileName);
+                            }
+                        }
+                    }
+                }
+            }
+        }
         // Check if cover is already cached
         QString dir(Utils::cacheDir(constCoverDir+artist, false));
         for (int e=0; constExtensions[e]; ++e) {
             if (QFile::exists(dir+album+constExtensions[e])) {
-                QImage img(dir+album+constExtensions[e]);
+                QImage img=loadImage(dir+album+constExtensions[e]);
                 if (!img.isNull()) {
                     DBUG_CLASS("Covers") << "Got cached cover image" << QString(dir+album+constExtensions[e]);
                     return Image(img, dir+album+constExtensions[e]);
@@ -1063,6 +1255,23 @@ Covers::Image Covers::requestImage(const Song &song, bool urgent)
 {
     DBUG << song.file << song.artist << song.albumartist << song.album;
 
+    #ifdef ENABLE_ONLINE_SERVICES
+    if (urgent && song.isFromOnlineService()) {
+        Covers::Image img;
+        if (SoundCloudService::constName==song.onlineService()) {
+            img.fileName=SoundCloudService::iconPath();
+        } else if (PodcastService::constName==song.onlineService()) {
+            img.fileName=PodcastService::iconPath();
+        }
+        if (!img.fileName.isEmpty()) {
+            img.img=loadImage(img.fileName);
+            if (!img.img.isNull()) {
+                return img;
+            }
+        }
+    }
+    #endif
+
     QString key=song.isArtistImageRequest() ? artistKey(song) : albumKey(song);
     if (currentImageRequests.contains(key)) {
         return Covers::Image();
@@ -1119,11 +1328,6 @@ void Covers::located(const QList<LocatedCover> &covers)
     }
 }
 
-void Covers::setSaveInMpdDir(bool s)
-{
-    saveInMpdDir=s;
-}
-
 void Covers::emitCoverUpdated(const Song &song, const QImage &img, const QString &file)
 {
     clearCache(song, img, false);
diff --git a/gui/covers.h b/gui/covers.h
index f167ec4..30d8b8c 100644
--- a/gui/covers.h
+++ b/gui/covers.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -59,8 +59,9 @@ public:
     struct Job
     {
         Job(const Song &s, const QString &d, bool a=false)
-            : song(s), dir(d), isArtist(a), type(JobLastFm), level(0) { }
+            : song(s), filePath(s.filePath()), dir(d), isArtist(a), type(JobLastFm), level(0) { }
         Song song;
+        QString filePath;
         QString dir;
         bool isArtist;
         JobType type;
@@ -88,6 +89,7 @@ private Q_SLOTS:
     void jobFinished();
 
 private:
+    void failed(const Job &job);
     QString saveImg(const Job &job, const QImage &img, const QByteArray &raw);
     QHash<NetworkJob *, Job>::Iterator findJob(const Job &job);
 
@@ -155,12 +157,13 @@ public:
     static const QSize constMaxSize;
     static const QLatin1String constLastFmApiKey;
     static const QLatin1String constCoverDir;
+    static const QLatin1String constScaledCoverDir;
     static const QLatin1String constFileName;
     static const QLatin1String constCddaCoverDir;
     static const QLatin1String constArtistImage;
 
     static Covers * self();
-    static bool isCoverFile(const QString &file);
+//    static bool isCoverFile(const QString &file);
     static bool copyImage(const QString &sourceDir, const QString &destDir, const QString &coverFile, const QString &destName, unsigned short maxSize=0);
     static bool copyCover(const Song &song, const QString &sourceDir, const QString &destDir, const QString &name=QString(), unsigned short maxSize=0);
     static const QStringList &standardNames();
@@ -168,8 +171,14 @@ public:
     static QString albumFileName(const Song &song);
     static QString artistFileName(const Song &song);
     static QString fixArtist(const QString &artist);
+    static QPixmap * getScaledCover(const QString &artist, const QString &album, int size);
+    static bool saveScaledCover(const QImage &img, const QString &artist, const QString &album, int size);
+    static bool isJpg(const QByteArray &data);
+    static bool isPng(const QByteArray &data);
+    static const char * imageFormat(const QByteArray &data);
 
     Covers();
+    void readConfig();
     void stop();
 
     // Get cover image of specified size. If this is not found 0 will be returned, and the cover
@@ -183,7 +192,6 @@ public:
     // will be downloaded. If more than 5 covers have been requested in an event-loop iteration, then
     // the cover requests are placed on a queue.
     Image requestImage(const Song &song, bool urgent=false);
-    void setSaveInMpdDir(bool s);
     void emitCoverUpdated(const Song &song, const QImage &img, const QString &file);
 
     #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
@@ -218,7 +226,7 @@ private:
     QSet<QString> currentImageRequests;
     QList<Song> queue;
     QSet<int> cacheSizes;
-    QCache<quint32, QPixmap> cache;
+    QCache<QString, QPixmap> cache;
     QMap<QString, QString> filenames;
     CoverDownloader *downloader;
     CoverLocator *locator;
diff --git a/gui/filesettings.cpp b/gui/filesettings.cpp
index 9f073d2..04cd139 100644
--- a/gui/filesettings.cpp
+++ b/gui/filesettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -23,7 +23,6 @@
 
 #include "filesettings.h"
 #include "settings.h"
-#include "onoffbutton.h"
 
 FileSettings::FileSettings(QWidget *p)
     : QWidget(p)
diff --git a/gui/filesettings.h b/gui/filesettings.h
index d125562..62406b5 100644
--- a/gui/filesettings.h
+++ b/gui/filesettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/gui/filesettings.ui b/gui/filesettings.ui
index e1d855d..01938f1 100644
--- a/gui/filesettings.ui
+++ b/gui/filesettings.ui
@@ -6,81 +6,50 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>442</width>
-    <height>602</height>
+    <width>569</width>
+    <height>379</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="margin">
+   <property name="leftMargin">
     <number>0</number>
    </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QCheckBox" name="storeCoversInMpdDir">
+     <property name="text">
+      <string>Save downloaded covers in music folder</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QCheckBox" name="storeLyricsInMpdDir">
+     <property name="text">
+      <string>Save downloaded lyrics in music folder</string>
+     </property>
+    </widget>
+   </item>
    <item>
-    <layout class="QFormLayout" name="formLayout">
-     <item row="0" column="0">
-      <widget class="BuddyLabel" name="storeCoversInMpdDirLabel">
-       <property name="text">
-        <string>Save downloaded covers in music folder:</string>
-       </property>
-       <property name="buddy">
-        <cstring>storeCoversInMpdDir</cstring>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="1">
-      <widget class="OnOffButton" name="storeCoversInMpdDir"/>
-     </item>
-     <item row="1" column="0">
-      <widget class="BuddyLabel" name="label_4">
-       <property name="text">
-        <string>Save downloaded lyrics in music folder:</string>
-       </property>
-       <property name="buddy">
-        <cstring>storeLyricsInMpdDir</cstring>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="1">
-      <widget class="OnOffButton" name="storeLyricsInMpdDir">
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-     <item row="2" column="0">
-      <widget class="BuddyLabel" name="storeBackdropsInMpdDirLabel">
-       <property name="text">
-        <string>Save downloaded backdrops in music folder:</string>
-       </property>
-       <property name="buddy">
-        <cstring>storeBackdropsInMpdDir</cstring>
-       </property>
-      </widget>
-     </item>
-     <item row="2" column="1">
-      <widget class="OnOffButton" name="storeBackdropsInMpdDir">
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-     <item row="3" column="0">
-      <widget class="QLabel" name="label">
-       <property name="text">
-        <string>Save list of favorite streams in music folder:</string>
-       </property>
-       <property name="buddy">
-        <cstring>storeStreamsInMpdDir</cstring>
-       </property>
-      </widget>
-     </item>
-     <item row="3" column="1">
-      <widget class="OnOffButton" name="storeStreamsInMpdDir">
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-    </layout>
+    <widget class="QCheckBox" name="storeBackdropsInMpdDir">
+     <property name="text">
+      <string>Save downloaded backdrops in music folder</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QCheckBox" name="storeStreamsInMpdDir">
+     <property name="text">
+      <string>Save list of favorite streams in music folder</string>
+     </property>
+    </widget>
    </item>
    <item>
     <spacer name="verticalSpacer">
@@ -118,6 +87,32 @@
     </widget>
    </item>
    <item>
+    <spacer name="verticalSpacer_3">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Fixed</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>8</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="QLabel" name="persNote_2">
+     <property name="text">
+      <string><i><b>NOTE:</b> Cantata can only save backdrops and artist images within the music folder hierarchy if this is 2 levels deep. (i.e. 'Artist/Album/Tracks')</i></string>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
     <spacer name="verticalSpacer_2">
      <property name="orientation">
       <enum>Qt::Vertical</enum>
@@ -156,20 +151,10 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>BuddyLabel</class>
-   <extends>QLabel</extends>
-   <header>buddylabel.h</header>
-  </customwidget>
-  <customwidget>
    <class>StateLabel</class>
    <extends>QLabel</extends>
    <header>statelabel.h</header>
   </customwidget>
-  <customwidget>
-   <class>OnOffButton</class>
-   <extends>QCheckBox</extends>
-   <header>onoffbutton.h</header>
-  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/gui/folderpage.cpp b/gui/folderpage.cpp
index bd2f5f6..34b94c6 100644
--- a/gui/folderpage.cpp
+++ b/gui/folderpage.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -40,8 +40,6 @@ FolderPage::FolderPage(QWidget *p)
     setupUi(this);
     addToPlayQueue->setDefaultAction(StdActions::self()->addToPlayQueueAction);
     replacePlayQueue->setDefaultAction(StdActions::self()->replacePlayQueueAction);
-    libraryUpdate->setDefaultAction(StdActions::self()->refreshAction);
-    searchButton->setDefaultAction(StdActions::self()->searchAction);
     #ifndef Q_OS_WIN
     browseAction = ActionCollection::get()->createAction("openfilemanager", i18n("Open In File Manager"), "system-file-manager");
     #endif
@@ -81,6 +79,10 @@ FolderPage::FolderPage(QWidget *p)
     #ifndef Q_OS_WIN
     connect(browseAction, SIGNAL(triggered(bool)), this, SLOT(openFileManager()));
     #endif
+    connect(MPDConnection::self(), SIGNAL(updatingFileList()), this, SLOT(showSpinner()));
+    connect(MPDConnection::self(), SIGNAL(updatedFileList()), this, SLOT(hideSpinner()));
+    connect(MPDConnection::self(), SIGNAL(updatingDatabase()), this, SLOT(showSpinner()));
+    connect(MPDConnection::self(), SIGNAL(updatedDatabase()), this, SLOT(hideSpinner()));
 }
 
 FolderPage::~FolderPage()
@@ -95,23 +97,22 @@ void FolderPage::setEnabled(bool e)
 
     DirViewModel::self()->setEnabled(e);
     if (e) {
-        connect(MPDConnection::self(), SIGNAL(updatingFileList()), view, SLOT(showSpinner()));
-        connect(MPDConnection::self(), SIGNAL(updatedFileList()), view, SLOT(hideSpinner()));
         refresh();
     } else {
         loaded=false;
-        disconnect(MPDConnection::self(), SIGNAL(updatingFileList()), view, SLOT(showSpinner()));
-        disconnect(MPDConnection::self(), SIGNAL(updatedFileList()), view, SLOT(hideSpinner()));
     }
 }
 
 void FolderPage::refresh()
 {
-    if (DirViewModel::self()->isEnabled() && isVisible()) {
-        view->setLevel(0);
-        view->showSpinner();
-        emit loadFolders();
-        loaded=true;
+    view->goToTop();
+    if (DirViewModel::self()->isEnabled()) {
+        if (!isVisible()) {
+            loaded=false; // Refresh called for, but we are not currently visible...
+        } else if (!DirViewModel::self()->fromXML()) {
+            emit loadFolders();
+            loaded=true;
+        }
     }
 }
 
@@ -125,7 +126,9 @@ void FolderPage::showEvent(QShowEvent *e)
     view->focusView();
     QWidget::showEvent(e);
     if (!loaded) {
-        emit loadFolders();
+        if (!DirViewModel::self()->fromXML()) {
+            emit loadFolders();
+        }
         loaded=true;
     }
 }
@@ -233,8 +236,9 @@ QStringList FolderPage::selectedFiles(bool allowPlaylists) const
     return DirViewModel::self()->filenames(mapped, allowPlaylists);
 }
 
-void FolderPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty)
+void FolderPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty, bool randomAlbums)
 {
+    Q_UNUSED(randomAlbums)
     QStringList files=selectedFiles(name.isEmpty());
 
     if (!files.isEmpty()) {
@@ -294,3 +298,15 @@ QStringList FolderPage::walk(QModelIndex rootItem)
     }
     return files;
 }
+
+void FolderPage::showSpinner()
+{
+    view->showSpinner();
+    view->showMessage(i18n("Updating..."), -1);
+}
+
+void FolderPage::hideSpinner()
+{
+    view->hideSpinner();
+    view->showMessage(QString(), 0);
+}
diff --git a/gui/folderpage.h b/gui/folderpage.h
index 86c2afd..b2ab96e 100644
--- a/gui/folderpage.h
+++ b/gui/folderpage.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -27,11 +27,11 @@
 #include "ui_folderpage.h"
 #include "dirviewmodel.h"
 #include "dirviewproxymodel.h"
-#include "config.h"
+#include "page.h"
 
 class Action;
 
-class FolderPage : public QWidget, public Ui::FolderPage
+class FolderPage : public QWidget, public Ui::FolderPage, public Page
 {
     Q_OBJECT
 public:
@@ -51,14 +51,14 @@ public:
     void clear();
     QStringList selectedFiles(bool allowPlaylists=false) const;
     QList<Song> selectedSongs(EmptySongMod esMod, bool allowPlaylists=false) const;
-    void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0);
+    QList<Song> selectedSongs(bool allowPlaylists=false) const { return selectedSongs(ES_None, allowPlaylists); }
+    void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0, bool randomAlbums=false);
     #ifdef ENABLE_DEVICES_SUPPORT
     void addSelectionToDevice(const QString &udi);
     void deleteSongs();
     #endif
     void setView(int v) { view->setMode((ItemView::Mode)v); }
     void focusSearch() { view->focusSearch(); }
-    void goBack() { view->backActivated(); }
     void showEvent(QShowEvent *e);
 
 Q_SIGNALS:
@@ -75,6 +75,8 @@ public Q_SLOTS:
     void controlActions();
     void itemDoubleClicked(const QModelIndex &);
     void openFileManager();
+    void showSpinner();
+    void hideSpinner();
 
 private:
     QStringList walk(QModelIndex rootItem);
diff --git a/gui/folderpage.ui b/gui/folderpage.ui
index a427139..6a60437 100644
--- a/gui/folderpage.ui
+++ b/gui/folderpage.ui
@@ -47,12 +47,6 @@
       <number>0</number>
      </property>
      <item>
-      <widget class="ToolButton" name="libraryUpdate"/>
-     </item>
-     <item>
-      <widget class="ToolButton" name="searchButton"/>
-     </item>
-     <item>
       <spacer name="horizontalSpacer_2">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
diff --git a/gui/initialsettingswizard.cpp b/gui/initialsettingswizard.cpp
index d500080..6443faa 100644
--- a/gui/initialsettingswizard.cpp
+++ b/gui/initialsettingswizard.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -108,6 +108,8 @@ InitialSettingsWizard::InitialSettingsWizard(QWidget *p)
         sz+=QSize(sz.height()*(highDpi ? 0.4 : 0.25), -(sz.height()*(highDpi ? 0.1 : 0.25)));
     }
     resize(sz);
+    setMinimumSize(sz);
+    httpNote->setOn(true);
 }
 
 InitialSettingsWizard::~InitialSettingsWizard()
@@ -173,8 +175,13 @@ void InitialSettingsWizard::pageChanged(int p)
             storeCoversInMpdDir->setChecked(false);
             storeLyricsInMpdDir->setChecked(false);
             storeStreamsInMpdDir->setChecked(false);
+            storeBackdropsInMpdDir->setChecked(false);
             httpNote->setVisible(true);
         } else {
+            storeCoversInMpdDir->setChecked(Settings::self()->storeCoversInMpdDir());
+            storeLyricsInMpdDir->setChecked(Settings::self()->storeLyricsInMpdDir());
+            storeStreamsInMpdDir->setChecked(Settings::self()->storeStreamsInMpdDir());
+            storeBackdropsInMpdDir->setChecked(Settings::self()->storeBackdropsInMpdDir());
             httpNote->setVisible(false);
         }
     }
diff --git a/gui/initialsettingswizard.h b/gui/initialsettingswizard.h
index 031d5b9..a4214dc 100644
--- a/gui/initialsettingswizard.h
+++ b/gui/initialsettingswizard.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/gui/initialsettingswizard.ui b/gui/initialsettingswizard.ui
index 6a78880..1eabd99 100644
--- a/gui/initialsettingswizard.ui
+++ b/gui/initialsettingswizard.ui
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>698</width>
+    <width>668</width>
     <height>607</height>
    </rect>
   </property>
@@ -390,7 +390,7 @@
            </widget>
           </item>
           <item row="1" column="1">
-           <widget class="SpinBox" name="port">
+           <widget class="QSpinBox" name="port">
             <property name="minimum">
              <number>1</number>
             </property>
@@ -491,7 +491,7 @@
         <item>
          <widget class="QLabel" name="musicFolderNoteLabel">
           <property name="text">
-           <string><i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, lyrics, etc.</i></string>
+           <string><i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, lyrics, etc. If you're MPD instance is on a remote host, you may set this to a HTTP URL.</i></string>
           </property>
           <property name="wordWrap">
            <bool>true</bool>
@@ -649,8 +649,8 @@
    </layout>
   </widget>
   <widget class="WizardPage" name="filesPage">
-   <layout class="QGridLayout" name="gridLayoutf">
-    <item row="0" column="0">
+   <layout class="QVBoxLayout" name="verticalLayout_2">
+    <item>
      <widget class="QLabel" name="label_6f">
       <property name="font">
        <font>
@@ -663,7 +663,7 @@
       </property>
      </widget>
     </item>
-    <item row="1" column="1">
+    <item>
      <spacer name="verticalSpacer_9f">
       <property name="orientation">
        <enum>Qt::Vertical</enum>
@@ -679,7 +679,7 @@
       </property>
      </spacer>
     </item>
-    <item row="2" column="0" colspan="2">
+    <item>
      <widget class="QLabel" name="label_5f">
       <property name="text">
        <string><p>Cantata will download missing covers, and lyrics, from the internet. Cantata also allows you to save a list of internet streams (e.g. Radio Stations) that you wish to be able to play.</p><p>For each of these, please confirm whether you wish Cantata to store the relevant files within the music folder, or within your personal cache/config folders.</p></string>
@@ -692,7 +692,7 @@
       </property>
      </widget>
     </item>
-    <item row="3" column="0">
+    <item>
      <spacer name="verticalSpacer_7x">
       <property name="orientation">
        <enum>Qt::Vertical</enum>
@@ -708,101 +708,87 @@
       </property>
      </spacer>
     </item>
-    <item row="4" column="0" colspan="2">
-     <layout class="QFormLayout" name="filesFormLayout">
-      <item row="0" column="0">
-       <widget class="BuddyLabel" name="storeCoversInMpdDirLabel">
-        <property name="text">
-         <string>Save downloaded covers in music folder:</string>
-        </property>
-        <property name="buddy">
-         <cstring>storeCoversInMpdDir</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="OnOffButton" name="storeCoversInMpdDir" native="true"/>
-      </item>
-      <item row="1" column="0">
-       <widget class="BuddyLabel" name="storeLyricsInMpdDirLabel">
-        <property name="text">
-         <string>Save downloaded lyrics in music folder:</string>
-        </property>
-        <property name="buddy">
-         <cstring>storeLyricsInMpdDir</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="OnOffButton" name="storeLyricsInMpdDir" native="true">
-        <property name="text" stdset="0">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="0">
-       <widget class="BuddyLabel" name="storeBackdropsInMpdDirLabel">
-        <property name="text">
-         <string>Save downloaded backdrops in music folder:</string>
-        </property>
-        <property name="buddy">
-         <cstring>storeBackdropsInMpdDir</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="OnOffButton" name="storeBackdropsInMpdDir">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="0">
-       <widget class="QLabel" name="storeStreamsInMpdDirLabel">
-        <property name="text">
-         <string>Save list of favorite streams in music folder:</string>
-        </property>
-        <property name="buddy">
-         <cstring>storeStreamsInMpdDir</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1">
-       <widget class="OnOffButton" name="storeStreamsInMpdDir" native="true">
-        <property name="text" stdset="0">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="0">
-       <spacer name="verticalSpacer_5x">
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="sizeType">
-         <enum>QSizePolicy::Fixed</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>20</width>
-          <height>13</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="5" column="0" colspan="2">
-       <widget class="QLabel" name="persNote">
-        <property name="text">
-         <string><i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within the music folder, and you do not have write access to this folder, then Cantata will revert to saving the files in your personal cache folder. However, for streams, if you do not have write access, then you will only be able to view (and play) the streams stored in the music folder, and not add (or edit) any streams. If you elect not to store streams within the music folder, then these will be saved in your local config folder - and will only be accessible to yourself.</i></string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
+    <item>
+     <widget class="QCheckBox" name="storeCoversInMpdDir">
+      <property name="text">
+       <string>Save downloaded covers in music folder</string>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <widget class="QCheckBox" name="storeLyricsInMpdDir">
+      <property name="text">
+       <string>Save downloaded lyrics in music folder</string>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <widget class="QCheckBox" name="storeBackdropsInMpdDir">
+      <property name="text">
+       <string>Save downloaded backdrops in music folder</string>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <widget class="QCheckBox" name="storeStreamsInMpdDir">
+      <property name="text">
+       <string>Save list of favorite streams in music folder</string>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <spacer name="verticalSpacer_5x">
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+      <property name="sizeType">
+       <enum>QSizePolicy::Fixed</enum>
+      </property>
+      <property name="sizeHint" stdset="0">
+       <size>
+        <width>20</width>
+        <height>8</height>
+       </size>
+      </property>
+     </spacer>
+    </item>
+    <item>
+     <widget class="QLabel" name="persNote">
+      <property name="text">
+       <string><i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within the music folder, and you do not have write access to this folder, then Cantata will revert to saving the files in your personal cache folder. However, for streams, if you do not have write access, then you will only be able to view (and play) the streams stored in the music folder, and not add (or edit) any streams. If you elect not to store streams within the music folder, then these will be saved in your local config folder - and will only be accessible to yourself.</i></string>
+      </property>
+      <property name="wordWrap">
+       <bool>true</bool>
+      </property>
+     </widget>
     </item>
-    <item row="5" column="0">
+    <item>
+     <spacer name="verticalSpacer_7f2_2">
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+      <property name="sizeType">
+       <enum>QSizePolicy::Fixed</enum>
+      </property>
+      <property name="sizeHint" stdset="0">
+       <size>
+        <width>20</width>
+        <height>8</height>
+       </size>
+      </property>
+     </spacer>
+    </item>
+    <item>
+     <widget class="QLabel" name="persNote_2">
+      <property name="text">
+       <string><i><b>NOTE:</b> Cantata can only save backdrops and artist images within the music folder hierarchy if this is 2 levels deep. i.e. 'Artist/Album/Tracks'.</i></string>
+      </property>
+      <property name="wordWrap">
+       <bool>true</bool>
+      </property>
+     </widget>
+    </item>
+    <item>
      <spacer name="verticalSpacer_7f2">
       <property name="orientation">
        <enum>Qt::Vertical</enum>
@@ -818,17 +804,17 @@
       </property>
      </spacer>
     </item>
-    <item row="6" column="0" colspan="2">
-     <widget class="QLabel" name="httpNote">
+    <item>
+     <widget class="StateLabel" name="httpNote">
       <property name="text">
-       <string><i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata currently cannot upload files to external HTTP servers. Therefore, the above settings should be left disabled.</i></string>
+       <string><i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata currently cannot upload files to external HTTP servers. Therefore, the above settings should be left un-checked.</i></string>
       </property>
       <property name="wordWrap">
        <bool>true</bool>
       </property>
      </widget>
     </item>
-    <item row="7" column="0" colspan="2">
+    <item>
      <spacer name="verticalSpacer_8f">
       <property name="orientation">
        <enum>Qt::Vertical</enum>
@@ -945,11 +931,6 @@
    <header>buddylabel.h</header>
   </customwidget>
   <customwidget>
-   <class>SpinBox</class>
-   <extends>QSpinBox</extends>
-   <header>spinbox.h</header>
-  </customwidget>
-  <customwidget>
    <class>LineEdit</class>
    <extends>QLineEdit</extends>
    <header>lineedit.h</header>
@@ -967,9 +948,9 @@
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>OnOffButton</class>
-   <extends>QCheckBox</extends>
-   <header>onoffbutton.h</header>
+   <class>StateLabel</class>
+   <extends>QLabel</extends>
+   <header>statelabel.h</header>
   </customwidget>
  </customwidgets>
  <resources/>
diff --git a/gui/interfacesettings.cpp b/gui/interfacesettings.cpp
index d286d2c..ce23675 100644
--- a/gui/interfacesettings.cpp
+++ b/gui/interfacesettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,8 +26,17 @@
 #include "itemview.h"
 #include "localize.h"
 #include "musiclibraryitemalbum.h"
-#include "onoffbutton.h"
+#include "fancytabwidget.h"
+#include "basicitemdelegate.h"
+#include "playqueueview.h"
+#include "pathrequester.h"
 #include <QComboBox>
+#ifndef ENABLE_KDE_SUPPORT
+#include <QDir>
+#include <QMap>
+#include <QRegExp>
+#include <QSet>
+#endif
 
 #define REMOVE(w) \
     w->setVisible(false); \
@@ -43,8 +52,9 @@ static void addImageSizes(QComboBox *box)
     box->addItem(i18n("Extra Large"), MusicLibraryItemAlbum::CoverExtraLarge);
 }
 
-static void addViewTypes(QComboBox *box, bool iconMode=false, bool groupedTree=false)
+static void addViewTypes(QComboBox *box, bool iconMode=false, bool groupedTree=false, bool table=false)
 {
+    box->addItem(i18n("Basic Tree (No Icons)"), ItemView::Mode_BasicTree);
     box->addItem(i18n("Simple Tree"), ItemView::Mode_SimpleTree);
     box->addItem(i18n("Detailed Tree"), ItemView::Mode_DetailedTree);
     if (groupedTree) {
@@ -54,6 +64,9 @@ static void addViewTypes(QComboBox *box, bool iconMode=false, bool groupedTree=f
     if (iconMode) {
         box->addItem(i18n("Icon/List"), ItemView::Mode_IconTop);
     }
+    if (table) {
+        box->addItem(i18n("Table"), ItemView::Mode_Table);
+    }
 }
 
 static void selectEntry(QComboBox *box, int v)
@@ -66,257 +79,361 @@ static void selectEntry(QComboBox *box, int v)
     }
 }
 
-static inline int getViewType(QComboBox *box)
+static inline int getValue(QComboBox *box)
 {
     return box->itemData(box->currentIndex()).toInt();
 }
 
-InterfaceSettings::InterfaceSettings(QWidget *p, const QStringList &hiddenPages)
+static const int constPlayQueueGrouped=0;
+static const char * constValueProperty="value";
+
+InterfaceSettings::InterfaceSettings(QWidget *p)
     : QWidget(p)
+    #ifndef ENABLE_KDE_SUPPORT
+    , loadedLangs(false)
+    #endif
 {
-    int removeCount=0;
-    enabledViews=V_All;
-    if (hiddenPages.contains(QLatin1String("LibraryPage"))) {
-        enabledViews-=V_Artists;
-    }
-    if (hiddenPages.contains(QLatin1String("AlbumsPage"))) {
-        enabledViews-=V_Albums;
-    }
-    if (hiddenPages.contains(QLatin1String("FolderPage"))) {
-        enabledViews-=V_Folders;
-    }
-    if (hiddenPages.contains(QLatin1String("PlaylistsPage"))) {
-        enabledViews-=V_Playlists;
-    }
-//    if (hiddenPages.contains(QLatin1String("DynamicPage"))) {
-//        enabledViews-=V_Dynamic;
-//    }
-    if (hiddenPages.contains(QLatin1String("StreamsPage"))) {
-        enabledViews-=V_Streams;
-    }
-    if (hiddenPages.contains(QLatin1String("OnlineServicesPage"))) {
-        enabledViews-=V_Online;
-    }
-    #ifdef ENABLE_DEVICES_SUPPORT
-    if (hiddenPages.contains(QLatin1String("DevicesPage"))) {
-        enabledViews-=V_Devices;
-    }
+    setupUi(this);
+    addImageSizes(libraryCoverSize);
+    addViewTypes(libraryView, true);
+    addImageSizes(albumsCoverSize);
+    addViewTypes(albumsView, true);
+    addViewTypes(folderView);
+    addViewTypes(playlistsView, false, true, true);
+
+    addView(i18n("Play queue"), QLatin1String("PlayQueuePage"));
+    addView(i18n("Artists"), QLatin1String("LibraryPage"));
+    addView(i18n("Albums"), QLatin1String("AlbumsPage"));
+    addView(i18n("Folders"), QLatin1String("FolderPage"));
+    addView(i18n("Playlists"), QLatin1String("PlaylistsPage"));
+    #ifdef ENABLE_DYNAMIC
+    addView(i18n("Dynamic Playlists"), QLatin1String("DynamicPage"));
+    #endif
+    #ifdef ENABLE_STREAMS
+    addViewTypes(streamsView);
+    addView(i18n("Streams (e.g. Radio Stations)"), QLatin1String("StreamsPage"));
     #else
-    enabledViews-=V_Devices;
+    REMOVE(streamsView)
+    REMOVE(streamsViewLabel)
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
+    addViewTypes(onlineView);
+    addView(i18n("Online Services - Jamendo, Maganatune, SoundCloud, and Podcasts"), QLatin1String("OnlineServicesPage"));
+    #else
+    REMOVE(onlineView)
+    REMOVE(onlineViewLabel)
     #endif
-
-    setupUi(this);
-    if (enabledViews&V_Artists) {
-        addImageSizes(libraryCoverSize);
-        addViewTypes(libraryView, true);
-    } else {
-        tabWidget->removeTab(0);
-        removeCount++;
-    }
-    if (enabledViews&V_Albums) {
-        addImageSizes(albumsCoverSize);
-        addViewTypes(albumsView, true);
-    } else {
-        tabWidget->removeTab(1-removeCount);
-        removeCount++;
-    }
-    if (enabledViews&V_Folders) {
-        addViewTypes(folderView);
-    }  else {
-        REMOVE(folderView)
-        REMOVE(folderViewLabel)
-    }
-    if (enabledViews&V_Playlists) {
-        addViewTypes(playlistsView, false, true);
-    } else {
-        tabWidget->removeTab(2-removeCount);
-        removeCount++;
-    }
-    if (enabledViews&V_Streams) {
-        addViewTypes(streamsView);
-    } else {
-        REMOVE(streamsView)
-        REMOVE(streamsViewLabel)
-    }
-    if (enabledViews&V_Online) {
-        addViewTypes(onlineView);
-    } else {
-        REMOVE(onlineView)
-        REMOVE(onlineViewLabel)
-    }
     #ifdef ENABLE_DEVICES_SUPPORT
-    if (enabledViews&V_Devices) {
-        addViewTypes(devicesView);
-    }
+    addViewTypes(devicesView);
+    addView(i18n("Devices - UMS, MTP (e.g. Android), and AudioCDs"), QLatin1String("DevicesPage"));
+    #else
+    REMOVE(devicesView)
+    REMOVE(devicesViewLabel)
+    REMOVE(showDeleteAction)
     #endif
-    if (!(enabledViews&V_Devices)) {
-        REMOVE(devicesView)
-        REMOVE(devicesViewLabel)
-    }
+    addView(i18n("Search (via MPD)"), QLatin1String("SearchPage"));
+    addView(i18n("Info - Current song information (artist, album, and lyrics)"), QLatin1String("ContextPage"));
 
-    int otherViewCount=(enabledViews&V_Folders ? 1 : 0)+(enabledViews&V_Streams ? 1 : 0)+(enabledViews&V_Online ? 1 : 0)+(enabledViews&V_Devices ? 1 : 0);
-
-    if (0==otherViewCount) {
-        tabWidget->removeTab(3-removeCount);
-        removeCount++;
-    } else if (1==otherViewCount) {
-        if (enabledViews&V_Folders) {
-            tabWidget->setTabText(3-removeCount, i18n("Folders"));
-            folderViewLabel->setText(i18n("Style:"));
-        } else if (enabledViews&V_Streams) {
-            tabWidget->setTabText(3-removeCount, i18n("Streams"));
-            streamsViewLabel->setText(i18n("Style:"));
-        } else if (enabledViews&V_Online) {
-            tabWidget->setTabText(3-removeCount, i18n("Online"));
-            onlineViewLabel->setText(i18n("Style:"));
-        } else if (enabledViews&V_Devices) {
-            tabWidget->setTabText(3-removeCount, i18n("Devices"));
-            devicesViewLabel->setText(i18n("Style:"));
-        }
-    }
+    #if !defined ENABLE_STREAMS && !defined ENABLE_ONLINE_SERVICES && !defined ENABLE_DEVICES_SUPPORT
+    tabWidget->setTabText(4, i18n("Folders"));
+    folderViewLabel->setText(i18n("Style:"));
+    #endif
 
-    groupMultiple->addItem(i18n("Grouped by \'Album Artist\'"));
-    groupMultiple->addItem(i18n("Grouped under \'Various Artists\'"));
-    if (enabledViews&V_Artists) {
-        connect(libraryView, SIGNAL(currentIndexChanged(int)), SLOT(libraryViewChanged()));
-        connect(libraryCoverSize, SIGNAL(currentIndexChanged(int)), SLOT(libraryCoverSizeChanged()));
-    }
-    if (enabledViews&V_Albums) {
-        connect(albumsView, SIGNAL(currentIndexChanged(int)), SLOT(albumsViewChanged()));
-        connect(albumsCoverSize, SIGNAL(currentIndexChanged(int)), SLOT(albumsCoverSizeChanged()));
-    }
-    if (enabledViews&V_Playlists) {
-        connect(playlistsView, SIGNAL(currentIndexChanged(int)), SLOT(playListsStyleChanged()));
-    }
+    connect(libraryView, SIGNAL(currentIndexChanged(int)), SLOT(libraryViewChanged()));
+    connect(libraryCoverSize, SIGNAL(currentIndexChanged(int)), SLOT(libraryCoverSizeChanged()));
+    connect(albumsView, SIGNAL(currentIndexChanged(int)), SLOT(albumsViewChanged()));
+    connect(albumsCoverSize, SIGNAL(currentIndexChanged(int)), SLOT(albumsCoverSizeChanged()));
+    connect(playlistsView, SIGNAL(currentIndexChanged(int)), SLOT(playlistsViewChanged()));
     connect(playQueueGrouped, SIGNAL(currentIndexChanged(int)), SLOT(playQueueGroupedChanged()));
-    #ifndef ENABLE_DEVICES_SUPPORT
-    REMOVE(showDeleteAction);
-    REMOVE(showDeleteActionLabel);
-    #endif
     connect(systemTrayCheckBox, SIGNAL(toggled(bool)), minimiseOnClose, SLOT(setEnabled(bool)));
-    connect(systemTrayCheckBox, SIGNAL(toggled(bool)), minimiseOnCloseLabel, SLOT(setEnabled(bool)));
+    connect(systemTrayCheckBox, SIGNAL(toggled(bool)), SLOT(enableStartupState()));
+    connect(minimiseOnClose, SIGNAL(toggled(bool)), SLOT(enableStartupState()));
     connect(forceSingleClick, SIGNAL(toggled(bool)), SLOT(forceSingleClickChanged()));
+    connect(views, SIGNAL(itemChanged(QListWidgetItem*)), SLOT(viewItemChanged(QListWidgetItem*)));
+
+    #ifdef ENABLE_KDE_SUPPORT
+    REMOVE(lang)
+    REMOVE(langLabel)
+    REMOVE(langNoteLabel)
+    #endif
+
+    sbStyle->addItem(i18n("Large"), FancyTabWidget::Large);
+    sbStyle->addItem(i18n("Small"), FancyTabWidget::Small);
+    sbStyle->addItem(i18n("Tab-bar"), FancyTabWidget::Tab);
+    sbPosition->addItem(Qt::LeftToRight==layoutDirection() ? i18n("Left") : i18n("Right"), FancyTabWidget::Side);
+    sbPosition->addItem(i18n("Top"), FancyTabWidget::Top);
+    sbPosition->addItem(i18n("Bottom"), FancyTabWidget::Bot);
+    connect(sbAutoHide, SIGNAL(toggled(bool)), SLOT(sbAutoHideChanged()));
+    views->setItemDelegate(new BasicItemDelegate(views));
+    playQueueBackground_none->setProperty(constValueProperty, PlayQueueView::BI_None);
+    playQueueBackground_cover->setProperty(constValueProperty, PlayQueueView::BI_Cover);
+    playQueueBackground_custom->setProperty(constValueProperty, PlayQueueView::BI_Custom);
+    playQueueBackgroundFile->setDirMode(false);
+    #ifdef ENABLE_KDE_SUPPORT
+    playQueueBackgroundFile->setFilter("image/jpeg image/png");
+    #else
+    playQueueBackgroundFile->setFilter(i18n("Images (*.png *.jpg)"));
+    #endif
+    int labelWidth=qMax(fontMetrics().width(QLatin1String("100%")), fontMetrics().width(i18nc("pixels", "10px")));
+    playQueueBackgroundOpacityLabel->setFixedWidth(labelWidth);
+    playQueueBackgroundBlurLabel->setFixedWidth(labelWidth);
+    connect(playQueueBackgroundOpacity, SIGNAL(valueChanged(int)), SLOT(setPlayQueueBackgroundOpacityLabel()));
+    connect(playQueueBackgroundBlur, SIGNAL(valueChanged(int)), SLOT(setPlayQueueBackgroundBlurLabel()));
+    connect(playQueueBackground_none, SIGNAL(toggled(bool)), SLOT(enablePlayQueueBackgroundOptions()));
+    connect(playQueueBackground_cover, SIGNAL(toggled(bool)), SLOT(enablePlayQueueBackgroundOptions()));
+    connect(playQueueBackground_custom, SIGNAL(toggled(bool)), SLOT(enablePlayQueueBackgroundOptions()));
 }
 
 void InterfaceSettings::load()
 {
-    if (enabledViews&V_Artists) {
-        libraryArtistImage->setChecked(Settings::self()->libraryArtistImage());
-        selectEntry(libraryView, Settings::self()->libraryView());
-        libraryCoverSize->setCurrentIndex(Settings::self()->libraryCoverSize());
-        libraryYear->setChecked(Settings::self()->libraryYear());
-    }
-    if (enabledViews&V_Albums) {
-        selectEntry(albumsView, Settings::self()->albumsView());
-        albumsCoverSize->setCurrentIndex(Settings::self()->albumsCoverSize());
-        albumSort->setCurrentIndex(Settings::self()->albumSort());
-    }
-    if (enabledViews&V_Folders) {
-        selectEntry(folderView, Settings::self()->folderView());
-    }
-    if (enabledViews&V_Playlists) {
-        selectEntry(playlistsView, Settings::self()->playlistsView());
-        playListsStartClosed->setChecked(Settings::self()->playListsStartClosed());
-    }
-    if (enabledViews&V_Streams) {
-        selectEntry(streamsView, Settings::self()->streamsView());
-    }
-    if (enabledViews&V_Online) {
-        selectEntry(onlineView, Settings::self()->onlineView());
-    }
+    libraryArtistImage->setChecked(Settings::self()->libraryArtistImage());
+    selectEntry(libraryView, Settings::self()->libraryView());
+    libraryCoverSize->setCurrentIndex(Settings::self()->libraryCoverSize());
+    libraryYear->setChecked(Settings::self()->libraryYear());
+    selectEntry(albumsView, Settings::self()->albumsView());
+    albumsCoverSize->setCurrentIndex(Settings::self()->albumsCoverSize());
+    albumSort->setCurrentIndex(Settings::self()->albumSort());
+    selectEntry(folderView, Settings::self()->folderView());
+    selectEntry(playlistsView, Settings::self()->playlistsView());
+    playListsStartClosed->setChecked(Settings::self()->playListsStartClosed());
+    #ifdef ENABLE_STREAMS
+    selectEntry(streamsView, Settings::self()->streamsView());
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
+    selectEntry(onlineView, Settings::self()->onlineView());
+    #endif
     groupSingle->setChecked(Settings::self()->groupSingle());
     useComposer->setChecked(Settings::self()->useComposer());
-    groupMultiple->setCurrentIndex(Settings::self()->groupMultiple() ? 1 : 0);
+    groupMultiple->setChecked(Settings::self()->groupMultiple());
     #ifdef ENABLE_DEVICES_SUPPORT
-    if (showDeleteAction) {
-        showDeleteAction->setChecked(Settings::self()->showDeleteAction());
-    }
-    if (devicesView) {
-        selectEntry(devicesView, Settings::self()->devicesView());
-    }
+    showDeleteAction->setChecked(Settings::self()->showDeleteAction());
+    selectEntry(devicesView, Settings::self()->devicesView());
     #endif
-    playQueueGrouped->setCurrentIndex(Settings::self()->playQueueGrouped() ? 1 : 0);
+    playQueueGrouped->setCurrentIndex(Settings::self()->playQueueGrouped() ? 0 : 1);
     playQueueAutoExpand->setChecked(Settings::self()->playQueueAutoExpand());
     playQueueStartClosed->setChecked(Settings::self()->playQueueStartClosed());
     playQueueScroll->setChecked(Settings::self()->playQueueScroll());
-    playQueueBackground->setChecked(Settings::self()->playQueueBackground());
+
+    int pqBgnd=Settings::self()->playQueueBackground();
+    playQueueBackground_none->setChecked(pqBgnd==playQueueBackground_none->property(constValueProperty).toInt());
+    playQueueBackground_cover->setChecked(pqBgnd==playQueueBackground_cover->property(constValueProperty).toInt());
+    playQueueBackground_custom->setChecked(pqBgnd==playQueueBackground_custom->property(constValueProperty).toInt());
+    playQueueBackgroundOpacity->setValue(Settings::self()->playQueueBackgroundOpacity());
+    playQueueBackgroundBlur->setValue(Settings::self()->playQueueBackgroundBlur());
+    playQueueBackgroundFile->setText(Settings::self()->playQueueBackgroundFile());
+
     playQueueConfirmClear->setChecked(Settings::self()->playQueueConfirmClear());
-    if (enabledViews&V_Albums) {
-        albumsViewChanged();
-        albumsCoverSizeChanged();
-    }
-    if (enabledViews&V_Playlists) {
-        playListsStyleChanged();
-    }
+    albumsViewChanged();
+    albumsCoverSizeChanged();
+    playlistsViewChanged();
     playQueueGroupedChanged();
     forceSingleClick->setChecked(Settings::self()->forceSingleClick());
     systemTrayCheckBox->setChecked(Settings::self()->useSystemTray());
     systemTrayPopup->setChecked(Settings::self()->showPopups());
     minimiseOnClose->setChecked(Settings::self()->minimiseOnClose());
     minimiseOnClose->setEnabled(systemTrayCheckBox->isChecked());
-    minimiseOnCloseLabel->setEnabled(systemTrayCheckBox->isChecked());
+    switch (Settings::self()->startupState()) {
+    case Settings::SS_ShowMainWindow: startupStateShow->setChecked(true); break;
+    case Settings::SS_HideMainWindow: startupStateHide->setChecked(true); break;
+    case Settings::SS_Previous: startupStateRestore->setChecked(true); break;
+    }
+
+    enableStartupState();
+    cacheScaledCovers->setChecked(Settings::self()->cacheScaledCovers());
+    fetchCovers->setChecked(Settings::self()->fetchCovers());
+
+    QStringList hiddenPages=Settings::self()->hiddenPages();
+    for (int i=0; i<views->count(); ++i) {
+        QListWidgetItem *v=views->item(i);
+        v->setCheckState(hiddenPages.contains(v->data(Qt::UserRole).toString()) ? Qt::Unchecked : Qt::Checked);
+    }
+    int sidebar=Settings::self()->sidebar();
+    selectEntry(sbStyle, sidebar&FancyTabWidget::Style_Mask);
+    selectEntry(sbPosition, sidebar&FancyTabWidget::Position_Mask);
+    sbIconsOnly->setChecked(sidebar&FancyTabWidget::IconOnly);
+    sbMonoIcons->setChecked(Settings::self()->monoSidebarIcons());
+    sbAutoHide->setChecked(Settings::self()->splitterAutoHide());
+    sbAutoHideChanged();
+    viewItemChanged(views->item(0));
+    setPlayQueueBackgroundOpacityLabel();
+    setPlayQueueBackgroundBlurLabel();
+    enablePlayQueueBackgroundOptions();
+    libraryViewChanged();
 }
 
 void InterfaceSettings::save()
 {
-    if (enabledViews&V_Artists) {
-        Settings::self()->saveLibraryArtistImage(libraryArtistImage->isChecked());
-        Settings::self()->saveLibraryView(getViewType(libraryView));
-        Settings::self()->saveLibraryCoverSize(libraryCoverSize->currentIndex());
-        Settings::self()->saveLibraryYear(libraryYear->isChecked());
-    }
-    if (enabledViews&V_Albums) {
-        Settings::self()->saveAlbumsView(getViewType(albumsView));
-        Settings::self()->saveAlbumsCoverSize(albumsCoverSize->currentIndex());
-        Settings::self()->saveAlbumSort(albumSort->currentIndex());
-    }
-    if (enabledViews&V_Folders) {
-        Settings::self()->saveFolderView(getViewType(folderView));
-    }
-    if (enabledViews&V_Playlists) {
-        Settings::self()->savePlaylistsView(getViewType(playlistsView));
-        Settings::self()->savePlayListsStartClosed(playListsStartClosed->isChecked());
-    }
-    if (enabledViews&V_Streams) {
-        Settings::self()->saveStreamsView(getViewType(streamsView));
-    }
-    if (enabledViews&V_Online) {
-        Settings::self()->saveOnlineView(getViewType(onlineView));
-    }
+    Settings::self()->saveLibraryArtistImage(libraryArtistImage->isChecked());
+    Settings::self()->saveLibraryView(getValue(libraryView));
+    Settings::self()->saveLibraryCoverSize(libraryCoverSize->currentIndex());
+    Settings::self()->saveLibraryYear(libraryYear->isChecked());
+    Settings::self()->saveAlbumsView(getValue(albumsView));
+    Settings::self()->saveAlbumsCoverSize(albumsCoverSize->currentIndex());
+    Settings::self()->saveAlbumSort(albumSort->currentIndex());
+    Settings::self()->saveFolderView(getValue(folderView));
+    Settings::self()->savePlaylistsView(getValue(playlistsView));
+    Settings::self()->savePlayListsStartClosed(playListsStartClosed->isChecked());
+    #ifdef ENABLE_STREAMS
+    Settings::self()->saveStreamsView(getValue(streamsView));
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
+    Settings::self()->saveOnlineView(getValue(onlineView));
+    #endif
     Settings::self()->saveGroupSingle(groupSingle->isChecked());
     Settings::self()->saveUseComposer(useComposer->isChecked());
-    Settings::self()->saveGroupMultiple(1==groupMultiple->currentIndex());
+    Settings::self()->saveGroupMultiple(groupMultiple->isChecked());
     #ifdef ENABLE_DEVICES_SUPPORT
-    if (showDeleteAction) {
-        Settings::self()->saveShowDeleteAction(showDeleteAction->isChecked());
-    }
-    if (enabledViews&V_Devices) {
-        Settings::self()->saveDevicesView(getViewType(devicesView));
-    }
+    Settings::self()->saveShowDeleteAction(showDeleteAction->isChecked());
+    Settings::self()->saveDevicesView(getValue(devicesView));
     #endif
-    Settings::self()->savePlayQueueGrouped(1==playQueueGrouped->currentIndex());
+    Settings::self()->savePlayQueueGrouped(constPlayQueueGrouped==playQueueGrouped->currentIndex());
     Settings::self()->savePlayQueueAutoExpand(playQueueAutoExpand->isChecked());
     Settings::self()->savePlayQueueStartClosed(playQueueStartClosed->isChecked());
     Settings::self()->savePlayQueueScroll(playQueueScroll->isChecked());
-    Settings::self()->savePlayQueueBackground(playQueueBackground->isChecked());
+
+    if (playQueueBackground_none->isChecked()) {
+        Settings::self()->savePlayQueueBackground(playQueueBackground_none->property(constValueProperty).toInt());
+    } else if (playQueueBackground_cover->isChecked()) {
+        Settings::self()->savePlayQueueBackground(playQueueBackground_cover->property(constValueProperty).toInt());
+    } else if (playQueueBackground_custom->isChecked()) {
+        Settings::self()->savePlayQueueBackground(playQueueBackground_custom->property(constValueProperty).toInt());
+    }
+    Settings::self()->savePlayQueueBackgroundOpacity(playQueueBackgroundOpacity->value());
+    Settings::self()->savePlayQueueBackgroundBlur(playQueueBackgroundBlur->value());
+    Settings::self()->savePlayQueueBackgroundFile(playQueueBackgroundFile->text().trimmed());
+
     Settings::self()->savePlayQueueConfirmClear(playQueueConfirmClear->isChecked());
     Settings::self()->saveForceSingleClick(forceSingleClick->isChecked());
     Settings::self()->saveUseSystemTray(systemTrayCheckBox->isChecked());
     Settings::self()->saveShowPopups(systemTrayPopup->isChecked());
     Settings::self()->saveMinimiseOnClose(minimiseOnClose->isChecked());
+    if (startupStateShow->isChecked()) {
+        Settings::self()->saveStartupState(Settings::SS_ShowMainWindow);
+    } else if (startupStateHide->isChecked()) {
+        Settings::self()->saveStartupState(Settings::SS_HideMainWindow);
+    } else if (startupStateRestore->isChecked()) {
+        Settings::self()->saveStartupState(Settings::SS_Previous);
+    }
+    Settings::self()->saveCacheScaledCovers(cacheScaledCovers->isChecked());
+    Settings::self()->saveFetchCovers(fetchCovers->isChecked());
+    #ifndef ENABLE_KDE_SUPPORT
+    if (loadedLangs && lang) {
+        Settings::self()->saveLang(lang->itemData(lang->currentIndex()).toString());
+    }
+    #endif
+
+    QStringList hiddenPages;
+    for (int i=0; i<views->count(); ++i) {
+        QListWidgetItem *v=views->item(i);
+        if (Qt::Unchecked==v->checkState()) {
+            hiddenPages.append(v->data(Qt::UserRole).toString());
+        }
+    }
+    Settings::self()->saveHiddenPages(hiddenPages);
+    int sidebar=getValue(sbStyle)|getValue(sbPosition);
+    if (sbIconsOnly->isChecked()) {
+        sidebar|=FancyTabWidget::IconOnly;
+    }
+    Settings::self()->saveSidebar(sidebar);
+    Settings::self()->saveMonoSidebarIcons(sbMonoIcons->isChecked());
+    Settings::self()->saveSplitterAutoHide(sbAutoHide->isChecked());
+}
+
+#ifndef ENABLE_KDE_SUPPORT
+static bool localeAwareCompare(const QString &a, const QString &b)
+{
+    return a.localeAwareCompare(b) < 0;
+}
+
+static QSet<QString> translationCodes(const QString &dir)
+{
+    QSet<QString> codes;
+    QDir d(dir);
+    QStringList installed(d.entryList(QStringList() << "*.qm"));
+    QRegExp langRegExp("^cantata_(.*).qm$");
+    foreach (const QString &filename, installed) {
+        if (langRegExp.exactMatch(filename)) {
+            codes.insert(langRegExp.cap(1));
+        }
+    }
+    return codes;
+}
+
+void InterfaceSettings::showEvent(QShowEvent *e)
+{
+    if (!loadedLangs) {
+        loadedLangs=true;
+
+        QMap<QString, QString> langMap;
+        QSet<QString> transCodes;
+
+        transCodes+=translationCodes(qApp->applicationDirPath()+QLatin1String("/translations"));
+        transCodes+=translationCodes(QDir::currentPath()+QLatin1String("/translations"));
+        #ifndef Q_OS_WIN
+        transCodes+=translationCodes(INSTALL_PREFIX"/share/cantata/translations/");
+        #endif
+
+        foreach (const QString &code, transCodes) {
+            QString langName = QLocale::languageToString(QLocale(code).language());
+            #if QT_VERSION >= 0x040800
+            QString nativeName = QLocale(code).nativeLanguageName();
+            if (!nativeName.isEmpty()) {
+                langName = nativeName;
+            }
+            #endif
+            langMap[QString("%1 (%2)").arg(langName, code)] = code;
+        }
+
+        langMap["English (en)"] = "en";
+
+        QString current = Settings::self()->lang();
+        QStringList names = langMap.keys();
+        qStableSort(names.begin(), names.end(), localeAwareCompare);
+        lang->addItem(i18n("System default"), QString());
+        lang->setCurrentIndex(0);
+        foreach (const QString &name, names) {
+            lang->addItem(name, langMap[name]);
+            if (langMap[name]==current) {
+                lang->setCurrentIndex(lang->count()-1);
+            }
+        }
+
+        if (lang->count()<3) {
+            REMOVE(lang)
+            REMOVE(langLabel)
+            REMOVE(langNoteLabel)
+        } else {
+            connect(lang, SIGNAL(currentIndexChanged(int)), SLOT(langChanged()));
+        }
+    }
+    QWidget::showEvent(e);
+}
+#endif
+
+void InterfaceSettings::showPage(const QString &page)
+{
+    if (QLatin1String("sidebar")==page) {
+        tabWidget->setCurrentIndex(0);
+    }
+}
+
+void InterfaceSettings::addView(const QString &v, const QString &prop)
+{
+    QListWidgetItem *item=new QListWidgetItem(v, views);
+    item->setCheckState(Qt::Unchecked);
+    item->setData(Qt::UserRole, prop);
 }
 
 void InterfaceSettings::libraryViewChanged()
 {
-    int vt=getViewType(libraryView);
+    int vt=getValue(libraryView);
     if (ItemView::Mode_IconTop==vt && 0==libraryCoverSize->currentIndex()) {
         libraryCoverSize->setCurrentIndex(2);
     }
 
     bool isIcon=ItemView::Mode_IconTop==vt;
-    bool isSimpleTree=ItemView::Mode_SimpleTree==vt;
+    bool isSimpleTree=ItemView::Mode_SimpleTree==vt || ItemView::Mode_BasicTree==vt;
     libraryArtistImage->setEnabled(!isIcon && !isSimpleTree);
-    libraryArtistImageLabel->setEnabled(libraryArtistImage->isEnabled());
     if (isIcon) {
         libraryArtistImage->setChecked(true);
     } else if (isSimpleTree) {
@@ -326,7 +443,7 @@ void InterfaceSettings::libraryViewChanged()
 
 void InterfaceSettings::libraryCoverSizeChanged()
 {
-    if (ItemView::Mode_IconTop==getViewType(libraryView) && 0==libraryCoverSize->currentIndex()) {
+    if (ItemView::Mode_IconTop==getValue(libraryView) && 0==libraryCoverSize->currentIndex()) {
         libraryView->setCurrentIndex(1);
     }
     if (0==libraryCoverSize->currentIndex()) {
@@ -336,34 +453,87 @@ void InterfaceSettings::libraryCoverSizeChanged()
 
 void InterfaceSettings::albumsViewChanged()
 {
-    if (ItemView::Mode_IconTop==getViewType(albumsView) && 0==albumsCoverSize->currentIndex()) {
+    if (ItemView::Mode_IconTop==getValue(albumsView) && 0==albumsCoverSize->currentIndex()) {
         albumsCoverSize->setCurrentIndex(2);
     }
 }
 
 void InterfaceSettings::albumsCoverSizeChanged()
 {
-    if (ItemView::Mode_IconTop==getViewType(albumsView) && 0==albumsCoverSize->currentIndex()) {
+    if (ItemView::Mode_IconTop==getValue(albumsView) && 0==albumsCoverSize->currentIndex()) {
         albumsView->setCurrentIndex(1);
     }
 }
 
 void InterfaceSettings::playQueueGroupedChanged()
 {
-    playQueueAutoExpand->setEnabled(1==playQueueGrouped->currentIndex());
-    playQueueAutoExpandLabel->setEnabled(1==playQueueGrouped->currentIndex());
-    playQueueStartClosed->setEnabled(1==playQueueGrouped->currentIndex());
-    playQueueStartClosedLabel->setEnabled(1==playQueueGrouped->currentIndex());
+    playQueueAutoExpand->setEnabled(constPlayQueueGrouped==playQueueGrouped->currentIndex());
+    playQueueStartClosed->setEnabled(constPlayQueueGrouped==playQueueGrouped->currentIndex());
 }
 
-void InterfaceSettings::playListsStyleChanged()
+void InterfaceSettings::playlistsViewChanged()
 {
-    bool grouped=getViewType(playlistsView)==ItemView::Mode_GroupedTree;
+    bool grouped=getValue(playlistsView)==ItemView::Mode_GroupedTree;
     playListsStartClosed->setEnabled(grouped);
-    playListsStartClosedLabel->setEnabled(grouped);
 }
 
 void InterfaceSettings::forceSingleClickChanged()
 {
     singleClickLabel->setOn(forceSingleClick->isChecked()!=Settings::self()->forceSingleClick());
 }
+
+void InterfaceSettings::enableStartupState()
+{
+    startupState->setEnabled(systemTrayCheckBox->isChecked() && minimiseOnClose->isChecked());
+}
+
+void InterfaceSettings::langChanged()
+{
+    #ifndef ENABLE_KDE_SUPPORT
+    langNoteLabel->setOn(lang->itemData(lang->currentIndex()).toString()!=Settings::self()->lang());
+    #endif
+}
+
+void InterfaceSettings::viewItemChanged(QListWidgetItem *changedItem)
+{
+    // If this is the playqueue that has been toggled, then control auto-hide
+    // i.e. can't auto-hide if playqueue is in sidebar
+    if (Qt::Checked==changedItem->checkState() && changedItem==views->item(0)) {
+        sbAutoHide->setChecked(false);
+    }
+
+    // Ensure we have at least 1 view checked...
+    for (int i=0; i<views->count(); ++i) {
+        QListWidgetItem *v=views->item(i);
+        if (Qt::Checked==v->checkState()) {
+            return;
+        }
+    }
+
+    views->item(1)->setCheckState(Qt::Checked);
+}
+
+void InterfaceSettings::sbAutoHideChanged()
+{
+    if (sbAutoHide->isChecked()) {
+        views->item(0)->setCheckState(Qt::Unchecked);
+    }
+}
+
+void InterfaceSettings::setPlayQueueBackgroundOpacityLabel()
+{
+    playQueueBackgroundOpacityLabel->setText(i18nc("value%", "%1%", playQueueBackgroundOpacity->value()));
+}
+
+void InterfaceSettings::setPlayQueueBackgroundBlurLabel()
+{
+    playQueueBackgroundBlurLabel->setText(i18nc("pixels", "%1px", playQueueBackgroundBlur->value()));
+}
+
+void InterfaceSettings::enablePlayQueueBackgroundOptions()
+{
+    playQueueBackgroundOpacity->setEnabled(!playQueueBackground_none->isChecked());
+    playQueueBackgroundOpacityLabel->setEnabled(playQueueBackgroundOpacity->isEnabled());
+    playQueueBackgroundBlur->setEnabled(playQueueBackgroundOpacity->isEnabled());
+    playQueueBackgroundBlurLabel->setEnabled(playQueueBackgroundOpacity->isEnabled());
+}
diff --git a/gui/interfacesettings.h b/gui/interfacesettings.h
index ae606e9..765c8e4 100644
--- a/gui/interfacesettings.h
+++ b/gui/interfacesettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -32,38 +32,41 @@ class InterfaceSettings : public QWidget, private Ui::InterfaceSettings
 {
     Q_OBJECT
 
-    enum Views
-    {
-        V_Artists    = 0x01,
-        V_Albums     = 0x02,
-        V_Folders    = 0x04,
-        V_Playlists  = 0x08,
-        // V_Dynamic    = 0x10,
-        V_Streams    = 0x20,
-        V_Online     = 0x40,
-        V_Devices    = 0x80,
-
-        V_All        = 0xFF
-    };
-
 public:
-    InterfaceSettings(QWidget *p, const QStringList &hiddenPages);
+    InterfaceSettings(QWidget *p);
     virtual ~InterfaceSettings() { }
 
     void load();
     void save();
 
+    #ifndef ENABLE_KDE_SUPPORT
+    void showEvent(QShowEvent *e);
+    #endif
+    void showPage(const QString &page);
+
+private:
+    void addView(const QString &v, const QString &prop);
+
 private Q_SLOTS:
     void libraryViewChanged();
     void libraryCoverSizeChanged();
     void albumsViewChanged();
     void albumsCoverSizeChanged();
-    void playListsStyleChanged();
+    void playlistsViewChanged();
     void playQueueGroupedChanged();
     void forceSingleClickChanged();
+    void enableStartupState();
+    void langChanged();
+    void viewItemChanged(QListWidgetItem *changedItem);
+    void sbAutoHideChanged();
+    void setPlayQueueBackgroundOpacityLabel();
+    void setPlayQueueBackgroundBlurLabel();
+    void enablePlayQueueBackgroundOptions();
 
 private:
-    int enabledViews;
+    #ifndef ENABLE_KDE_SUPPORT
+    bool loadedLangs;
+    #endif
 };
 
 #endif
diff --git a/gui/interfacesettings.ui b/gui/interfacesettings.ui
index d3b9602..555b27f 100644
--- a/gui/interfacesettings.ui
+++ b/gui/interfacesettings.ui
@@ -6,12 +6,21 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>482</width>
-    <height>341</height>
+    <width>734</width>
+    <height>542</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="margin">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
     <number>0</number>
    </property>
    <item>
@@ -22,6 +31,152 @@
      <property name="movable">
       <bool>false</bool>
      </property>
+     <widget class="QWidget" name="sidebarTab">
+      <attribute name="title">
+       <string>Sidebar</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="sidebarLayout">
+       <item>
+        <widget class="QGroupBox" name="viewsGroup">
+         <property name="title">
+          <string>Views</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_6">
+          <item>
+           <widget class="QLabel" name="label_2">
+            <property name="text">
+             <string>Use the checkboxes below to configure the list of active views.</string>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QListWidget" name="views"/>
+          </item>
+          <item>
+           <spacer name="verticalSpacer_xx">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <property name="sizeType">
+             <enum>QSizePolicy::Fixed</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>20</width>
+              <height>4</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+          <item>
+           <widget class="StateLabel" name="sbPlayQueueLabel">
+            <property name="text">
+             <string><i><b>NOTE:</b> By default, the play queue appears to the side of the other views. If you enable the option above, then it will be merged into the sidebar as per other views.</i></string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <spacer name="verticalSpacer_x">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <property name="sizeType">
+             <enum>QSizePolicy::Fixed</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>20</width>
+              <height>4</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+          <item>
+           <widget class="StateLabel" name="sbInfoLabel">
+            <property name="text">
+             <string><i><b>NOTE:</b> By default, the 'Info' (current song information) view is accessible by pressing its icon in the main toolbar. If you enable the option above, then it will be merged into the sidebar as per other views.</i></string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="optionsGroup">
+         <property name="title">
+          <string>Options</string>
+         </property>
+         <layout class="QFormLayout" name="styleLayout">
+          <property name="fieldGrowthPolicy">
+           <enum>QFormLayout::ExpandingFieldsGrow</enum>
+          </property>
+          <item row="0" column="0">
+           <widget class="BuddyLabel" name="sbStyleLabel">
+            <property name="text">
+             <string>Style:</string>
+            </property>
+            <property name="buddy">
+             <cstring>sbStyle</cstring>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QComboBox" name="sbStyle"/>
+          </item>
+          <item row="1" column="0">
+           <widget class="BuddyLabel" name="sbPositionLabel">
+            <property name="text">
+             <string>Position:</string>
+            </property>
+            <property name="buddy">
+             <cstring>sbPosition</cstring>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="1">
+           <widget class="QComboBox" name="sbPosition"/>
+          </item>
+          <item row="2" column="0" colspan="2">
+           <widget class="QCheckBox" name="sbIconsOnly">
+            <property name="text">
+             <string>Only show icons, no text</string>
+            </property>
+           </widget>
+          </item>
+          <item row="3" column="0" colspan="2">
+           <widget class="QCheckBox" name="sbMonoIcons">
+            <property name="text">
+             <string>Use monochrome icons</string>
+            </property>
+           </widget>
+          </item>
+          <item row="4" column="0" colspan="2">
+           <widget class="QCheckBox" name="sbAutoHide">
+            <property name="text">
+             <string>Auto-hide</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </widget>
      <widget class="QWidget" name="tab">
       <attribute name="title">
        <string>Artists</string>
@@ -58,37 +213,17 @@
          <item row="1" column="1">
           <widget class="QComboBox" name="libraryCoverSize"/>
          </item>
-         <item row="2" column="0">
-          <widget class="BuddyLabel" name="libraryArtistImageLabel">
-           <property name="text">
-            <string>Show artist images:</string>
-           </property>
-           <property name="buddy">
-            <cstring>libraryArtistImage</cstring>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="1">
-          <widget class="OnOffButton" name="libraryArtistImage">
+         <item row="2" column="0" colspan="2">
+          <widget class="QCheckBox" name="libraryArtistImage">
            <property name="text">
-            <string/>
+            <string>Show artist images</string>
            </property>
           </widget>
          </item>
-         <item row="3" column="0">
-          <widget class="BuddyLabel" name="label_6">
+         <item row="3" column="0" colspan="2">
+          <widget class="QCheckBox" name="libraryYear">
            <property name="text">
-            <string>Show album year:</string>
-           </property>
-           <property name="buddy">
-            <cstring>libraryYear</cstring>
-           </property>
-          </widget>
-         </item>
-         <item row="3" column="1">
-          <widget class="OnOffButton" name="libraryYear">
-           <property name="text">
-            <string/>
+            <string>Show album year</string>
            </property>
           </widget>
          </item>
@@ -120,7 +255,7 @@
          </property>
          <property name="text">
           <string><i><b>NOTE:</b> When looking for artist images, Cantata will look for either artist.jpg, artist.png, 'Artist'.jpg, or 'Artist'.png,
-within the folder of the current track, or within its parent folder. If no image is found, Cantata will attempt to download one. When the image is displayed, it will be cropped (either top/bottom, or left/right) to provide a square image.</i></string>
+within the folder of the current track, or within its parent folder. If no image is found, Cantata will attempt to download one.</i></string>
          </property>
          <property name="alignment">
           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
@@ -218,20 +353,10 @@ within the folder of the current track, or within its parent folder. If no image
        <item row="0" column="1">
         <widget class="QComboBox" name="playlistsView"/>
        </item>
-       <item row="1" column="0">
-        <widget class="BuddyLabel" name="playListsStartClosedLabel">
+       <item row="1" column="0" colspan="2">
+        <widget class="QCheckBox" name="playListsStartClosed">
          <property name="text">
-          <string>Initially collapse albums:</string>
-         </property>
-         <property name="buddy">
-          <cstring>playListsStartClosed</cstring>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="1">
-        <widget class="OnOffButton" name="playListsStartClosed">
-         <property name="text">
-          <string/>
+          <string>Initially collapse albums</string>
          </property>
         </widget>
        </item>
@@ -321,152 +446,267 @@ within the folder of the current track, or within its parent folder. If no image
         <widget class="QComboBox" name="playQueueGrouped">
          <item>
           <property name="text">
-           <string>Table</string>
+           <string>Grouped Albums</string>
           </property>
          </item>
          <item>
           <property name="text">
-           <string>Grouped Albums</string>
+           <string>Table</string>
           </property>
          </item>
         </widget>
        </item>
-       <item row="1" column="0">
-        <widget class="BuddyLabel" name="playQueueStartClosedLabel">
+       <item row="1" column="0" colspan="2">
+        <widget class="QCheckBox" name="playQueueStartClosed">
          <property name="text">
-          <string>Initially collapse albums:</string>
-         </property>
-         <property name="buddy">
-          <cstring>playQueueStartClosed</cstring>
+          <string>Initially collapse albums</string>
          </property>
         </widget>
        </item>
-       <item row="1" column="1">
-        <widget class="OnOffButton" name="playQueueStartClosed">
+       <item row="2" column="0" colspan="2">
+        <widget class="QCheckBox" name="playQueueAutoExpand">
          <property name="text">
-          <string/>
+          <string>Automatically expand current album</string>
          </property>
         </widget>
        </item>
-       <item row="2" column="0">
-        <widget class="BuddyLabel" name="playQueueAutoExpandLabel">
+       <item row="3" column="0" colspan="2">
+        <widget class="QCheckBox" name="playQueueScroll">
          <property name="text">
-          <string>Automatically expand current album:</string>
-         </property>
-         <property name="buddy">
-          <cstring>playQueueAutoExpand</cstring>
+          <string>Scroll to current track</string>
          </property>
         </widget>
        </item>
-       <item row="2" column="1">
-        <widget class="OnOffButton" name="playQueueAutoExpand">
+       <item row="4" column="0" colspan="2">
+        <widget class="QCheckBox" name="playQueueConfirmClear">
          <property name="text">
-          <string/>
+          <string>Prompt before clearing</string>
          </property>
         </widget>
        </item>
-       <item row="3" column="0">
-        <widget class="BuddyLabel" name="playQueueScrollLabel">
-         <property name="text">
-          <string>Scroll to current track:</string>
-         </property>
-         <property name="buddy">
-          <cstring>playQueueScroll</cstring>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="1">
-        <widget class="OnOffButton" name="playQueueScroll"/>
-       </item>
-       <item row="4" column="0">
-        <widget class="BuddyLabel" name="playQueueBackgroundLabel">
-         <property name="text">
-          <string>Use current album cover as background:</string>
-         </property>
-         <property name="buddy">
-          <cstring>playQueueBackground</cstring>
-         </property>
-        </widget>
-       </item>
-       <item row="4" column="1">
-        <widget class="OnOffButton" name="playQueueBackground"/>
-       </item>
-       <item row="5" column="0">
-        <widget class="BuddyLabel" name="playQueueConfirmClearLabel">
-         <property name="text">
-          <string>Prompt before clearing:</string>
-         </property>
-         <property name="buddy">
-          <cstring>playQueueConfirmClear</cstring>
+       <item row="5" column="0" colspan="2">
+        <widget class="QGroupBox" name="groupBox">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
          </property>
+         <property name="title">
+          <string>Background Image</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout">
+          <item row="0" column="0" colspan="3">
+           <widget class="QRadioButton" name="playQueueBackground_none">
+            <property name="text">
+             <string>None</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0" colspan="3">
+           <widget class="QRadioButton" name="playQueueBackground_cover">
+            <property name="text">
+             <string>Current album cover</string>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="0" colspan="2">
+           <widget class="QRadioButton" name="playQueueBackground_custom">
+            <property name="text">
+             <string>Custom image:</string>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="2">
+           <widget class="PathRequester" name="playQueueBackgroundFile">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="enabled">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="3" column="0">
+           <widget class="QLabel" name="label_4b">
+            <property name="text">
+             <string>Blur:</string>
+            </property>
+           </widget>
+          </item>
+          <item row="3" column="1" colspan="2">
+           <layout class="QHBoxLayout" name="playQueueBackgroundBlurLayout">
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QSlider" name="playQueueBackgroundBlur">
+              <property name="maximum">
+               <number>20</number>
+              </property>
+              <property name="pageStep">
+               <number>1</number>
+              </property>
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="tickPosition">
+               <enum>QSlider::TicksBelow</enum>
+              </property>
+              <property name="tickInterval">
+               <number>1</number>
+              </property>
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="playQueueBackgroundBlurLabel">
+              <property name="text">
+               <string>10px</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item row="4" column="0">
+           <widget class="QLabel" name="label_4">
+            <property name="text">
+             <string>Opacity:</string>
+            </property>
+           </widget>
+          </item>
+          <item row="4" column="1" colspan="2">
+           <layout class="QHBoxLayout" name="playQueueBackgroundOpacityLayout">
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QSlider" name="playQueueBackgroundOpacity">
+              <property name="maximum">
+               <number>100</number>
+              </property>
+              <property name="pageStep">
+               <number>10</number>
+              </property>
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="tickPosition">
+               <enum>QSlider::TicksBelow</enum>
+              </property>
+              <property name="tickInterval">
+               <number>10</number>
+              </property>
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="playQueueBackgroundOpacityLabel">
+              <property name="text">
+               <string>40%</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
         </widget>
        </item>
-       <item row="5" column="1">
-        <widget class="OnOffButton" name="playQueueConfirmClear"/>
-       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_7">
       <attribute name="title">
        <string>External</string>
       </attribute>
-      <layout class="QFormLayout" name="formLayout_7">
-       <item row="0" column="0">
-        <widget class="BuddyLabel" name="label_10">
+      <layout class="QVBoxLayout" name="verticalLayout_5">
+       <item>
+        <widget class="QCheckBox" name="systemTrayPopup">
          <property name="text">
-          <string>Show icon in notification area:</string>
-         </property>
-         <property name="buddy">
-          <cstring>systemTrayCheckBox</cstring>
+          <string>Show popup messages when changing tracks</string>
          </property>
         </widget>
        </item>
-       <item row="0" column="1">
-        <widget class="OnOffButton" name="systemTrayCheckBox">
+       <item>
+        <widget class="QCheckBox" name="systemTrayCheckBox">
          <property name="enabled">
           <bool>true</bool>
          </property>
          <property name="text">
-          <string/>
+          <string>Show icon in notification area</string>
          </property>
         </widget>
        </item>
-       <item row="1" column="0">
-        <widget class="BuddyLabel" name="minimiseOnCloseLabel">
-         <property name="text">
-          <string>Minimize to notification area when closed:</string>
-         </property>
-         <property name="buddy">
-          <cstring>minimiseOnClose</cstring>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="1">
-        <widget class="OnOffButton" name="minimiseOnClose">
+       <item>
+        <widget class="QCheckBox" name="minimiseOnClose">
          <property name="enabled">
           <bool>true</bool>
          </property>
          <property name="text">
-          <string/>
+          <string>Minimize to notification area when closed</string>
          </property>
         </widget>
        </item>
-       <item row="2" column="0">
-        <widget class="BuddyLabel" name="label_11">
-         <property name="text">
-          <string>Show popup messages when changing tracks:</string>
-         </property>
-         <property name="buddy">
-          <cstring>systemTrayPopup</cstring>
-         </property>
+       <item>
+        <widget class="QGroupBox" name="startupState">
+         <property name="title">
+          <string>On Start-up</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_4">
+          <item>
+           <widget class="QRadioButton" name="startupStateShow">
+            <property name="text">
+             <string>Show main window</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="startupStateHide">
+            <property name="text">
+             <string>Hide main window</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="startupStateRestore">
+            <property name="text">
+             <string>Restore previous state</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
         </widget>
        </item>
-       <item row="2" column="1">
-        <widget class="OnOffButton" name="systemTrayPopup">
-         <property name="text">
-          <string/>
+       <item>
+        <spacer name="verticalSpacer_3">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
          </property>
-        </widget>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>90</height>
+          </size>
+         </property>
+        </spacer>
        </item>
       </layout>
      </widget>
@@ -480,86 +720,67 @@ within the folder of the current track, or within its parent folder. If no image
          <property name="fieldGrowthPolicy">
           <enum>QFormLayout::ExpandingFieldsGrow</enum>
          </property>
-         <item row="0" column="0">
-          <widget class="BuddyLabel" name="label_7">
+         <item row="0" column="0" colspan="2">
+          <widget class="QCheckBox" name="groupSingle">
            <property name="text">
-            <string>Group single track albums:</string>
-           </property>
-           <property name="buddy">
-            <cstring>groupSingle</cstring>
+            <string>Group single track albums</string>
            </property>
           </widget>
          </item>
-         <item row="0" column="1">
-          <widget class="OnOffButton" name="groupSingle">
+         <item row="1" column="0" colspan="2">
+          <widget class="QCheckBox" name="useComposer">
            <property name="text">
-            <string/>
+            <string>Group albums by composer</string>
            </property>
           </widget>
          </item>
-         <item row="1" column="0">
-          <widget class="BuddyLabel" name="useComposerLabel">
+         <item row="2" column="0" colspan="2">
+          <widget class="QCheckBox" name="groupMultiple">
            <property name="text">
-            <string>Group albums by composer:</string>
-           </property>
-           <property name="buddy">
-            <cstring>useComposer</cstring>
+            <string>Group multiple artist albums under 'Various Artists'</string>
            </property>
           </widget>
          </item>
-         <item row="1" column="1">
-          <widget class="OnOffButton" name="useComposer">
+         <item row="3" column="0" colspan="2">
+          <widget class="QCheckBox" name="fetchCovers">
            <property name="text">
-            <string/>
+            <string>Fetch missing covers from Last.fm</string>
            </property>
           </widget>
          </item>
-         <item row="2" column="0">
-          <widget class="BuddyLabel" name="groupMultipleLabel">
+         <item row="4" column="0" colspan="2">
+          <widget class="QCheckBox" name="cacheScaledCovers">
            <property name="text">
-            <string>Multiple artist albums:</string>
-           </property>
-           <property name="buddy">
-            <cstring>groupMultiple</cstring>
+            <string>Cache scaled covers</string>
            </property>
           </widget>
          </item>
-         <item row="2" column="1">
-          <widget class="QComboBox" name="groupMultiple"/>
-         </item>
-         <item row="3" column="0">
-          <widget class="BuddyLabel" name="showDeleteActionLabel">
+         <item row="5" column="0" colspan="2">
+          <widget class="QCheckBox" name="showDeleteAction">
            <property name="text">
-            <string>Show delete action in context menus:</string>
-           </property>
-           <property name="buddy">
-            <cstring>showDeleteAction</cstring>
+            <string>Show delete action in context menus</string>
            </property>
           </widget>
          </item>
-         <item row="3" column="1">
-          <widget class="OnOffButton" name="showDeleteAction">
+         <item row="6" column="0" colspan="2">
+          <widget class="QCheckBox" name="forceSingleClick">
            <property name="text">
-            <string/>
+            <string>Enforce single-click activation of items</string>
            </property>
           </widget>
          </item>
-         <item row="4" column="0">
-          <widget class="BuddyLabel" name="forceSingleClick_label">
+         <item row="7" column="0">
+          <widget class="BuddyLabel" name="langLabel">
            <property name="text">
-            <string>Enforce single-click activation of items:</string>
+            <string>Language:</string>
            </property>
            <property name="buddy">
-            <cstring>forceSingleClick</cstring>
+            <cstring>lang</cstring>
            </property>
           </widget>
          </item>
-         <item row="4" column="1">
-          <widget class="OnOffButton" name="forceSingleClick">
-           <property name="text">
-            <string/>
-           </property>
-          </widget>
+         <item row="7" column="1">
+          <widget class="QComboBox" name="lang"/>
          </item>
         </layout>
        </item>
@@ -581,12 +802,6 @@ within the folder of the current track, or within its parent folder. If no image
        </item>
        <item>
         <widget class="StateLabel" name="singleClickLabel">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
          <property name="text">
           <string><i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' setting will require a re-start of Cantata.</i></string>
          </property>
@@ -598,6 +813,48 @@ within the folder of the current track, or within its parent folder. If no image
          </property>
         </widget>
        </item>
+       <item>
+        <spacer name="verticalSpacer_2b">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeType">
+          <enum>QSizePolicy::Fixed</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>4</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="StateLabel" name="langNoteLabel">
+         <property name="text">
+          <string><i><b>NOTE:</b> Changing the language setting will require a re-start of Cantata.</i></string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="verticalSpacer_2c">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>16</width>
+           <height>16</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
       </layout>
      </widget>
     </widget>
@@ -616,37 +873,29 @@ within the folder of the current track, or within its parent folder. If no image
    <header>statelabel.h</header>
   </customwidget>
   <customwidget>
-   <class>OnOffButton</class>
-   <extends>QCheckBox</extends>
-   <header>onoffbutton.h</header>
+   <class>PathRequester</class>
+   <extends>QLineEdit</extends>
+   <header>pathrequester.h</header>
+   <container>1</container>
   </customwidget>
  </customwidgets>
- <tabstops>
-  <tabstop>libraryView</tabstop>
-  <tabstop>libraryCoverSize</tabstop>
-  <tabstop>libraryArtistImage</tabstop>
-  <tabstop>libraryYear</tabstop>
-  <tabstop>albumsView</tabstop>
-  <tabstop>albumsCoverSize</tabstop>
-  <tabstop>albumSort</tabstop>
-  <tabstop>playlistsView</tabstop>
-  <tabstop>playListsStartClosed</tabstop>
-  <tabstop>folderView</tabstop>
-  <tabstop>streamsView</tabstop>
-  <tabstop>onlineView</tabstop>
-  <tabstop>devicesView</tabstop>
-  <tabstop>playQueueGrouped</tabstop>
-  <tabstop>playQueueStartClosed</tabstop>
-  <tabstop>playQueueAutoExpand</tabstop>
-  <tabstop>playQueueScroll</tabstop>
-  <tabstop>systemTrayCheckBox</tabstop>
-  <tabstop>minimiseOnClose</tabstop>
-  <tabstop>systemTrayPopup</tabstop>
-  <tabstop>groupSingle</tabstop>
-  <tabstop>groupMultiple</tabstop>
-  <tabstop>showDeleteAction</tabstop>
-  <tabstop>forceSingleClick</tabstop>
- </tabstops>
  <resources/>
- <connections/>
+ <connections>
+  <connection>
+   <sender>playQueueBackground_custom</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>playQueueBackgroundFile</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>89</x>
+     <y>262</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>199</x>
+     <y>271</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
 </ui>
diff --git a/gui/librarypage.cpp b/gui/librarypage.cpp
index 09c5638..2d9e382 100644
--- a/gui/librarypage.cpp
+++ b/gui/librarypage.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -45,8 +45,6 @@ LibraryPage::LibraryPage(QWidget *p)
     setupUi(this);
     addToPlayQueue->setDefaultAction(StdActions::self()->addToPlayQueueAction);
     replacePlayQueue->setDefaultAction(StdActions::self()->replacePlayQueueAction);
-    libraryUpdate->setDefaultAction(StdActions::self()->refreshAction);
-    searchButton->setDefaultAction(StdActions::self()->searchAction);
 
     view->addAction(StdActions::self()->addToPlayQueueAction);
     view->addAction(StdActions::self()->addRandomToPlayQueueAction);
@@ -74,8 +72,10 @@ LibraryPage::LibraryPage(QWidget *p)
     connect(this, SIGNAL(add(const QStringList &, bool, quint8)), MPDConnection::self(), SLOT(add(const QStringList &, bool, quint8)));
     connect(this, SIGNAL(addSongsToPlaylist(const QString &, const QStringList &)), MPDConnection::self(), SLOT(addToPlaylist(const QString &, const QStringList &)));
     connect(genreCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(searchItems()));
-    connect(MPDConnection::self(), SIGNAL(updatingLibrary()), view, SLOT(showSpinner()));
-    connect(MPDConnection::self(), SIGNAL(updatedLibrary()), view, SLOT(hideSpinner()));
+    connect(MPDConnection::self(), SIGNAL(updatingLibrary()), this, SLOT(showSpinner()));
+    connect(MPDConnection::self(), SIGNAL(updatedLibrary()), this, SLOT(hideSpinner()));
+    connect(MPDConnection::self(), SIGNAL(updatingDatabase()), this, SLOT(showSpinner()));
+    connect(MPDConnection::self(), SIGNAL(updatedDatabase()), this, SLOT(hideSpinner()));
     connect(MusicLibraryModel::self(), SIGNAL(updateGenres(const QSet<QString> &)), genreCombo, SLOT(update(const QSet<QString> &)));
     connect(this, SIGNAL(loadLibrary()), MPDConnection::self(), SLOT(loadLibrary()));
     connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions()));
@@ -119,10 +119,9 @@ void LibraryPage::setItemSize(int v)
 
 void LibraryPage::refresh()
 {
-    view->setLevel(0);
+    view->goToTop();
 
     if (!MusicLibraryModel::self()->fromXML()) {
-        view->showSpinner();
         emit loadLibrary();
     }
 }
@@ -130,7 +129,7 @@ void LibraryPage::refresh()
 void LibraryPage::clear()
 {
     MusicLibraryModel::self()->clear();
-    view->setLevel(0);
+    view->goToTop();
 }
 
 static inline QString nameKey(const QString &artist, const QString &album)
@@ -408,3 +407,15 @@ void LibraryPage::controlActions()
     }
     StdActions::self()->addRandomToPlayQueueAction->setEnabled(allowRandomAlbum);
 }
+
+void LibraryPage::showSpinner()
+{
+    view->showSpinner();
+    view->showMessage(i18n("Updating..."), -1);
+}
+
+void LibraryPage::hideSpinner()
+{
+    view->hideSpinner();
+    view->showMessage(QString(), 0);
+}
diff --git a/gui/librarypage.h b/gui/librarypage.h
index 1a21ff5..f8221a1 100644
--- a/gui/librarypage.h
+++ b/gui/librarypage.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,11 +26,11 @@
 
 #include "ui_librarypage.h"
 #include "musiclibraryproxymodel.h"
-#include "config.h"
+#include "page.h"
 
 class Action;
 
-class LibraryPage : public QWidget, public Ui::LibraryPage
+class LibraryPage : public QWidget, public Ui::LibraryPage, public Page
 {
     Q_OBJECT
 
@@ -54,7 +54,6 @@ public:
     void showArtist(const QString &artist);
     void showAlbum(const QString &artist, const QString &album);
     void focusSearch() { view->focusSearch(); }
-    void goBack() { view->backActivated(); }
     void showEvent(QShowEvent *e);
 
 private:
@@ -74,6 +73,8 @@ public Q_SLOTS:
     void searchItems();
     void controlActions();
     void updateGenres(const QModelIndex &);
+    void showSpinner();
+    void hideSpinner();
 
 private:
     MusicLibraryProxyModel proxy;
diff --git a/gui/librarypage.ui b/gui/librarypage.ui
index 700c6e4..997e8b2 100644
--- a/gui/librarypage.ui
+++ b/gui/librarypage.ui
@@ -47,12 +47,6 @@
       <number>0</number>
      </property>
      <item>
-      <widget class="ToolButton" name="libraryUpdate"/>
-     </item>
-     <item>
-      <widget class="ToolButton" name="searchButton"/>
-     </item>
-     <item>
       <widget class="GenreCombo" name="genreCombo"/>
      </item>
      <item>
diff --git a/gui/main.cpp b/gui/main.cpp
index 64e4318..163e194 100644
--- a/gui/main.cpp
+++ b/gui/main.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -41,6 +41,8 @@
 #include "settings.h"
 #include "initialsettingswizard.h"
 #include "mainwindow.h"
+#include "song.h"
+#include "thread.h"
 
 // To enable debug...
 #include "mpdconnection.h"
@@ -51,15 +53,14 @@
 #include "metaengine.h"
 #include "coverwidget.h"
 #include "backdropcreator.h"
+#ifdef ENABLE_DYNAMIC
 #include "dynamic.h"
+#endif
 #include "streamfetcher.h"
 #include "httpserver.h"
 #include "songdialog.h"
 #include "networkaccessmanager.h"
 #include "ultimatelyricsprovider.h"
-#ifdef ENABLE_EXTERNAL_TAGS
-#include "tagclient.h"
-#endif
 
 #include <QMutex>
 #include <QMutexLocker>
@@ -144,10 +145,9 @@ enum Debug {
     Dbg_SongDialogs       = 0x0800,
     Dbg_NetworkAccess     = 0x1000,
     Dbg_Context_Lyrics    = 0x2000,
+    Dbg_Threads           = 0x4000,
 
-    Dbg_TagHelper         = 0x4000,
     // NOTE: MUST UPDATE Dbg_All IF ADD NEW ITEMS!!!
-
     Dbg_All               = 0x7FFF
 };
 
@@ -184,9 +184,11 @@ static void installDebugMessageHandler()
         if (dbg&Dbg_Context_Backdrop) {
             BackdropCreator::enableDebug();
         }
+        #ifdef ENABLE_DYNAMIC
         if (dbg&Dbg_Dynamic) {
             Dynamic::enableDebug();
         }
+        #endif
         if (dbg&Dbg_StreamFetching) {
             StreamFetcher::enableDebug();
         }
@@ -202,11 +204,9 @@ static void installDebugMessageHandler()
         if (dbg&Dbg_Context_Lyrics) {
             UltimateLyricsProvider::enableDebug();
         }
-        #ifdef ENABLE_EXTERNAL_TAGS
-        if (dbg&Dbg_TagHelper) {
-            TagClient::enableDebug();
+        if (dbg&Dbg_Threads) {
+            ThreadCleaner::enableDebug();
         }
-        #endif
         if (dbg&Dbg_All && logToFile) {
             #if QT_VERSION < 0x050000
             qInstallMsgHandler(cantataQtMsgHandler);
@@ -224,7 +224,7 @@ int main(int argc, char *argv[])
                          ki18n("Cantata"), PACKAGE_VERSION_STRING,
                          ki18n("A KDE client for MPD"),
                          KAboutData::License_GPL_V3,
-                         ki18n("Copyright (c) 2011–2013 Craig Drummond"),
+                         ki18n("© 2011-2014 Craig Drummond"),
                          KLocalizedString(),
                          "http://"CANTATA_URL, "craig.p.drummond at gmail.com");
 
@@ -234,9 +234,6 @@ int main(int argc, char *argv[])
     aboutData.addAuthor(ki18n("Roeland Douma"), ki18n("QtMPC author"), QByteArray(), "http://qtmpc.lowblog.nl");
     aboutData.addAuthor(ki18n("Daniel Selinger"), ki18n("QtMPC author"), QByteArray(), "http://qtmpc.lowblog.nl");
     aboutData.addAuthor(ki18n("Armin Walland"), ki18n("QtMPC author"), QByteArray(), "http://qtmpc.lowblog.nl");
-//    if (ContextWidget::constHtbApiKey.latin1()) {
-//        aboutData.addCredit(ki18n("Home Theater Backdrops"), ki18n("Context view backdrops"), QByteArray(), "www.htbackdrops.com");
-//    }
     aboutData.addCredit(ki18n("FanArt.tv"), ki18n("Context view backdrops (please consider uploading your own music fan-art to fanart.tv)"), QByteArray(), "www.fanart.tv");
     aboutData.addCredit(ki18n("Wikipedia"), ki18n("Context view metadata"), QByteArray(), "www.wikipedia.org");
     aboutData.addCredit(ki18n("Last.fm"), ki18n("Context view metadata"), QByteArray(), "www.last.fm");
@@ -268,21 +265,8 @@ int main(int argc, char *argv[])
         return 0;
     }
 
-    // Translations
-    QString langEnv=qgetenv("CANTATA_LANG");
-    loadTranslation("qt", QLibraryInfo::location(QLibraryInfo::TranslationsPath), langEnv);
-    #ifdef Q_OS_WIN
-    loadTranslation("qt", app.applicationDirPath()+QLatin1String("/translations"), langEnv);
-    loadTranslation("qt", QDir::currentPath()+QLatin1String("/translations"), langEnv);
-    #endif
-    loadTranslation("cantata", app.applicationDirPath()+QLatin1String("/translations"), langEnv);
-    loadTranslation("cantata", QDir::currentPath()+QLatin1String("/translations"), langEnv);
-    #ifndef Q_OS_WIN
-    loadTranslation("cantata", INSTALL_PREFIX"/share/cantata/translations/", langEnv);
-    #endif
-
-      // Set the permissions on the config file on Unix - it can contain passwords
-      // for internet services so it's important that other users can't read it.
+    // Set the permissions on the config file on Unix - it can contain passwords
+    // for internet services so it's important that other users can't read it.
     // On Windows these are stored in the registry instead.
     #ifdef Q_OS_UNIX
     QSettings s;
@@ -299,6 +283,26 @@ int main(int argc, char *argv[])
 
     installDebugMessageHandler();
 
+    // Translations
+    QString lang=qgetenv("CANTATA_LANG");
+    if (lang.isEmpty()) {
+        lang=Settings::self()->lang();
+    }
+    loadTranslation("qt", QLibraryInfo::location(QLibraryInfo::TranslationsPath), lang);
+    #ifdef Q_OS_WIN
+    loadTranslation("qt", app.applicationDirPath()+QLatin1String("/translations"), lang);
+    loadTranslation("qt", QDir::currentPath()+QLatin1String("/translations"), lang);
+    #endif
+    loadTranslation("cantata", app.applicationDirPath()+QLatin1String("/translations"), lang);
+    loadTranslation("cantata", QDir::currentPath()+QLatin1String("/translations"), lang);
+    #ifndef Q_OS_WIN
+    loadTranslation("cantata", INSTALL_PREFIX"/share/cantata/translations/", lang);
+    #endif
+
+    // Ensure ThreadCleaner is in GUI thread...
+    ThreadCleaner::self();
+
+    Song::initTranslations();
     if (Settings::self()->firstRun()) {
         InitialSettingsWizard wz;
         if (QDialog::Rejected==wz.exec()) {
diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp
index e3636e2..1577d20 100644
--- a/gui/mainwindow.cpp
+++ b/gui/mainwindow.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -28,16 +28,17 @@
 #include <QString>
 #include <QTimer>
 #include <QClipboard>
-#ifdef Q_OS_MAC
-#if QT_VERSION < 0x050000
 #include <QToolBar>
-#else
-// QMacNativeToolBar requres Qt Mac Extras to be installed on Qt 5.0 and 5.1.
+#if defined Q_OS_MAC && QT_VERSION >= 0x050000
+// QMacNativeToolBar requres Qt Macf Extras to be installed on Qt 5.0 and 5.1.
 #include <QMacNativeToolBar>
 #endif
+#if QT_VERSION >= 0x050000
+#include <QProcess>
 #endif
 #include <QDialogButtonBox>
 #include <QTextStream>
+#include <QProxyStyle>
 #include <cstdlib>
 #ifdef ENABLE_KDE_SUPPORT
 #include <kdeversion.h>
@@ -53,9 +54,7 @@
 #include "localize.h"
 #include "qtplural.h"
 #include "mainwindow.h"
-#if defined ENABLE_HTTP_STREAM_PLAYBACK && QT_VERSION < 0x050000
-#include <phonon/audiooutput.h>
-#endif
+#include "thread.h"
 #include "trayitem.h"
 #include "messagebox.h"
 #include "inputdialog.h"
@@ -75,7 +74,11 @@
 #include "librarypage.h"
 #include "albumspage.h"
 #include "folderpage.h"
+#ifdef ENABLE_STREAMS
 #include "streamspage.h"
+#include "streamdialog.h"
+#endif
+#include "searchpage.h"
 #include "gtkstyle.h"
 #ifdef ENABLE_DEVICES_SUPPORT
 #include "filejob.h"
@@ -87,8 +90,10 @@
 #include "audiocddevice.h"
 #endif
 #endif
+#ifdef ENABLE_ONLINE_SERVICES
 #include "onlineservicespage.h"
 #include "onlineservicesmodel.h"
+#endif
 #include "httpserver.h"
 #ifdef TAGLIB_FOUND
 #include "trackorganiser.h"
@@ -99,7 +104,6 @@
 #endif
 #include "coverdialog.h"
 #include "streamsmodel.h"
-#include "streamdialog.h"
 #include "playlistspage.h"
 #include "fancytabwidget.h"
 #include "timeslider.h"
@@ -112,8 +116,10 @@
 #include "mountpoints.h"
 #include "gtkproxystyle.h"
 #endif
+#ifdef ENABLE_DYNAMIC
 #include "dynamicpage.h"
 #include "dynamic.h"
+#endif
 #include "messagewidget.h"
 #include "groupedview.h"
 #include "actionitemdelegate.h"
@@ -122,6 +128,9 @@
 #include "action.h"
 #include "actioncollection.h"
 #include "stdactions.h"
+#ifdef ENABLE_HTTP_STREAM_PLAYBACK
+#include "httpstream.h"
+#endif
 #ifdef Q_OS_WIN
 static void raiseWindow(QWidget *w);
 #endif
@@ -135,8 +144,12 @@ enum Tabs
 
 bool DeleteKeyEventHandler::eventFilter(QObject *obj, QEvent *event)
 {
-    if (view->hasFocus() && QEvent::KeyRelease==event->type() && static_cast<QKeyEvent *>(event)->matches(QKeySequence::Delete)) {
-        act->trigger();
+    if (view->hasFocus() && QEvent::KeyRelease==event->type()) {
+        QKeyEvent *keyEvent=static_cast<QKeyEvent *>(event);
+
+        if (Qt::NoModifier==keyEvent->modifiers() && Qt::Key_Delete==keyEvent->key()) {
+            act->trigger();
+        }
         return true;
     }
     return QObject::eventFilter(obj, event);
@@ -156,12 +169,30 @@ static int nextKey(int &key)
     return k;
 }
 
+#ifndef Q_OS_WIN
+class ToolBarProxyStyle : public QProxyStyle
+{
+public:
+    ToolBarProxyStyle() : QProxyStyle() { setBaseStyle(qApp->style()); }
+    int pixelMetric(PixelMetric pm, const QStyleOption *o = 0, const QWidget *w = 0) const {
+        if (PM_ToolBarFrameWidth==pm || PM_ToolBarItemSpacing==pm || PM_ToolBarItemMargin==pm) {
+            return 0;
+        }
+        return baseStyle()->pixelMetric(pm, o, w);
+    }
+};
+#endif
+
 MainWindow::MainWindow(QWidget *parent)
     : MAIN_WINDOW_BASE_CLASS(parent)
     , loaded(0)
     , lastState(MPDState_Inactive)
     , lastSongId(-1)
     , autoScrollPlayQueue(true)
+    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+    , httpStream(new HttpStream(this))
+    #endif
+    , currentPage(0)
     #ifdef QT_QTDBUS_FOUND
     , mpris(0)
     #endif
@@ -170,16 +201,14 @@ MainWindow::MainWindow(QWidget *parent)
     #if !defined Q_OS_WIN && !defined Q_OS_MAC
     , mpdAccessibilityTimer(0)
     #endif
+    , contextTimer(0)
+    , contextSwitchTime(0)
     , connectedState(CS_Init)
     , stopAfterCurrent(false)
     , volumeFade(0)
     , origVolume(0)
     , lastVolume(0)
     , stopState(StopState_None)
-    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-    , httpStreamEnabled(false)
-    , httpStream(0)
-    #endif
 {
     QPoint p=pos();
     ActionCollection::setMainWidget(this);
@@ -202,25 +231,35 @@ MainWindow::MainWindow(QWidget *parent)
     MPDParseUtils::setGroupMultiple(Settings::self()->groupMultiple());
     Song::setUseComposer(Settings::self()->useComposer());
 
-    #ifdef Q_OS_MAC
-    #if QT_VERSION < 0x050000
-    setUnifiedTitleAndToolBarOnMac(true);
-    QToolBar *topToolBar = addToolBar("ToolBar");
-    #else
-    QMacNativeToolBar *topToolBar = new QMacNativeToolBar(this);
-    topToolBar->showInWindowForWidget(this);
-    #endif
-    toolbar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-    topToolBar->addWidget(toolbar); 
-    #else
-    GtkStyle::applyTheme(toolbar);
-    #endif
-    Icons::self()->self()->initToolbarIcons(artistLabel->palette().color(QPalette::Foreground), GtkStyle::useLightIcons());
+    #ifndef Q_OS_WIN
+    QSet<QString> basicThemes=QSet<QString>() << QLatin1String("QPlastiqueStyle") << QLatin1String("QCleanlooksStyle") << QLatin1String("QWindowsStyle") << QLatin1String("QFusionStyle");
+    if (!style() || !basicThemes.contains(style()->metaObject()->className())) {
+        #if defined Q_OS_MAC && QT_VERSION>=0x050000
+        QMacNativeToolBar *topToolBar = new QMacNativeToolBar(this);
+        topToolBar->showInWindowForWidget(this);
+        #else // defined Q_OS_MAC && QT_VERSION>=0x050000
+        setUnifiedTitleAndToolBarOnMac(true);
+        QToolBar *topToolBar = addToolBar("ToolBar");
+        #endif // defined Q_OS_MAC && QT_VERSION>=0x050000
+        toolbar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+        topToolBar->setObjectName("MainToolBar");
+        topToolBar->addWidget(toolbar);
+        topToolBar->setMovable(false);
+        topToolBar->setContextMenuPolicy(Qt::PreventContextMenu);
+        #ifndef Q_OS_MAC
+        GtkStyle::applyTheme(topToolBar);
+        #endif // Q_OS_MAC
+        topToolBar->setStyle(new ToolBarProxyStyle);
+        topToolBar->ensurePolished();
+    }
+    #endif // Q_OS_WIN
+
+    Icons::self()->initToolbarIcons(toolbar->palette().color(QPalette::Foreground));
     Icons::self()->initSidebarIcons();
     menuButton->setIcon(Icons::self()->toolbarMenuIcon);
     menuButton->setAlignedMenu(mainMenu);
 
-    // With ambiance (which has a drak toolbar) we need a gap between the toolbar and the earch fields. But, in the context view we dont
+    // With ambiance (which has a dark toolbar) we need a gap between the toolbar and the views. But, in the context view we dont
     // want a gap - as this looks odd with a background. To workaround this, the tabwidget and playqueue sides of the splitter have a
     // spacer added. The size of this needs to be controllable by the style - so we do this here...
     int spacing=Utils::layoutSpacing(this);
@@ -249,7 +288,6 @@ MainWindow::MainWindow(QWidget *parent)
     stopAfterTrackAction = ActionCollection::get()->createAction("stopaftertrack", i18n("Stop After Track"), Icons::self()->toolbarStopIcon);
     addPlayQueueToStoredPlaylistAction = ActionCollection::get()->createAction("addpqtostoredplaylist", i18n("Add To Stored Playlist"), Icons::self()->playlistIcon);
     removeFromPlayQueueAction = ActionCollection::get()->createAction("removefromplaylist", i18n("Remove From Play Queue"), "list-remove");
-    copyTrackInfoAction = ActionCollection::get()->createAction("copytrackinfo", i18n("Copy Track Info"));
     cropPlayQueueAction = ActionCollection::get()->createAction("cropplaylist", i18n("Crop"));
     shufflePlayQueueAction = ActionCollection::get()->createAction("shuffleplaylist", i18n("Shuffle Tracks"));
     shufflePlayQueueAlbumsAction = ActionCollection::get()->createAction("shuffleplaylistalbums", i18n("Shuffle Albums"));
@@ -265,8 +303,6 @@ MainWindow::MainWindow(QWidget *parent)
     repeatPlayQueueAction = ActionCollection::get()->createAction("repeatplaylist", i18n("Repeat"), Icons::self()->repeatIcon);
     singlePlayQueueAction = ActionCollection::get()->createAction("singleplaylist", i18n("Single"), Icons::self()->singleIcon, i18n("When 'Single' is activated, playback is stopped after current song, or song is repeated if 'Repeat' is enabled."));
     consumePlayQueueAction = ActionCollection::get()->createAction("consumeplaylist", i18n("Consume"), Icons::self()->consumeIcon, i18n("When consume is activated, a song is removed from the play queue after it has been played."));
-    searchPlayQueueAction = ActionCollection::get()->createAction("searchplaylist", i18n("Search Play Queue"), Icons::self()->searchIcon);
-    searchPlayQueueAction->setShortcut(Qt::ControlModifier+Qt::ShiftModifier+Qt::Key_F);
     setPriorityAction = ActionCollection::get()->createAction("setprio", i18n("Set Priority"), Icon("favorites"));
     #ifdef ENABLE_HTTP_STREAM_PLAYBACK
     streamPlayAction = ActionCollection::get()->createAction("streamplay", i18n("Play Stream"));
@@ -275,19 +311,26 @@ MainWindow::MainWindow(QWidget *parent)
     #ifdef TAGLIB_FOUND
     editPlayQueueTagsAction = ActionCollection::get()->createAction("editpqtags", i18n("Edit Song Tags"), "document-edit");
     #endif
-    showPlayQueueAction = ActionCollection::get()->createAction("showplayqueue", i18n("Play Queue"), Icons::self()->playqueueIcon);
+    addAction(showPlayQueueAction = ActionCollection::get()->createAction("showplayqueue", i18n("Play Queue"), Icons::self()->playqueueIcon));
     addAction(libraryTabAction = ActionCollection::get()->createAction("showlibrarytab", i18n("Artists"), Icons::self()->artistsIcon));
     addAction(albumsTabAction = ActionCollection::get()->createAction("showalbumstab", i18n("Albums"), Icons::self()->albumsIcon));
     addAction(foldersTabAction = ActionCollection::get()->createAction("showfolderstab", i18n("Folders"), Icons::self()->foldersIcon));
     addAction(playlistsTabAction = ActionCollection::get()->createAction("showplayliststab", i18n("Playlists"), Icons::self()->playlistsIcon));
+    #ifdef ENABLE_DYNAMIC
     addAction(dynamicTabAction = ActionCollection::get()->createAction("showdynamictab", i18n("Dynamic"), Icons::self()->dynamicIcon));
+    #endif
+    #ifdef ENABLE_STREAMS
     addAction(streamsTabAction = ActionCollection::get()->createAction("showstreamstab", i18n("Streams"), Icons::self()->streamsIcon));
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     addAction(onlineTabAction = ActionCollection::get()->createAction("showonlinetab", i18n("Online"), Icons::self()->onlineIcon));
+    #endif
     #ifdef ENABLE_DEVICES_SUPPORT
     addAction(devicesTabAction = ActionCollection::get()->createAction("showdevicestab", i18n("Devices"), Icons::self()->devicesIcon));
     #endif
-    expandAllAction = ActionCollection::get()->createAction("expandall", i18n("Expand All"));
-    collapseAllAction = ActionCollection::get()->createAction("collapseall", i18n("Collapse All"));
+    addAction(searchTabAction = ActionCollection::get()->createAction("showsearchtab", i18n("Search"), Icons::self()->searchTabIcon));
+    addAction(expandAllAction = ActionCollection::get()->createAction("expandall", i18n("Expand All")));
+    addAction(collapseAllAction = ActionCollection::get()->createAction("collapseall", i18n("Collapse All")));
     clearPlayQueueAction = ActionCollection::get()->createAction("confimclearplaylist", i18n("Remove All Songs"), Icons::self()->clearListIcon);
     clearPlayQueueAction->setShortcut(Qt::AltModifier+Qt::Key_Return);
     cancelAction = ActionCollection::get()->createAction("cancel", i18n("Cancel"), Icons::self()->cancelIcon);
@@ -311,7 +354,6 @@ MainWindow::MainWindow(QWidget *parent)
     StdActions::self()->stopAfterCurrentTrackAction->setGlobalShortcut(KShortcut());
     #endif
 
-    copyTrackInfoAction->setShortcut(QKeySequence::Copy);
     expandAllAction->setShortcut(Qt::ControlModifier+Qt::Key_Plus);
     collapseAllAction->setShortcut(Qt::ControlModifier+Qt::Key_Minus);
 
@@ -321,12 +363,19 @@ MainWindow::MainWindow(QWidget *parent)
     albumsTabAction->setShortcut(Qt::AltModifier+nextKey(pageKey));
     foldersTabAction->setShortcut(Qt::AltModifier+nextKey(pageKey));
     playlistsTabAction->setShortcut(Qt::AltModifier+nextKey(pageKey));
+    #ifdef ENABLE_DYNAMIC
     dynamicTabAction->setShortcut(Qt::AltModifier+nextKey(pageKey));
+    #endif
+    #ifdef ENABLE_STREAMS
     streamsTabAction->setShortcut(Qt::AltModifier+nextKey(pageKey));
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     onlineTabAction->setShortcut(Qt::AltModifier+nextKey(pageKey));
+    #endif
     #ifdef ENABLE_DEVICES_SUPPORT
     devicesTabAction->setShortcut(Qt::AltModifier+nextKey(pageKey));
     #endif // ENABLE_DEVICES_SUPPORT
+    searchTabAction->setShortcut(Qt::AltModifier+nextKey(pageKey));
 
     connectionsAction->setMenu(new QMenu(this));
     connectionsGroup=new QActionGroup(connectionsAction->menu());
@@ -349,19 +398,25 @@ MainWindow::MainWindow(QWidget *parent)
     albumsPage = new AlbumsPage(this);
     folderPage = new FolderPage(this);
     playlistsPage = new PlaylistsPage(this);
+    #ifdef ENABLE_DYNAMIC
     dynamicPage = new DynamicPage(this);
+    #endif
+    #ifdef ENABLE_STREAMS
     streamsPage = new StreamsPage(this);
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     onlinePage = new OnlineServicesPage(this);
+    #endif
     #ifdef ENABLE_DEVICES_SUPPORT
     devicesPage = new DevicesPage(this);
     #endif
+    searchPage = new SearchPage(this);
 
     promptClearPlayQueueAction->setEnabled(false);
     StdActions::self()->savePlayQueueAction->setEnabled(false);
     addStreamToPlayQueueAction->setEnabled(false);
     clearPlayQueueButton->setDefaultAction(promptClearPlayQueueAction);
     savePlayQueueButton->setDefaultAction(StdActions::self()->savePlayQueueAction);
-    searchPlayQueueButton->setDefaultAction(searchPlayQueueAction);
     randomButton->setDefaultAction(randomPlayQueueAction);
     repeatButton->setDefaultAction(repeatPlayQueueAction);
     singleButton->setDefaultAction(singlePlayQueueAction);
@@ -389,33 +444,29 @@ MainWindow::MainWindow(QWidget *parent)
     tabWidget->AddTab(albumsPage, TAB_ACTION(albumsTabAction), !hiddenPages.contains(albumsPage->metaObject()->className()));
     tabWidget->AddTab(folderPage, TAB_ACTION(foldersTabAction), !hiddenPages.contains(folderPage->metaObject()->className()));
     tabWidget->AddTab(playlistsPage, TAB_ACTION(playlistsTabAction), !hiddenPages.contains(playlistsPage->metaObject()->className()));
+    #ifdef ENABLE_DYNAMIC
     tabWidget->AddTab(dynamicPage, TAB_ACTION(dynamicTabAction), !hiddenPages.contains(dynamicPage->metaObject()->className()));
+    #endif
+    #ifdef ENABLE_STREAMS
     tabWidget->AddTab(streamsPage, TAB_ACTION(streamsTabAction), !hiddenPages.contains(streamsPage->metaObject()->className()));
+    streamsPage->setEnabled(!hiddenPages.contains(streamsPage->metaObject()->className()));
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     tabWidget->AddTab(onlinePage, TAB_ACTION(onlineTabAction), !hiddenPages.contains(onlinePage->metaObject()->className()));
+    onlinePage->setEnabled(!hiddenPages.contains(onlinePage->metaObject()->className()));
+    #endif
     #ifdef ENABLE_DEVICES_SUPPORT
     tabWidget->AddTab(devicesPage, TAB_ACTION(devicesTabAction), !hiddenPages.contains(devicesPage->metaObject()->className()));
     DevicesModel::self()->setEnabled(!hiddenPages.contains(devicesPage->metaObject()->className()));
     #endif
+    tabWidget->AddTab(searchPage, TAB_ACTION(searchTabAction), !hiddenPages.contains(searchPage->metaObject()->className()));
     tabWidget->AddTab(contextPage, Icons::self()->infoSidebarIcon, i18n("Info"), songInfoAction->text(),
                       !hiddenPages.contains(contextPage->metaObject()->className()));
+    tabWidget->Recreate();
     AlbumsModel::self()->setEnabled(!hiddenPages.contains(albumsPage->metaObject()->className()));
     folderPage->setEnabled(!hiddenPages.contains(folderPage->metaObject()->className()));
-    streamsPage->setEnabled(!hiddenPages.contains(streamsPage->metaObject()->className()));
-    onlinePage->setEnabled(!hiddenPages.contains(onlinePage->metaObject()->className()));
     setPlaylistsEnabled(!hiddenPages.contains(playlistsPage->metaObject()->className()));
 
-    autoHideSplitterAction=new QAction(i18n("Auto Hide"), this);
-    autoHideSplitterAction->setCheckable(true);
-    autoHideSplitterAction->setChecked(Settings::self()->splitterAutoHide());
-    tabWidget->addMenuAction(autoHideSplitterAction);
-    connect(autoHideSplitterAction, SIGNAL(toggled(bool)), this, SLOT(toggleSplitterAutoHide()));
-
-    monoIconsAction=new QAction(i18n("Monochrome Icons"), this);
-    monoIconsAction->setCheckable(true);
-    monoIconsAction->setChecked(Settings::self()->monoSidebarIcons());
-    tabWidget->addStyleAction(monoIconsAction);
-    connect(monoIconsAction, SIGNAL(toggled(bool)), this, SLOT(toggleMonoIcons()));
-
     if (playQueueInSidebar) {
         tabToggled(PAGE_PLAYQUEUE);
     } else {
@@ -427,8 +478,6 @@ MainWindow::MainWindow(QWidget *parent)
     } else {
         tabWidget->ToggleTab(PAGE_CONTEXT, false);
     }
-
-    tabWidget->SetMode(FancyTabWidget::Mode_LargeSidebar);
     initSizes();
 
     expandInterfaceAction->setCheckable(true);
@@ -439,6 +488,8 @@ MainWindow::MainWindow(QWidget *parent)
     consumePlayQueueAction->setCheckable(true);
     #ifdef ENABLE_HTTP_STREAM_PLAYBACK
     streamPlayAction->setCheckable(true);
+    streamPlayAction->setChecked(false);
+    streamPlayAction->setVisible(false);
     #endif
 
     songInfoButton->setDefaultAction(songInfoAction);
@@ -458,16 +509,27 @@ MainWindow::MainWindow(QWidget *parent)
     } else if (repeatButton->iconSize().height()>=22) {
         controlIconSize=playbackIconSize=32;
         controlButtonSize=36;
-    } else if (QLatin1String("oxygen")!=Icon::currentTheme().toLower() || (GtkStyle::isActive() && GtkStyle::useLightIcons())) {
+    } else if (QLatin1String("oxygen")!=Icon::currentTheme().toLower() || (GtkStyle::isActive() && GtkStyle::useSymbolicIcons())) {
         // Oxygen does not have 24x24 icons, and media players seem to use scaled 28x28 icons...
         // But, if the theme does have media icons at 24x24 use these - as they will be sharper...
         playbackIconSize=24==Icons::self()->toolbarPlayIcon.actualSize(QSize(24, 24)).width() ? 24 : 28;
     }
+    #ifdef USE_SYSTEM_MENU_ICON
+    if (GtkStyle::isActive() && GtkStyle::useSymbolicIcons()) {
+        controlIconSize=22==controlIconSize ? 16 : 32==controlIconSize ? 22 : 32;
+    }
+    #endif
+    stopTrackButton->setHideMenuIndicator(true);
     int playbackButtonSize=28==playbackIconSize ? 34 : controlButtonSize;
     foreach (QToolButton *b, controlBtns) {
         b->setAutoRaise(true);
         b->setToolButtonStyle(Qt::ToolButtonIconOnly);
         b->setIconSize(QSize(controlIconSize, controlIconSize));
+        #ifdef USE_SYSTEM_MENU_ICON
+        if (b==menuButton && !GtkStyle::isActive()) {
+            b->setFixedHeight(controlButtonSize);
+        } else
+        #endif
         b->setFixedSize(QSize(controlButtonSize, controlButtonSize));
     }
     foreach (QToolButton *b, playbackBtns) {
@@ -477,9 +539,6 @@ MainWindow::MainWindow(QWidget *parent)
         b->setFixedSize(QSize(playbackButtonSize, playbackButtonSize));
     }
 
-    trackLabel->setText(QString());
-    artistLabel->setText(QString());
-
     expandInterfaceAction->setChecked(Settings::self()->showPlaylist());
     fullScreenAction->setEnabled(expandInterfaceAction->isChecked());
     if (fullScreenAction->isEnabled()) {
@@ -489,15 +548,11 @@ MainWindow::MainWindow(QWidget *parent)
     repeatPlayQueueAction->setChecked(false);
     singlePlayQueueAction->setChecked(false);
     consumePlayQueueAction->setChecked(false);
-    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-    streamPlayAction->setChecked(false);
-    streamPlayAction->setVisible(false);
-    #endif
 
     MusicLibraryItemAlbum::setCoverSize((MusicLibraryItemAlbum::CoverSize)Settings::self()->libraryCoverSize());
     MusicLibraryItemAlbum::setShowDate(Settings::self()->libraryYear());
     AlbumsModel::setCoverSize((MusicLibraryItemAlbum::CoverSize)Settings::self()->albumsCoverSize());
-    tabWidget->SetMode((FancyTabWidget::Mode)Settings::self()->sidebar());
+    tabWidget->setStyle(Settings::self()->sidebar());
     expandedSize=Settings::self()->mainWindowSize();
     collapsedSize=Settings::self()->mainWindowCollapsedSize();
 
@@ -543,11 +598,17 @@ MainWindow::MainWindow(QWidget *parent)
     serverInfoAction=ActionCollection::get()->createAction("mpdinfo", i18n("Server information..."), "network-server");
     connect(serverInfoAction, SIGNAL(triggered(bool)),this, SLOT(showServerInfo()));
     serverInfoAction->setEnabled(Settings::self()->firstRun());
+    refreshDbAction = ActionCollection::get()->createAction("refresh", i18n("Refresh Database"), "view-refresh");
+    doDbRefreshAction = new Action(refreshDbAction->icon(), i18n("Refresh"), this);
+    refreshDbAction->setEnabled(false);
     #ifdef ENABLE_KDE_SUPPORT
     mainMenu->addAction(prefAction);
+    mainMenu->addAction(refreshDbAction);
     shortcutsAction=static_cast<Action *>(KStandardAction::keyBindings(this, SLOT(configureShortcuts()), ActionCollection::get()));
     mainMenu->addAction(shortcutsAction);
     mainMenu->addSeparator();
+    mainMenu->addAction(StdActions::self()->searchAction);
+    mainMenu->addSeparator();
     mainMenu->addAction(serverInfoAction);
     mainMenu->addMenu(helpMenu());
     #else
@@ -557,6 +618,9 @@ MainWindow::MainWindow(QWidget *parent)
     #endif
     connect(prefAction, SIGNAL(triggered(bool)),this, SLOT(showPreferencesDialog()));
     mainMenu->addAction(prefAction);
+    mainMenu->addAction(refreshDbAction);
+    mainMenu->addSeparator();
+    mainMenu->addAction(StdActions::self()->searchAction);
     mainMenu->addSeparator();
     Action *aboutAction=ActionCollection::get()->createAction("about", i18nc("Qt-only", "About Cantata..."), Icons::self()->appIcon);
     connect(aboutAction, SIGNAL(triggered(bool)),this, SLOT(showAboutDialog()));
@@ -571,8 +635,12 @@ MainWindow::MainWindow(QWidget *parent)
     if (Utils::Unity==Utils::currentDe()) {
     #endif
         QMenu *menu=new QMenu(i18n("&File"), this);
+        menu->addAction(refreshDbAction);
         menu->addAction(quitAction);
         menuBar()->addMenu(menu);
+        menu=new QMenu(i18n("&Edit"), this);
+        menu->addAction(StdActions::self()->searchAction);
+        menuBar()->addMenu(menu);
         menu=new QMenu(i18n("&Settings"), this);
         menu->addAction(expandInterfaceAction);
         menu->addAction(songInfoAction);
@@ -599,6 +667,7 @@ MainWindow::MainWindow(QWidget *parent)
         menu->addAction(aboutAction);
         #endif
         menuBar()->addMenu(menu);
+        QTimer::singleShot(0, this, SLOT(hideMenuBar()));
     #if !defined Q_OS_MAC
     }
     #endif
@@ -606,7 +675,9 @@ MainWindow::MainWindow(QWidget *parent)
 
     dynamicLabel->setVisible(false);
     stopDynamicButton->setVisible(false);
+    #ifdef ENABLE_DYNAMIC
     stopDynamicButton->setDefaultAction(Dynamic::self()->stopAct());
+    #endif
     StdActions::self()->addWithPriorityAction->setVisible(false);
     setPriorityAction->setVisible(false);
     setPriorityAction->setMenu(StdActions::self()->addWithPriorityAction->menu());
@@ -625,6 +696,8 @@ MainWindow::MainWindow(QWidget *parent)
     playQueue->addAction(cropPlayQueueAction);
     playQueue->addAction(shufflePlayQueueAction);
     playQueue->addAction(shufflePlayQueueAlbumsAction);
+    playQueue->addAction(playQueueModel.undoAct());
+    playQueue->addAction(playQueueModel.redoAct());
     Action *sep=new Action(this);
     sep->setSeparator(true);
     playQueue->addAction(sep);
@@ -634,14 +707,10 @@ MainWindow::MainWindow(QWidget *parent)
     #ifdef TAGLIB_FOUND
     playQueue->addAction(editPlayQueueTagsAction);
     #endif
-    //playQueue->addAction(copyTrackInfoAction);
+    playQueue->addAction(playQueueModel.removeDuplicatesAct());
     playQueue->tree()->installEventFilter(new DeleteKeyEventHandler(playQueue->tree(), removeFromPlayQueueAction));
     playQueue->list()->installEventFilter(new DeleteKeyEventHandler(playQueue->list(), removeFromPlayQueueAction));
-    playQueue->setGrouped(Settings::self()->playQueueGrouped());
-    playQueue->setAutoExpand(Settings::self()->playQueueAutoExpand());
-    playQueue->setStartClosed(Settings::self()->playQueueStartClosed());
-    playQueue->setUseCoverAsBackgrond(Settings::self()->playQueueBackground());
-
+    playQueue->readConfig();
     playlistsPage->setStartClosed(Settings::self()->playListsStartClosed());
 
     connect(StdActions::self()->addPrioHighestAction, SIGNAL(triggered(bool)), this, SLOT(addWithPriority()));
@@ -659,9 +728,6 @@ MainWindow::MainWindow(QWidget *parent)
     connect(this, SIGNAL(play()), MPDConnection::self(), SLOT(play()));
     connect(this, SIGNAL(stop(bool)), MPDConnection::self(), SLOT(stopPlaying(bool)));
     connect(this, SIGNAL(getStatus()), MPDConnection::self(), SLOT(getStatus()));
-    connect(this, SIGNAL(getStats(bool)), MPDConnection::self(), SLOT(getStats(bool)));
-    connect(this, SIGNAL(updateMpd()), MPDConnection::self(), SLOT(update()));
-    connect(this, SIGNAL(clear()), MPDConnection::self(), SLOT(clear()));
     connect(this, SIGNAL(playListInfo()), MPDConnection::self(), SLOT(playListInfo()));
     connect(this, SIGNAL(currentSong()), MPDConnection::self(), SLOT(currentSong()));
     connect(this, SIGNAL(setSeekId(qint32, quint32)), MPDConnection::self(), SLOT(setSeekId(qint32, quint32)));
@@ -669,7 +735,6 @@ MainWindow::MainWindow(QWidget *parent)
     connect(this, SIGNAL(setDetails(const MPDConnectionDetails &)), MPDConnection::self(), SLOT(setDetails(const MPDConnectionDetails &)));
     connect(this, SIGNAL(setPriority(const QList<qint32> &, quint8 )), MPDConnection::self(), SLOT(setPriority(const QList<qint32> &, quint8)));
     connect(this, SIGNAL(addSongsToPlaylist(const QString &, const QStringList &)), MPDConnection::self(), SLOT(addToPlaylist(const QString &, const QStringList &)));
-    connect(this, SIGNAL(addAndPlay(QString)), MPDConnection::self(), SLOT(addAndPlay(QString)));
     connect(&playQueueModel, SIGNAL(statsUpdated(int, quint32)), this, SLOT(updatePlayQueueStats(int, quint32)));
     connect(&playQueueModel, SIGNAL(fetchingStreams()), playQueue, SLOT(showSpinner()));
     connect(&playQueueModel, SIGNAL(streamsFetched()), playQueue, SLOT(hideSpinner()));
@@ -677,10 +742,14 @@ MainWindow::MainWindow(QWidget *parent)
     connect(&playQueueModel, SIGNAL(streamFetchStatus(QString)), playQueue, SLOT(streamFetchStatus(QString)));
     connect(playQueue, SIGNAL(cancelStreamFetch()), &playQueueModel, SLOT(cancelStreamFetch()));
     connect(playQueue, SIGNAL(itemsSelected(bool)), SLOT(playQueueItemsSelected(bool)));
+    #ifdef ENABLE_STREAMS
     connect(streamsPage, SIGNAL(add(const QStringList &, bool, quint8)), &playQueueModel, SLOT(addItems(const QStringList &, bool, quint8)));
     connect(streamsPage, SIGNAL(error(QString)), this, SLOT(showError(QString)));
     connect(streamsPage, SIGNAL(showPreferencesPage(QString)), this, SLOT(showPreferencesDialog(QString)));
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     connect(onlinePage, SIGNAL(showPreferencesPage(QString)), this, SLOT(showPreferencesDialog(QString)));
+    #endif
     connect(MPDStats::self(), SIGNAL(updated()), this, SLOT(updateStats()));
     connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(updateStatus()));
     connect(MPDConnection::self(), SIGNAL(playlistUpdated(const QList<Song> &)), this, SLOT(updatePlayQueue(const QList<Song> &)));
@@ -690,11 +759,14 @@ MainWindow::MainWindow(QWidget *parent)
     connect(MPDConnection::self(), SIGNAL(error(const QString &, bool)), SLOT(showError(const QString &, bool)));
     connect(MPDConnection::self(), SIGNAL(info(const QString &)), SLOT(showInformation(const QString &)));
     connect(MPDConnection::self(), SIGNAL(dirChanged()), SLOT(checkMpdDir()));
+    #ifdef ENABLE_DYNAMIC
     connect(Dynamic::self(), SIGNAL(error(const QString &)), SLOT(showError(const QString &)));
     connect(Dynamic::self(), SIGNAL(running(bool)), dynamicLabel, SLOT(setVisible(bool)));
     connect(Dynamic::self(), SIGNAL(running(bool)), this, SLOT(controlDynamicButton()));
-    connect(StdActions::self()->refreshAction, SIGNAL(triggered(bool)), this, SLOT(refresh()));
-    connect(StdActions::self()->refreshAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(update()));
+    #endif
+    connect(refreshDbAction, SIGNAL(triggered(bool)), this, SLOT(refreshDbPromp()));
+    connect(doDbRefreshAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(update()));
+    connect(doDbRefreshAction, SIGNAL(triggered(bool)), messageWidget, SLOT(animatedHide()));
     connect(connectAction, SIGNAL(triggered(bool)), this, SLOT(connectToMpd()));
     connect(StdActions::self()->prevTrackAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(goToPrevious()));
     connect(StdActions::self()->nextTrackAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(goToNext()));
@@ -709,12 +781,12 @@ MainWindow::MainWindow(QWidget *parent)
     connect(singlePlayQueueAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(setSingle(bool)));
     connect(consumePlayQueueAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(setConsume(bool)));
     #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-    connect(streamPlayAction, SIGNAL(triggered(bool)), this, SLOT(toggleStream(bool)));
+    connect(streamPlayAction, SIGNAL(triggered(bool)), httpStream, SLOT(setEnabled(bool)));
     connect(MPDConnection::self(), SIGNAL(streamUrl(QString)), SLOT(streamUrl(QString)));
     #endif
-    connect(StdActions::self()->backAction, SIGNAL(triggered(bool)), this, SLOT(goBack()));
     connect(playQueueSearchWidget, SIGNAL(returnPressed()), this, SLOT(searchPlayQueue()));
     connect(playQueueSearchWidget, SIGNAL(textChanged(const QString)), this, SLOT(searchPlayQueue()));
+    connect(playQueueSearchWidget, SIGNAL(active(bool)), this, SLOT(playQueueSearchActivated(bool)));
     connect(playQueue, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(playQueueItemActivated(const QModelIndex &)));
     connect(StdActions::self()->removeAction, SIGNAL(triggered(bool)), this, SLOT(removeItems()));
     connect(StdActions::self()->addToPlayQueueAction, SIGNAL(triggered(bool)), this, SLOT(addToPlayQueue()));
@@ -723,7 +795,6 @@ MainWindow::MainWindow(QWidget *parent)
     connect(removeFromPlayQueueAction, SIGNAL(triggered(bool)), this, SLOT(removeFromPlayQueue()));
     connect(promptClearPlayQueueAction, SIGNAL(triggered(bool)), playQueueSearchWidget, SLOT(clear()));
     connect(promptClearPlayQueueAction, SIGNAL(triggered(bool)), this, SLOT(promptClearPlayQueue()));
-    connect(copyTrackInfoAction, SIGNAL(triggered(bool)), this, SLOT(copyTrackInfo()));
     connect(cropPlayQueueAction, SIGNAL(triggered(bool)), this, SLOT(cropPlayQueue()));
     connect(shufflePlayQueueAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(shuffle()));
     connect(shufflePlayQueueAlbumsAction, SIGNAL(triggered(bool)), &playQueueModel, SLOT(shuffleAlbums()));
@@ -737,19 +808,24 @@ MainWindow::MainWindow(QWidget *parent)
     #endif
     connect(context, SIGNAL(findArtist(QString)), this, SLOT(locateArtist(QString)));
     connect(context, SIGNAL(findAlbum(QString,QString)), this, SLOT(locateAlbum(QString,QString)));
-    connect(context, SIGNAL(playSong(QString)), this, SLOT(playSong(QString)));
+    connect(context, SIGNAL(playSong(QString)), &playQueueModel, SLOT(playSong(QString)));
     connect(locateTrackAction, SIGNAL(triggered(bool)), this, SLOT(locateTrack()));
     connect(showPlayQueueAction, SIGNAL(triggered(bool)), this, SLOT(showPlayQueue()));
     connect(libraryTabAction, SIGNAL(triggered(bool)), this, SLOT(showLibraryTab()));
     connect(albumsTabAction, SIGNAL(triggered(bool)), this, SLOT(showAlbumsTab()));
     connect(foldersTabAction, SIGNAL(triggered(bool)), this, SLOT(showFoldersTab()));
     connect(playlistsTabAction, SIGNAL(triggered(bool)), this, SLOT(showPlaylistsTab()));
+    #ifdef ENABLE_DYNAMIC
     connect(dynamicTabAction, SIGNAL(triggered(bool)), this, SLOT(showDynamicTab()));
+    #endif
+    #ifdef ENABLE_STREAMS
     connect(streamsTabAction, SIGNAL(triggered(bool)), this, SLOT(showStreamsTab()));
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     connect(onlineTabAction, SIGNAL(triggered(bool)), this, SLOT(showOnlineTab()));
-    addAction(StdActions::self()->searchAction); // Weird, but if I dont add thiis action, it does not work!!!!
+    #endif
+    connect(searchTabAction, SIGNAL(triggered(bool)), this, SLOT(showSearchTab()));
     connect(StdActions::self()->searchAction, SIGNAL(triggered(bool)), SLOT(showSearch()));
-    connect(searchPlayQueueAction, SIGNAL(triggered(bool)), playQueueSearchWidget, SLOT(activate()));
     connect(expandAllAction, SIGNAL(triggered(bool)), this, SLOT(expandAll()));
     connect(collapseAllAction, SIGNAL(triggered(bool)), this, SLOT(collapseAll()));
     #ifdef ENABLE_DEVICES_SUPPORT
@@ -761,7 +837,11 @@ MainWindow::MainWindow(QWidget *parent)
     connect(folderPage, SIGNAL(addToDevice(const QString &, const QString &, const QList<Song> &)), SLOT(copyToDevice(const QString &, const QString &, const QList<Song> &)));
     connect(playlistsPage, SIGNAL(addToDevice(const QString &, const QString &, const QList<Song> &)), SLOT(copyToDevice(const QString &, const QString &, const QList<Song> &)));
     connect(devicesPage, SIGNAL(addToDevice(const QString &, const QString &, const QList<Song> &)), SLOT(copyToDevice(const QString &, const QString &, const QList<Song> &)));
+    #ifdef ENABLE_ONLINE_SERVICES
     connect(onlinePage, SIGNAL(addToDevice(const QString &, const QString &, const QList<Song> &)), SLOT(copyToDevice(const QString &, const QString &, const QList<Song> &)));
+    connect(OnlineServicesModel::self(), SIGNAL(error(const QString &)), this, SLOT(showError(const QString &)));
+    #endif
+    connect(searchPage, SIGNAL(addToDevice(const QString &, const QString &, const QList<Song> &)), SLOT(copyToDevice(const QString &, const QString &, const QList<Song> &)));
     connect(StdActions::self()->deleteSongsAction, SIGNAL(triggered(bool)), SLOT(deleteSongs()));
     connect(devicesPage, SIGNAL(deleteSongs(const QString &, const QList<Song> &)), SLOT(deleteSongs(const QString &, const QList<Song> &)));
     connect(libraryPage, SIGNAL(deleteSongs(const QString &, const QList<Song> &)), SLOT(deleteSongs(const QString &, const QList<Song> &)));
@@ -781,7 +861,6 @@ MainWindow::MainWindow(QWidget *parent)
     #if !defined Q_OS_WIN && !defined Q_OS_MAC
     connect(MountPoints::self(), SIGNAL(updated()), SLOT(checkMpdAccessibility()));
     #endif
-    connect(OnlineServicesModel::self(), SIGNAL(error(const QString &)), this, SLOT(showError(const QString &)));
     playQueueItemsSelected(false);
     playQueue->setFocus();
     playQueue->initHeader();
@@ -799,14 +878,13 @@ MainWindow::MainWindow(QWidget *parent)
 
     connect(tabWidget, SIGNAL(CurrentChanged(int)), this, SLOT(currentTabChanged(int)));
     connect(tabWidget, SIGNAL(TabToggled(int)), this, SLOT(tabToggled(int)));
-    connect(tabWidget, SIGNAL(ModeChanged(FancyTabWidget::Mode)), this, SLOT(sidebarModeChanged()));
+    connect(tabWidget, SIGNAL(styleChanged(int)), this, SLOT(sidebarModeChanged()));
+    connect(tabWidget, SIGNAL(configRequested()), this, SLOT(showSidebarPreferencesPage()));
     connect(messageWidget, SIGNAL(visible(bool)), this, SLOT(messageWidgetVisibility(bool)));
 
-    toggleSplitterAutoHide();
     readSettings();
     updateConnectionsMenu();
     fadeStop=Settings::self()->stopFadeDuration()>Settings::MinFade;
-    //playlistsPage->refresh();
     #ifdef QT_QTDBUS_FOUND
     mpris=new Mpris(this);
     connect(coverWidget, SIGNAL(coverFile(const QString &)), mpris, SLOT(updateCurrentCover(const QString &)));
@@ -818,15 +896,11 @@ MainWindow::MainWindow(QWidget *parent)
         move(p.isNull() ? QPoint(96, 96) : p);
     }
 
-    // If this is the first run, then the wizard will have done the MPD connection. But this will not have loaded the model!
-    // So, we need to load this now - which is done in currentTabChanged()
-    if (Settings::self()->firstRun() ||
-        (PAGE_LIBRARY!=tabWidget->current_index() && PAGE_ALBUMS!=tabWidget->current_index() &&
-         PAGE_FOLDERS!=tabWidget->current_index() && PAGE_PLAYLISTS!=tabWidget->current_index())) {
-        currentTabChanged(tabWidget->current_index());
-    }
+    currentTabChanged(tabWidget->current_index());
+
     if (Settings::self()->firstRun() && MPDConnection::self()->isConnected()) {
         mpdConnectionStateChanged(true);
+        updateStats();
     }
     #ifndef ENABLE_KDE_SUPPORT
     MediaKeys::self()->load();
@@ -836,7 +910,7 @@ MainWindow::MainWindow(QWidget *parent)
 
 MainWindow::~MainWindow()
 {
-    playQueueModel.removeCantataStreams();
+    bool hadCantataStreams=playQueueModel.removeCantataStreams();
     Settings::self()->saveShowFullScreen(fullScreenAction->isChecked());
     if (!fullScreenAction->isChecked()) {
         Settings::self()->saveMainWindowSize(expandInterfaceAction->isChecked() ? size() : expandedSize);
@@ -851,37 +925,46 @@ MainWindow::~MainWindow()
         }
         Settings::self()->saveShowPlaylist(expandInterfaceAction->isChecked());
     }
-    Settings::self()->saveSplitterAutoHide(autoHideSplitterAction->isChecked());
-    Settings::self()->saveSidebar((int)(tabWidget->mode()));
     Settings::self()->savePage(tabWidget->currentWidget()->metaObject()->className());
-    playQueue->saveHeader();
-    Settings::self()->saveHiddenPages(tabWidget->hiddenPages());
+    playQueue->saveConfig();
+    playlistsPage->saveConfig();
     context->saveConfig();
+    #ifdef ENABLE_STREAMS
     streamsPage->save();
-    positionSlider->saveConfig();
     StreamsModel::self()->save();
+    #endif
+    searchPage->saveConfig();
+    positionSlider->saveConfig();
+    #ifdef ENABLE_ONLINE_SERVICES
     OnlineServicesModel::self()->save();
+    #endif
     Settings::self()->saveForceSingleClick(TreeView::getForceSingleClick());
-    Settings::self()->saveStartHidden(trayItem->isActive() && isHidden() && Settings::self()->minimiseOnClose());
+    Settings::StartupState startupState=Settings::self()->startupState();
+    Settings::self()->saveStartHidden(trayItem->isActive() && Settings::self()->minimiseOnClose() &&
+                                      ( (isHidden() && Settings::SS_ShowMainWindow!=startupState) ||
+                                        (Settings::SS_HideMainWindow==startupState) ) );
     Settings::self()->save(true);
     disconnect(MPDConnection::self(), 0, 0, 0);
+    #ifdef ENABLE_DYNAMIC
     if (Settings::self()->stopDynamizerOnExit()) {
         Dynamic::self()->stop();
     }
+    #endif
     if (Settings::self()->stopOnExit() || (fadeWhenStop() && StopState_Stopping==stopState)) {
         emit stop();
+        // Allow time for stop to be sent...
+        Utils::sleep();
+    } else if (hadCantataStreams) {
+        // Allow time for removal of cantata streams...
         Utils::sleep();
     }
-    MPDConnection::self()->stop();
-    Covers::self()->stop();
     #ifdef ENABLE_DEVICES_SUPPORT
-    FileThread::self()->stop();
     DevicesModel::self()->stop();
     #endif
-    OnlineServicesModel::self()->stop();
     #ifndef ENABLE_KDE_SUPPORT
     MediaKeys::self()->stop();
     #endif
+    ThreadCleaner::self()->stopAll();
 }
 
 void MainWindow::initSizes()
@@ -902,16 +985,15 @@ void MainWindow::initSizes()
     int tabSize=tabWidget->tabSize().width();
     if ((cwSize<tabSize && (tabSize-cwSize)<(tabSize/3)) || (cwSize>tabSize && (cwSize-tabSize)<(cwSize/3))) {
         cwSize=tabSize;
+    } else {
+        cwSize=qMax(cwSize, FancyTabWidget::iconSize()*2);
     }
-
-    coverWidget->setMinimumSize(cwSize, cwSize);
-    coverWidget->setMaximumSize(cwSize, cwSize);
+    coverWidget->setFixedSize(cwSize, cwSize);
 }
 
 void MainWindow::load(const QStringList &urls)
 {
     QStringList useable;
-    bool haveHttp=HttpServer::self()->isAlive();
 
     foreach (const QString &path, urls) {
         QUrl u(path);
@@ -923,8 +1005,12 @@ void MainWindow::load(const QStringList &urls)
         #endif
         if (QLatin1String("http")==u.scheme()) {
             useable.append(u.toString());
-        } else if (haveHttp && (u.scheme().isEmpty() || QLatin1String("file")==u.scheme())) {
-            useable.append(HttpServer::self()->encodeUrl(u.path()));
+        } else if (u.scheme().isEmpty() || QLatin1String("file")==u.scheme()) {
+            if (!HttpServer::self()->forceUsage() && MPDConnection::self()->getDetails().isLocal()  && !u.path().startsWith(QLatin1String("/media/"))) {
+                useable.append(QLatin1String("file://")+u.path());
+            } else if (HttpServer::self()->isAlive()) {
+                useable.append(HttpServer::self()->encodeUrl(u.path()));
+            }
         }
     }
     if (useable.count()) {
@@ -956,6 +1042,10 @@ void MainWindow::showError(const QString &message, bool showActions)
     } else {
         messageWidget->removeAllActions();
     }
+    if (!message.isEmpty()) {
+        expand();
+    }
+    QApplication::alert(this);
 }
 
 void MainWindow::showInformation(const QString &message)
@@ -977,7 +1067,8 @@ void MainWindow::messageWidgetVisibility(bool v)
 
 void MainWindow::mpdConnectionStateChanged(bool connected)
 {
-    serverInfoAction->setEnabled(connected);
+    serverInfoAction->setEnabled(connected && !MPDConnection::self()->isMopdidy());
+    refreshDbAction->setEnabled(connected);
     addStreamToPlayQueueAction->setEnabled(connected);
     if (connected) {
         messageWidget->hide();
@@ -1001,11 +1092,13 @@ void MainWindow::mpdConnectionStateChanged(bool connected)
         folderPage->clear();
         playlistsPage->clear();
         playQueueModel.clear();
+        searchPage->clear();
         connectedState=CS_Disconnected;
         outputsAction->setVisible(false);
         MPDStatus dummyStatus;
         updateStatus(&dummyStatus);
     }
+    controlPlaylistActions();
 }
 
 void MainWindow::keyPressEvent(QKeyEvent *event)
@@ -1028,7 +1121,6 @@ void MainWindow::closeEvent(QCloseEvent *event)
             event->ignore();
         }
     } else {
-        GtkStyle::cleanup();
         MAIN_WINDOW_BASE_CLASS::closeEvent(event);
     }
 }
@@ -1039,8 +1131,8 @@ void MainWindow::playQueueItemsSelected(bool s)
     bool haveItems=rc>0;
     bool singleSelection=1==playQueue->selectedIndexes(false).count(); // Dont need sorted selection here...
     removeFromPlayQueueAction->setEnabled(s && haveItems);
+    setPriorityAction->setEnabled(s && haveItems);
     locateTrackAction->setEnabled(singleSelection);
-    copyTrackInfoAction->setEnabled(s && haveItems);
     cropPlayQueueAction->setEnabled(playQueue->haveUnSelectedItems() && haveItems);
     shufflePlayQueueAction->setEnabled(rc>1);
     shufflePlayQueueAlbumsAction->setEnabled(rc>1);
@@ -1059,9 +1151,12 @@ void MainWindow::connectToMpd(const MPDConnectionDetails &details)
         folderPage->clear();
         playlistsPage->clear();
         playQueueModel.clear();
+        searchPage->clear();
+        #ifdef ENABLE_DYNAMIC
         if (!MPDConnection::self()->getDetails().isEmpty() && details!=MPDConnection::self()->getDetails()) {
             Dynamic::self()->stop();
         }
+        #endif
         showInformation(i18n("Connecting to %1", details.description()));
         outputsAction->setVisible(false);
         if (CS_Init!=connectedState) {
@@ -1081,16 +1176,21 @@ void MainWindow::streamUrl(const QString &u)
     #ifdef ENABLE_HTTP_STREAM_PLAYBACK
     streamPlayAction->setVisible(!u.isEmpty());
     streamPlayAction->setChecked(streamPlayAction->isVisible() && Settings::self()->playStream());
-    toggleStream(streamPlayAction->isChecked(), u);
+    httpStream->setEnabled(streamPlayAction->isChecked());
     #else
     Q_UNUSED(u)
     #endif
 }
 
-void MainWindow::refresh()
+void MainWindow::refreshDbPromp()
 {
-    MusicLibraryModel::self()->removeCache();
-    emit getStats(true);
+    if (QDialogButtonBox::GnomeLayout==style()->styleHint(QStyle::SH_DialogButtonLayout)) {
+        messageWidget->setActions(QList<QAction*>() << cancelAction << doDbRefreshAction);
+    } else {
+        messageWidget->setActions(QList<QAction*>() << doDbRefreshAction << cancelAction);
+    }
+    messageWidget->setWarning(i18n("Refresh MPD Database?"), false);
+    expand();
 }
 
 #ifdef ENABLE_KDE_SUPPORT
@@ -1108,6 +1208,14 @@ void MainWindow::saveShortcuts()
 }
 #endif
 
+void MainWindow::expand()
+{
+    if (!expandInterfaceAction->isChecked()) {
+        expandInterfaceAction->setChecked(true);
+        expandOrCollapse();
+    }
+}
+
 bool MainWindow::canShowDialog()
 {
     if (PreferencesDialog::instanceCount() || CoverDialog::instanceCount()
@@ -1129,16 +1237,18 @@ bool MainWindow::canShowDialog()
 
 void MainWindow::showPreferencesDialog(const QString &page)
 {
-    if (PreferencesDialog::instanceCount() && !page.isEmpty()) {
-        emit showPreferencesPage(page);
+    if (PreferencesDialog::instanceCount()) {
+        emit showPreferencesPage(page.isEmpty() ? "collection" : page);
     }
     if (PreferencesDialog::instanceCount() || !canShowDialog()) {
         return;
     }
-    PreferencesDialog *pref=new PreferencesDialog(this, tabWidget->hiddenPages());
+    PreferencesDialog *pref=new PreferencesDialog(this);
     controlConnectionsMenu(false);
     connect(pref, SIGNAL(settingsSaved()), this, SLOT(updateSettings()));
+    #ifdef ENABLE_STREAMS
     connect(pref, SIGNAL(reloadStreams()), streamsPage, SLOT(refresh()));
+    #endif
     connect(pref, SIGNAL(destroyed()), SLOT(controlConnectionsMenu()));
     connect(this, SIGNAL(showPreferencesPage(QString)), pref, SLOT(showPage(QString)));
     pref->show();
@@ -1149,12 +1259,14 @@ void MainWindow::showPreferencesDialog(const QString &page)
 
 void MainWindow::quit()
 {
+    #ifdef ENABLE_ONLINE_SERVICES
     if (OnlineServicesModel::self()->isDownloading() &&
         MessageBox::No==MessageBox::warningYesNo(this, i18n("Podcasts are currently being downloaded\n\nQuiting now will abort all downloads."),
                                                  QString(), GuiItem(i18n("Abort downloads and quit")), GuiItem("Do not quit just yet"))) {
         return;
     }
     OnlineServicesModel::self()->cancelAll();
+    #endif
     #ifdef ENABLE_REPLAYGAIN_SUPPORT
     if (RgDialog::instanceCount()) {
         return;
@@ -1191,18 +1303,8 @@ void MainWindow::checkMpdDir()
         editPlayQueueTagsAction->setEnabled(MPDConnection::self()->getDetails().dirReadable);
     }
     #endif
-    switch (tabWidget->current_index()) {
-    #if defined ENABLE_DEVICES_SUPPORT && defined TAGLIB_FOUND
-    case PAGE_DEVICES:   devicesPage->controlActions();    break;
-    #endif
-    case PAGE_LIBRARY:   libraryPage->controlActions();    break;
-    case PAGE_ALBUMS:    albumsPage->controlActions();     break;
-    case PAGE_FOLDERS:   folderPage->controlActions();     break;
-    case PAGE_PLAYLISTS: playlistsPage->controlActions();  break;
-    case PAGE_DYNAMIC:   dynamicPage->controlActions();    break;
-    case PAGE_STREAMS:   streamsPage->controlActions();    break;
-    case PAGE_ONLINE:    onlinePage->controlActions();     break;
-    default:                                               break;
+    if (currentPage) {
+        currentPage->controlActions();
     }
 }
 
@@ -1297,13 +1399,16 @@ void MainWindow::controlConnectionsMenu(bool enable)
 
 void MainWindow::controlDynamicButton()
 {
+    #ifdef ENABLE_DYNAMIC
     stopDynamicButton->setVisible(dynamicLabel->isVisible() && PAGE_DYNAMIC!=tabWidget->current_index());
+    playQueueModel.enableUndo(!Dynamic::self()->isRunning());
+    #endif
 }
 
 void MainWindow::readSettings()
 {
     checkMpdDir();
-    Covers::self()->setSaveInMpdDir(Settings::self()->storeCoversInMpdDir());
+    Covers::self()->readConfig();
     HttpServer::self()->readConfig();
     #ifdef ENABLE_DEVICES_SUPPORT
     StdActions::self()->deleteSongsAction->setVisible(Settings::self()->showDeleteAction());
@@ -1316,12 +1421,17 @@ void MainWindow::readSettings()
     libraryPage->setView(Settings::self()->libraryView());
     MusicLibraryModel::self()->setUseArtistImages(Settings::self()->libraryArtistImage());
     playlistsPage->setView(Settings::self()->playlistsView());
+    #ifdef ENABLE_STREAMS
     streamsPage->setView(Settings::self()->streamsView());
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     onlinePage->setView(Settings::self()->onlineView());
+    #endif
     folderPage->setView(Settings::self()->folderView());
     #ifdef ENABLE_DEVICES_SUPPORT
     devicesPage->setView(Settings::self()->devicesView());
     #endif
+    searchPage->setView(Settings::self()->searchView());
     trayItem->setup();
     autoScrollPlayQueue=Settings::self()->playQueueScroll();
     updateWindowTitle();
@@ -1333,6 +1443,24 @@ void MainWindow::readSettings()
     MediaKeys::self()->load();
     #endif
     context->readConfig();
+    tabWidget->setHiddenPages(Settings::self()->hiddenPages());
+    tabWidget->setStyle(Settings::self()->sidebar());
+    toggleMonoIcons();
+    toggleSplitterAutoHide();
+    if (contextSwitchTime!=Settings::self()->contextSwitchTime()) {
+        contextSwitchTime=Settings::self()->contextSwitchTime();
+        if (0==contextSwitchTime && contextTimer) {
+            contextTimer->stop();
+            contextTimer->deleteLater();
+            contextTimer=0;
+        }
+    }
+}
+
+bool diffCoverSize(int a, int b)
+{
+    return (a==ItemView::Mode_IconTop && b!=ItemView::Mode_IconTop) ||
+           (a!=ItemView::Mode_IconTop && b==ItemView::Mode_IconTop);
 }
 
 void MainWindow::updateSettings()
@@ -1345,15 +1473,15 @@ void MainWindow::updateSettings()
 
     connectToMpd();
     Settings::self()->save();
-    bool useLibSizeForAl=Settings::self()->albumsView()!=ItemView::Mode_IconTop;
-    bool diffLibCovers=((int)MusicLibraryItemAlbum::currentCoverSize())!=Settings::self()->libraryCoverSize();
+    bool diffLibCovers=((int)MusicLibraryItemAlbum::currentCoverSize())!=Settings::self()->libraryCoverSize() ||
+                       diffCoverSize(Settings::self()->libraryView(), libraryPage->viewMode());
     bool diffLibArtistImages=diffLibCovers ||
                        (libraryPage->viewMode()==ItemView::Mode_IconTop && Settings::self()->libraryView()!=ItemView::Mode_IconTop) ||
                        (libraryPage->viewMode()!=ItemView::Mode_IconTop && Settings::self()->libraryView()==ItemView::Mode_IconTop) ||
                        Settings::self()->libraryArtistImage()!=MusicLibraryModel::self()->useArtistImages();
     bool diffAlCovers=((int)AlbumsModel::currentCoverSize())!=Settings::self()->albumsCoverSize() ||
                       albumsPage->viewMode()!=Settings::self()->albumsView() ||
-                      useLibSizeForAl!=AlbumsModel::useLibrarySizes();
+                      diffCoverSize(Settings::self()->albumsView(), albumsPage->viewMode());
     bool diffLibYear=MusicLibraryItemAlbum::showDate()!=Settings::self()->libraryYear();
     bool diffGrouping=MPDParseUtils::groupSingle()!=Settings::self()->groupSingle() ||
                       MPDParseUtils::groupMultiple()!=Settings::self()->groupMultiple() ||
@@ -1375,7 +1503,6 @@ void MainWindow::updateSettings()
         AlbumsModel::setCoverSize((MusicLibraryItemAlbum::CoverSize)Settings::self()->albumsCoverSize());
     }
 
-    AlbumsModel::setUseLibrarySizes(useLibSizeForAl);
     if (diffAlCovers || diffGrouping) {
         albumsPage->setView(albumsPage->viewMode());
         albumsPage->clear();
@@ -1394,20 +1521,20 @@ void MainWindow::updateSettings()
         loaded|=TAB_LIBRARY;
         libraryPage->refresh();
     }
+    #if defined ENABLE_ONLINE_SERVICES || defined ENABLE_DEVICES_SUPPORT
     if (diffLibCovers || diffLibYear || Settings::self()->libraryArtistImage()!=MusicLibraryModel::self()->useArtistImages()) {
+        #ifdef ENABLE_ONLINE_SERVICES
         onlinePage->refresh();
+        #endif
         #ifdef ENABLE_DEVICES_SUPPORT
         devicesPage->refresh();
         #endif
     }
+    #endif
 
     bool wasAutoExpand=playQueue->isAutoExpand();
     bool wasStartClosed=playQueue->isStartClosed();
-    bool wasShowingCover=playQueue->useCoverAsBackground();
-    playQueue->setAutoExpand(Settings::self()->playQueueAutoExpand());
-    playQueue->setStartClosed(Settings::self()->playQueueStartClosed());
-    playQueue->setUseCoverAsBackgrond(Settings::self()->playQueueBackground());
-    if (!wasShowingCover && playQueue->useCoverAsBackground() && coverWidget->isValid()) {
+    if (playQueue->readConfig() && coverWidget->isValid()) {
         playQueue->setImage(coverWidget->image());
     }
 
@@ -1448,8 +1575,8 @@ void MainWindow::showAboutDialog()
 {
     QMessageBox::about(this, i18nc("Qt-only", "About Cantata"),
                        i18nc("Qt-only", "<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>"
-                             "(c) Craig Drummond 2011-2013.<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html\">GPLv3</a>", PACKAGE_VERSION_STRING)+
-                       QLatin1String("<br/><br/><i><small>")+i18n("Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The QtMPC Authors<br/>")+
+                             "© 2011-2014 Craig Drummond<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html\">GPLv3</a>", PACKAGE_VERSION_STRING)+
+                       QLatin1String("<br/><br/><i><small>")+i18n("Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 The QtMPC Authors<br/>")+
                        i18nc("Qt-only", "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt.tv</a>")+QLatin1String("<br/>")+
                        i18nc("Qt-only", "Context view metadata courtesy of <a href=\"http://www.wikipedia.org\">Wikipedia</a> and <a href=\"http://www.last.fm\">Last.fm</a>")+
                        QLatin1String("<br/><br/>")+i18n("Please consider uploading your own music fan-art to <a href=\"http://www.fanart.tv\">FanArt.tv</a>")+
@@ -1464,72 +1591,25 @@ void MainWindow::showServerInfo()
     long version=MPDConnection::self()->version();
     MessageBox::information(this, QLatin1String("<p><table>")+
                                   i18n("<tr><td colspan=\"2\"><b>Server</b></td></tr>"
-                                       "<tr><td align=\"right\">Version:</td><td>%1.%2.%3</td></tr>"
-                                       "<tr><td align=\"right\">Uptime:</td><td>%4</td></tr>"
-                                       "<tr><td align=\"right\">Time playing:</td><td>%5</td></tr>",
+                                       "<tr><td align=\"right\">Protocol version: </td><td>%1.%2.%3</td></tr>"
+                                       "<tr><td align=\"right\">Uptime: </td><td>%4</td></tr>"
+                                       "<tr><td align=\"right\">Time playing: </td><td>%5</td></tr>",
                                        (version>>16)&0xFF, (version>>8)&0xFF, version&0xFF,
                                        Utils::formatDuration(MPDStats::self()->uptime()),
                                        Utils::formatDuration(MPDStats::self()->playtime()))+
                                   QLatin1String("<tr/>")+
                                   i18n("<tr><td colspan=\"2\"><b>Database</b></td></tr>"
-                                       "<tr><td align=\"right\">Artists:</td><td>%1</td></tr>"
-                                       "<tr><td align=\"right\">Albums:</td><td>%2</td></tr>"
-                                       "<tr><td align=\"right\">Songs:</td><td>%3</td></tr>"
-                                       "<tr><td align=\"right\">URL handlers:</td><td>%4</td></tr>"
-                                       "<tr><td align=\"right\">Total duration:</td><td>%5</td></tr>"
-                                       "<tr><td align=\"right\">Last update:</td><td>%6</td></tr></table></p>",
+                                       "<tr><td align=\"right\">Artists: </td><td>%1</td></tr>"
+                                       "<tr><td align=\"right\">Albums: </td><td>%2</td></tr>"
+                                       "<tr><td align=\"right\">Songs: </td><td>%3</td></tr>"
+                                       "<tr><td align=\"right\">URL handlers: </td><td>%4</td></tr>"
+                                       "<tr><td align=\"right\">Total duration: </td><td>%5</td></tr>"
+                                       "<tr><td align=\"right\">Last update: </td><td>%6</td></tr></table></p>",
                                        MPDStats::self()->artists(), MPDStats::self()->albums(), MPDStats::self()->songs(), handlers.join(", "),
                                        Utils::formatDuration(MPDStats::self()->dbPlaytime()), MPDStats::self()->dbUpdate().toString(Qt::SystemLocaleShortDate)),
                             i18n("Server Information"));
 }
 
-void MainWindow::toggleStream(bool s, const QString &url)
-{
-    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-    MPDStatus * const status = MPDStatus::self();
-    httpStreamEnabled = s;
-    if (!s){
-        if (httpStream) {
-            httpStream->stop();
-        }
-    } else {
-        static const char *constUrlProperty="url";
-        if (httpStream && httpStream->property(constUrlProperty).toString()!=url) {
-            httpStream->stop();
-            httpStream->deleteLater();
-            httpStream=0;
-        }
-        if (httpStream) {
-            switch (status->state()) {
-            case MPDState_Playing:
-                httpStream->play();
-                break;
-            case MPDState_Inactive:
-            case MPDState_Stopped:
-                httpStream->stop();
-            break;
-            case MPDState_Paused:
-                httpStream->pause();
-            default:
-            break;
-            }
-        } else {
-            #if QT_VERSION < 0x050000
-            httpStream=new Phonon::MediaObject(this);
-            Phonon::createPath(httpStream, new Phonon::AudioOutput(Phonon::MusicCategory, this));
-            httpStream->setCurrentSource(url);
-            #else
-            httpStream=new QMediaPlayer(this);
-            httpStream->setMedia(QUrl(url));
-            #endif
-            httpStream->setProperty(constUrlProperty, url);
-        }
-    }
-    #else
-    Q_UNUSED(s) Q_UNUSED(url)
-    #endif
-}
-
 void MainWindow::enableStopActions(bool enable)
 {
     StdActions::self()->stopAfterCurrentTrackAction->setEnabled(enable);
@@ -1590,11 +1670,6 @@ void MainWindow::stopVolumeFade()
     }
 }
 
-int MainWindow::mpdVolume() const
-{
-    return volumeSlider->value();
-}
-
 void MainWindow::setMpdVolume(int v)
 {
     if (-1==v) {
@@ -1671,6 +1746,13 @@ void MainWindow::realSearchPlayQueue()
     }
 }
 
+void MainWindow::playQueueSearchActivated(bool a)
+{
+    if (!a && playQueue->isVisible()) {
+        playQueue->setFocus();
+    }
+}
+
 void MainWindow::updatePlayQueue(const QList<Song> &songs)
 {
     StdActions::self()->playPauseTrackAction->setEnabled(!songs.isEmpty());
@@ -1679,10 +1761,19 @@ void MainWindow::updatePlayQueue(const QList<Song> &songs)
     StdActions::self()->savePlayQueueAction->setEnabled(!songs.isEmpty());
     promptClearPlayQueueAction->setEnabled(!songs.isEmpty());
 
+    int topRow=-1;
+    QModelIndex topIndex=playQueueModel.lastCommandWasUnodOrRedo() ? playQueue->indexAt(QPoint(0, 0)) : QModelIndex();
+    if (topIndex.isValid()) {
+        topRow=playQueueProxyModel.mapToSource(topIndex).row();
+    }
     bool wasEmpty=0==playQueueModel.rowCount();
     playQueueModel.update(songs);
     QModelIndex idx=playQueueProxyModel.mapFromSource(playQueueModel.index(playQueueModel.currentSongRow(), 0));
-    playQueue->updateRows(idx.row(), current.key, autoScrollPlayQueue && playQueueProxyModel.isEmpty() && wasEmpty && MPDState_Playing==MPDStatus::self()->state());
+    bool scroll=autoScrollPlayQueue && playQueueProxyModel.isEmpty() && wasEmpty && MPDState_Playing==MPDStatus::self()->state();
+    playQueue->updateRows(idx.row(), current.key, scroll);
+    if (!scroll && topRow>0 && topRow<playQueueModel.rowCount()) {
+        playQueue->scrollTo(playQueueProxyModel.mapFromSource(playQueueModel.index(topRow, 0)), QAbstractItemView::PositionAtTop);
+    }
 
     /*if (1==songs.count() && MPDState_Playing==MPDStatus::self()->state()) {
         updateCurrentSong(songs.at(0));
@@ -1699,11 +1790,6 @@ void MainWindow::updatePlayQueue(const QList<Song> &songs)
     updateNextTrack(MPDStatus::self()->nextSongId());
 }
 
-bool MainWindow::currentIsStream() const
-{
-    return playQueueModel.rowCount() && -1!=current.id && current.isStream();
-}
-
 void MainWindow::updateWindowTitle()
 {
     MPDStatus * const status = MPDStatus::self();
@@ -1770,7 +1856,7 @@ void MainWindow::updateCurrentSong(const Song &song)
     coverWidget->update(current);
 
     if (current.isStream() && !current.isCantataStream() && !current.isCdda()) {
-        trackLabel->setText(current.name.isEmpty() ? i18n("Unknown") : current.name);
+        trackLabel->setText(current.name.isEmpty() ? Song::unknown() : current.name);
         if (current.artist.isEmpty() && current.title.isEmpty() && !current.name.isEmpty()) {
             artistLabel->setText(i18n("(Stream)"));
         } else {
@@ -1783,7 +1869,7 @@ void MainWindow::updateCurrentSong(const Song &song)
             trackLabel->setText(current.title);
         }
         if (current.album.isEmpty() && current.artist.isEmpty()) {
-            artistLabel->setText(trackLabel->fullText().isEmpty() ? QString() : i18n("Unknown"));
+            artistLabel->setText(trackLabel->fullText().isEmpty() ? QString() : Song::unknown());
         } else if (current.album.isEmpty()) {
             artistLabel->setText(current.artist);
         } else {
@@ -1830,7 +1916,6 @@ void MainWindow::updateStats()
         albumsPage->goTop();
         libraryPage->refresh();
         folderPage->refresh();
-        playlistsPage->refresh();
     }
 }
 
@@ -1893,11 +1978,6 @@ void MainWindow::updateStatus(MPDStatus * const status)
     playQueueModel.setState(status->state());
     switch (status->state()) {
     case MPDState_Playing:
-        #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-        if (httpStreamEnabled && httpStream) {
-            httpStream->play();
-        }
-        #endif
         StdActions::self()->playPauseTrackAction->setIcon(Icons::self()->toolbarPauseIcon);
         StdActions::self()->playPauseTrackAction->setEnabled(0!=status->playlistLength());
         //playPauseTrackButton->setChecked(false);
@@ -1907,20 +1987,9 @@ void MainWindow::updateStatus(MPDStatus * const status)
             StdActions::self()->prevTrackAction->setEnabled(status->playlistLength()>1);
         }
         positionSlider->startTimer();
-
-        #ifdef ENABLE_KDE_SUPPORT
-        trayItem->setIconByName(Icons::self()->toolbarPlayIcon.name());
-        #else
-        trayItem->setIcon(Icons::self()->toolbarPlayIcon);
-        #endif
         break;
     case MPDState_Inactive:
     case MPDState_Stopped:
-        #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-        if (httpStreamEnabled && httpStream) {
-            httpStream->stop();
-        }
-        #endif
         StdActions::self()->playPauseTrackAction->setIcon(Icons::self()->toolbarPlayIcon);
         StdActions::self()->playPauseTrackAction->setEnabled(0!=status->playlistLength());
         enableStopActions(false);
@@ -1934,35 +2003,17 @@ void MainWindow::updateStatus(MPDStatus * const status)
         }
         current.id=0;
         updateWindowTitle();
-
-        #ifdef ENABLE_KDE_SUPPORT
-        trayItem->setIconByName("cantata");
-        #else
-        trayItem->setIcon(Icons::self()->appIcon);
-        #endif
         trayItem->setToolTip("cantata", i18n("Cantata"), "<i>Playback stopped</i>");
         positionSlider->stopTimer();
         break;
     case MPDState_Paused:
-        #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-        if (httpStreamEnabled && httpStream) {
-            httpStream->pause();
-        }
-        #endif
         StdActions::self()->playPauseTrackAction->setIcon(Icons::self()->toolbarPlayIcon);
         StdActions::self()->playPauseTrackAction->setEnabled(0!=status->playlistLength());
         enableStopActions(0!=status->playlistLength());
         StdActions::self()->nextTrackAction->setEnabled(status->playlistLength()>1);
         StdActions::self()->prevTrackAction->setEnabled(status->playlistLength()>1);
-        #ifdef ENABLE_KDE_SUPPORT
-        trayItem->setIconByName(Icons::self()->toolbarPauseIcon.name());
-        #else
-        trayItem->setIcon(Icons::self()->toolbarPauseIcon);
-        #endif
         positionSlider->stopTimer();
-        break;
     default:
-        qDebug("Invalid state");
         break;
     }
 
@@ -1971,6 +2022,10 @@ void MainWindow::updateStatus(MPDStatus * const status)
         (MPDState_Inactive==lastState || (MPDState_Stopped==lastState && MPDState_Playing==status->state()) || lastSongId != status->songId())) {
         emit currentSong();
     }
+    if (status->state()!=lastState && (MPDState_Playing==status->state() || MPDState_Stopped==status->state())) {
+        startContextTimer();
+    }
+
     // Update status info
     lastState = status->state();
     lastSongId = status->songId();
@@ -1990,6 +2045,7 @@ void MainWindow::promptClearPlayQueue()
             messageWidget->setActions(QList<QAction*>() << clearPlayQueueAction << cancelAction);
         }
         messageWidget->setWarning(i18n("Remove all songs from play queue?"), false);
+        expand();
     } else {
         clearPlayQueue();
     }
@@ -1997,54 +2053,22 @@ void MainWindow::promptClearPlayQueue()
 
 void MainWindow::clearPlayQueue()
 {
+    #ifdef ENABLE_DYNAMIC
     if (dynamicLabel->isVisible()) {
         Dynamic::self()->stop(true);
-    } else {
-        emit clear();
+    } else
+    #endif
+    {
+        playQueueModel.removeAll();
     }
 }
 
-void MainWindow::removeFromPlayQueue()
-{
-    playQueueModel.remove(playQueueProxyModel.mapToSourceRows(playQueue->selectedIndexes()));
-}
-
-void MainWindow::replacePlayQueue()
-{
-    addToPlayQueue(true);
-}
-
-void MainWindow::addToPlayQueue()
-{
-    addToPlayQueue(false);
-}
-
-void MainWindow::addRandomToPlayQueue()
-{
-    addToPlayQueue(false, 0, true);
-}
-
 void MainWindow::addToPlayQueue(bool replace, quint8 priority, bool randomAlbums)
 {
     playQueueSearchWidget->clear();
-    if (libraryPage->isVisible()) {
-        libraryPage->addSelectionToPlaylist(QString(), replace, priority, randomAlbums);
-    } else if (albumsPage->isVisible()) {
-        albumsPage->addSelectionToPlaylist(QString(), replace, priority, randomAlbums);
-    } else if (folderPage->isVisible()) {
-        folderPage->addSelectionToPlaylist(QString(), replace, priority);
-    } else if (playlistsPage->isVisible()) {
-        playlistsPage->addSelectionToPlaylist(replace, priority);
-    } else if (streamsPage->isVisible()) {
-        streamsPage->addSelectionToPlaylist(replace, priority);
-    } else if (onlinePage->isVisible()) {
-        onlinePage->addSelectionToPlaylist(QString(), replace, priority);
+    if (currentPage) {
+        currentPage->addSelectionToPlaylist(QString(), replace, priority, randomAlbums);
     }
-    #ifdef ENABLE_DEVICES_SUPPORT
-    else if (devicesPage->isVisible()) {
-        devicesPage->addSelectionToPlaylist(QString(), replace, priority);
-    }
-    #endif
 }
 
 void MainWindow::addWithPriority()
@@ -2113,11 +2137,6 @@ void MainWindow::addToNewStoredPlaylist()
     }
 }
 
-void MainWindow::addToExistingStoredPlaylist(const QString &name)
-{
-    addToExistingStoredPlaylist(name, playQueue->hasFocus());
-}
-
 void MainWindow::addToExistingStoredPlaylist(const QString &name, bool pq)
 {
     if (pq) {
@@ -2136,17 +2155,14 @@ void MainWindow::addToExistingStoredPlaylist(const QString &name, bool pq)
         if (!files.isEmpty()) {
             emit addSongsToPlaylist(name, files);
         }
-    } else if (libraryPage->isVisible()) {
-        libraryPage->addSelectionToPlaylist(name);
-    } else if (albumsPage->isVisible()) {
-        albumsPage->addSelectionToPlaylist(name);
-    } else if (folderPage->isVisible()) {
-        folderPage->addSelectionToPlaylist(name);
+    } else if (currentPage) {
+        currentPage->addSelectionToPlaylist(name);
     }
 }
 
 void MainWindow::addStreamToPlayQueue()
 {
+    #ifdef ENABLE_STREAMS
     StreamDialog dlg(this, true);
 
     if (QDialog::Accepted==dlg.exec()) {
@@ -2157,14 +2173,22 @@ void MainWindow::addStreamToPlayQueue()
         }
         playQueueModel.addItems(QStringList() << StreamsModel::modifyUrl(url), false, 0);
     }
+    #else
+    QString url = InputDialog::getText(i18n("Stream URL"), i18n("Enter URL of stream:"), QString(), 0, this).trimmed();
+    if (!url.isEmpty()) {
+        if (!MPDConnection::self()->urlHandlers().contains(QUrl(url).scheme())) {
+            MessageBox::error(this, i18n("Invalid, or unsupported, URL!"));
+        } else {
+            playQueueModel.addItems(QStringList() << StreamsModel::modifyUrl(url), false, 0);
+        }
+    }
+    #endif
 }
 
 void MainWindow::removeItems()
 {
-    if (playlistsPage->isVisible()) {
-        playlistsPage->removeItems();
-    } else if (streamsPage->isVisible()) {
-        streamsPage->removeItems();
+    if (currentPage) {
+        currentPage->removeItems();
     }
 }
 
@@ -2185,7 +2209,6 @@ void MainWindow::updatePlayQueueStats(int songs, quint32 time)
         playQueueStatsLabel->setText(QString());
         return;
     }
-
     #ifdef ENABLE_KDE_SUPPORT
     playQueueStatsLabel->setText(i18np("1 Track (%2)", "%1 Tracks (%2)", songs, Utils::formatDuration(time)));
     #else
@@ -2193,34 +2216,11 @@ void MainWindow::updatePlayQueueStats(int songs, quint32 time)
     #endif
 }
 
-void MainWindow::copyTrackInfo()
-{
-    const QModelIndexList items = playQueue->selectedIndexes();
-
-    if (items.isEmpty()) {
-        return;
-    }
-
-    QString txt;
-    QTextStream str(&txt);
-
-    foreach (const QModelIndex &idx, items) {
-        Song s = playQueueModel.getSongByRow(playQueueProxyModel.mapToSource(idx).row());
-        if (!s.isEmpty()) {
-            if (!txt.isEmpty()) {
-                str << QChar('\n');
-            }
-            str << s.format();
-        }
-    }
-    QApplication::clipboard()->setText(txt);
-}
-
 int MainWindow::calcMinHeight()
 {
-    if (FancyTabWidget::Mode_LargeSidebar==tabWidget->mode()) {
+    if (tabWidget->style()==(FancyTabWidget::Side|FancyTabWidget::Large)) {
         return coverWidget->height()+(tabWidget->visibleCount()*(32+fontMetrics().height()+4));
-    } else if (FancyTabWidget::Mode_IconOnlyLargeSidebar==tabWidget->mode()) {
+    } else if (tabWidget->style()==(FancyTabWidget::Side|FancyTabWidget::Large|FancyTabWidget::IconOnly)) {
         return coverWidget->height()+(tabWidget->visibleCount()*(32+6));
     }
     return 256;
@@ -2228,20 +2228,16 @@ int MainWindow::calcMinHeight()
 
 int MainWindow::calcCompactHeight()
 {
-    int spacing=Utils::layoutSpacing(this);
-    // For some reason height is always larger than it needs to be - so fix this to cover height +4
-    return qMax(qMax(playPauseTrackButton->height(),
-                         trackLabel->height()+artistLabel->height()+spacing)+
-                         positionSlider->height(),
-                    coverWidget->height())+
-           (messageWidget->isActive() ? (messageWidget->sizeHint().height()+spacing) : 0);
+    return toolbar->height()+(messageWidget->isActive() ? (messageWidget->sizeHint().height()+Utils::layoutSpacing(this)) : 0);
 }
 
 void MainWindow::expandOrCollapse(bool saveCurrentSize)
 {
-    if (isFullScreen()) {
+    if (!expandInterfaceAction->isChecked() && (isFullScreen() || isMaximized() || messageWidget->isVisible())) {
+        expandInterfaceAction->setChecked(true);
         return;
     }
+
     static bool lastMax=false;
 
     bool showing=expandInterfaceAction->isChecked();
@@ -2280,7 +2276,7 @@ void MainWindow::expandOrCollapse(bool saveCurrentSize)
             showMaximized();
         }
     } else {
-        // Widths also sometimes expands, so make sure this is no larger than it was before...
+        // Width also sometimes expands, so make sure this is no larger than it was before...
         collapsedSize=QSize(collapsedSize.isValid() ? collapsedSize.width() : (size().width()>prevWidth ? prevWidth : size().width()), compactHeight);
         resize(collapsedSize);
         setFixedHeight(size().height());
@@ -2327,59 +2323,57 @@ void MainWindow::sidebarModeChanged()
     }
 }
 
-void MainWindow::cropPlayQueue()
-{
-    playQueueModel.crop(playQueueProxyModel.mapToSourceRows(playQueue->selectedIndexes()));
-}
-
 void MainWindow::currentTabChanged(int index)
 {
     controlDynamicButton();
     switch(index) {
-    #ifdef ENABLE_DEVICES_SUPPORT
-    case PAGE_DEVICES: // Need library to be loaded to check if song exists...
-        devicesPage->controlActions();
-        break;
-    #endif
-    case PAGE_LIBRARY:
-    case PAGE_ALBUMS: // Albums shares refresh with library...
-        if (!(loaded&TAB_LIBRARY)) {
-            loaded|=TAB_LIBRARY;
-            albumsPage->goTop();
-            libraryPage->refresh();
-        }
-        if (PAGE_LIBRARY==index) {
-            libraryPage->controlActions();
-        } else {
-//             AlbumsModel::self()->getCovers();
-            albumsPage->controlActions();
-        }
-        break;
+// NOTE:  I dont think this is actually required, a library is always loaded - not just when tab changed
+//    case PAGE_LIBRARY:
+//    case PAGE_ALBUMS: // Albums shares refresh with library...
+//        if (!(loaded&TAB_LIBRARY) && isVisible()) {
+//            loaded|=TAB_LIBRARY;
+//            albumsPage->goTop();
+//            libraryPage->refresh();
+//        }
+//        if (PAGE_LIBRARY==index) {
+//            currentPage=libraryPage;
+//        } else {
+//            currentPage=albumsPage;
+//        }
+//        break;
+    case PAGE_LIBRARY:   currentPage=libraryPage;   break;
+    case PAGE_ALBUMS:    currentPage=albumsPage;    break;
     case PAGE_FOLDERS:
         if (!(loaded&TAB_FOLDERS)) {
             loaded|=TAB_FOLDERS;
             folderPage->refresh();
         }
-        folderPage->controlActions();
-        break;
-    case PAGE_PLAYLISTS:
-        playlistsPage->controlActions();
-        break;
-    case PAGE_DYNAMIC:
-        dynamicPage->controlActions();
+        currentPage=folderPage;
         break;
+    case PAGE_PLAYLISTS: currentPage=playlistsPage; break;
+    #ifdef ENABLE_DYNAMIC
+    case PAGE_DYNAMIC:   currentPage=dynamicPage;   break;
+    #endif
+    #ifdef ENABLE_STREAMS
     case PAGE_STREAMS:
         if (!(loaded&TAB_STREAMS)) {
             loaded|=TAB_STREAMS;
             streamsPage->refresh();
         }
-        streamsPage->controlActions();
-        break;
-    case PAGE_ONLINE:
-        onlinePage->controlActions();
-        break;
-    default:
+        currentPage=streamsPage;
         break;
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
+    case PAGE_ONLINE:    currentPage=onlinePage;    break;
+    #endif
+    #ifdef ENABLE_DEVICES_SUPPORT
+    case PAGE_DEVICES:   currentPage=devicesPage;   break;
+    #endif
+    case PAGE_SEARCH:    currentPage=searchPage;    break;
+    default:             currentPage=0;             break;
+    }
+    if (currentPage) {
+        currentPage->controlActions();
     }
 }
 
@@ -2388,8 +2382,7 @@ void MainWindow::tabToggled(int index)
     switch (index) {
     case PAGE_PLAYQUEUE:
         if (tabWidget->isEnabled(index)) {
-            autoHideSplitterAction->setVisible(false);
-            splitter->setAutohidable(0, autoHideSplitterAction->isChecked() && !tabWidget->isEnabled(PAGE_PLAYQUEUE));
+            splitter->setAutohidable(0, Settings::self()->splitterAutoHide() && !tabWidget->isEnabled(PAGE_PLAYQUEUE));
             playQueueWidget->setParent(playQueuePage);
             playQueuePage->layout()->addWidget(playQueueWidget);
             playQueueWidget->setVisible(true);
@@ -2398,8 +2391,7 @@ void MainWindow::tabToggled(int index)
             playQueuePage->layout()->removeWidget(playQueueWidget);
             playQueueWidget->setParent(splitter);
             playQueueWidget->setVisible(true);
-            autoHideSplitterAction->setVisible(true);
-            splitter->setAutohidable(0, autoHideSplitterAction->isChecked() && !tabWidget->isEnabled(PAGE_PLAYQUEUE));
+            splitter->setAutohidable(0, Settings::self()->splitterAutoHide() && !tabWidget->isEnabled(PAGE_PLAYQUEUE));
             int spacing=Utils::layoutSpacing(this);
             playQueueSpacer->changeSize(spacing, spacing, QSizePolicy::Fixed, QSizePolicy::Fixed);
         }
@@ -2432,13 +2424,17 @@ void MainWindow::tabToggled(int index)
     case PAGE_PLAYLISTS:
         setPlaylistsEnabled(tabWidget->isEnabled(index));
         break;
+    #ifdef ENABLE_STREAMS
     case PAGE_STREAMS:
         streamsPage->setEnabled(!streamsPage->isEnabled());
         if (streamsPage->isEnabled() && loaded&TAB_STREAMS) loaded-=TAB_STREAMS;
         break;
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     case PAGE_ONLINE:
         OnlineServicesModel::self()->setEnabled(!OnlineServicesModel::self()->isEnabled());
         break;
+    #endif
     #ifdef ENABLE_DEVICES_SUPPORT
     case PAGE_DEVICES:
         DevicesModel::self()->setEnabled(!DevicesModel::self()->isEnabled());
@@ -2453,16 +2449,16 @@ void MainWindow::tabToggled(int index)
 
 void MainWindow::toggleSplitterAutoHide()
 {
-    bool ah=autoHideSplitterAction->isChecked() && !tabWidget->isEnabled(PAGE_PLAYQUEUE);
-    splitter->setAutoHideEnabled(ah);
-    splitter->setAutohidable(0, ah);
+    bool ah=Settings::self()->splitterAutoHide();
+    if (splitter->isAutoHideEnabled()!=ah) {
+        splitter->setAutoHideEnabled(ah);
+        splitter->setAutohidable(0, ah);
+    }
 }
 
 void MainWindow::toggleMonoIcons()
 {
-    bool mono=monoIconsAction->isChecked();
-    if (mono!=Settings::self()->monoSidebarIcons()) {
-        Settings::self()->saveMonoSidebarIcons(mono);
+    if (Settings::self()->monoSidebarIcons()!=Icons::self()->monoSidebarIcons()) {
         Icons::self()->initSidebarIcons();
         showPlayQueueAction->setIcon(Icons::self()->playqueueIcon);
         tabWidget->SetIcon(PAGE_PLAYQUEUE, showPlayQueueAction->icon());
@@ -2474,17 +2470,25 @@ void MainWindow::toggleMonoIcons()
         tabWidget->SetIcon(PAGE_FOLDERS, foldersTabAction->icon());
         playlistsTabAction->setIcon(Icons::self()->playlistsIcon);
         tabWidget->SetIcon(PAGE_PLAYLISTS, playlistsTabAction->icon());
+        #ifdef ENABLE_DYNAMIC
         dynamicTabAction->setIcon(Icons::self()->dynamicIcon);
         tabWidget->SetIcon(PAGE_DYNAMIC, dynamicTabAction->icon());
+        #endif
+        #ifdef ENABLE_STREAMS
         streamsTabAction->setIcon(Icons::self()->streamsIcon);
         tabWidget->SetIcon(PAGE_STREAMS, streamsTabAction->icon());
+        #endif
+        #ifdef ENABLE_ONLINE_SERVICES
         onlineTabAction->setIcon(Icons::self()->onlineIcon);
         tabWidget->SetIcon(PAGE_ONLINE, onlineTabAction->icon());
+        #endif
         tabWidget->SetIcon(PAGE_CONTEXT, Icons::self()->infoSidebarIcon);
         #ifdef ENABLE_DEVICES_SUPPORT
         devicesTabAction->setIcon(Icons::self()->devicesIcon);
         tabWidget->SetIcon(PAGE_DEVICES, devicesTabAction->icon());
         #endif
+        searchTabAction->setIcon(Icons::self()->searchTabIcon);
+        tabWidget->SetIcon(PAGE_SEARCH, searchTabAction->icon());
         tabWidget->Recreate();
     }
 }
@@ -2515,146 +2519,33 @@ void MainWindow::locateAlbum(const QString &artist, const QString &album)
     libraryPage->showAlbum(artist, album);
 }
 
-void MainWindow::playSong(const QString &song)
-{
-    qint32 id=playQueueModel.getSongId(song);
-    if (-1==id) {
-        addAndPlay(song);
-    } else {
-        emit startPlayingSongId(id);
-    }
-}
-
-void MainWindow::showPage(const QString &page, bool focusSearch)
-{
-    QString p=page.toLower();
-    if (QLatin1String("library")==p || QLatin1String("artists")==p) {
-        showTab(MainWindow::PAGE_LIBRARY);
-        if (focusSearch) {
-            libraryPage->focusSearch();
-        }
-    } else if (QLatin1String("albums")==p) {
-        showTab(MainWindow::PAGE_ALBUMS);
-        if (focusSearch) {
-            albumsPage->focusSearch();
-        }
-    } else if (QLatin1String("folders")==p) {
-        showTab(MainWindow::PAGE_FOLDERS);
-        if (focusSearch) {
-            folderPage->focusSearch();
-        }
-    } else if (QLatin1String("playlists")==p) {
-        showTab(MainWindow::PAGE_PLAYLISTS);
-        if (focusSearch) {
-            playlistsPage->focusSearch();
-        }
-    } else if (QLatin1String("dynamic")==p) {
-        showTab(MainWindow::PAGE_DYNAMIC);
-        if (focusSearch) {
-            dynamicPage->focusSearch();
-        }
-    } else if (QLatin1String("streams")==p) {
-        showTab(MainWindow::PAGE_STREAMS);
-        if (focusSearch) {
-            streamsPage->focusSearch();
-        }
-    } else if (QLatin1String("info")==p) {
-        if (songInfoAction->isCheckable()) {
-            songInfoAction->setChecked(true);
-        }
-        showSongInfo();
-    } else if (QLatin1String("online")==p) {
-        showTab(MainWindow::PAGE_ONLINE);
-        if (focusSearch) {
-            onlinePage->focusSearch();
-        }
-    }
-    #ifdef ENABLE_REPLAYGAIN_SUPPORT
-    else if (QLatin1String("devices")==p) {
-        showTab(MainWindow::PAGE_DEVICES);
-        if (focusSearch) {
-            devicesPage->focusSearch();
-        }
-    }
-    #endif
-    else if (tabWidget->isEnabled(PAGE_PLAYQUEUE) && QLatin1String("playqueue")==p) {
-        showTab(MainWindow::PAGE_PLAYQUEUE);
-        if (focusSearch) {
-            playQueueSearchWidget->setFocus();
-        }
-    }
-
-    if (!expandInterfaceAction->isChecked()) {
-        expandInterfaceAction->setChecked(true);
-        expandOrCollapse();
-    }
-}
-
 void MainWindow::dynamicStatus(const QString &message)
 {
+    #ifdef ENABLE_DYNAMIC
     Dynamic::self()->helperMessage(message);
-}
-
-void MainWindow::showTab(int page)
-{
-    tabWidget->SetCurrentIndex(page);
-}
-
-void MainWindow::goBack()
-{
-    switch (tabWidget->current_index()) {
-    #if defined ENABLE_DEVICES_SUPPORT && defined TAGLIB_FOUND
-    case PAGE_DEVICES:   devicesPage->goBack();    break;
+    #else
+    Q_UNUSED(message)
     #endif
-    case PAGE_LIBRARY:   libraryPage->goBack();    break;
-    case PAGE_ALBUMS:    albumsPage->goBack();     break;
-    case PAGE_FOLDERS:   folderPage->goBack();     break;
-    case PAGE_PLAYLISTS: playlistsPage->goBack();  break;
-    case PAGE_STREAMS:   streamsPage->goBack();    break;
-    case PAGE_ONLINE:    onlinePage->goBack();     break;
-    default:                                       break;
-    }
 }
 
 void MainWindow::showSearch()
 {
-    if (context->isVisible()) {
+    if (playQueue->hasFocus()) {
+        playQueueSearchWidget->activate();
+    } else if (context->isVisible()) {
         context->search();
-    } else if (libraryPage->isVisible()) {
-        libraryPage->focusSearch();
-    } else if (albumsPage->isVisible()) {
-        albumsPage->focusSearch();
-    } else if (folderPage->isVisible()) {
-        folderPage->focusSearch();
-    } else if (playlistsPage->isVisible()) {
-        playlistsPage->focusSearch();
-    } else if (dynamicPage->isVisible()) {
-        dynamicPage->focusSearch();
-    } else if (streamsPage->isVisible()) {
-        streamsPage->focusSearch();
-    } else if (onlinePage->isVisible()) {
-        onlinePage->focusSearch();
-    }
-    #ifdef ENABLE_DEVICES_SUPPORT
-    else if (devicesPage->isVisible()) {
-        devicesPage->focusSearch();
-    }
-    #endif
-    else if (playQueuePage->isVisible()) {
+    } else if (currentPage && splitter->sizes().at(0)>0) {
+        currentPage->focusSearch();
+    } else if (playQueuePage->isVisible() || playQueue->isVisible()) {
         playQueueSearchWidget->activate();
     }
 }
 
-bool MainWindow::fadeWhenStop() const
-{
-    return fadeStop && volumeSlider->isEnabled();
-}
-
 void MainWindow::expandAll()
 {
     QWidget *f=QApplication::focusWidget();
-    if (f && qobject_cast<QTreeView *>(f) && !qobject_cast<GroupedView *>(f)) {
-        static_cast<QTreeView *>(f)->expandAll();
+    if (f && qobject_cast<TreeView *>(f) && !qobject_cast<GroupedView *>(f)) {
+        static_cast<TreeView *>(f)->expandAll(QModelIndex(), true);
     }
 }
 
@@ -2670,18 +2561,11 @@ void MainWindow::editTags()
 {
     #ifdef TAGLIB_FOUND
     QList<Song> songs;
-    if (libraryPage->isVisible()) {
-        songs=libraryPage->selectedSongs();
-    } else if (albumsPage->isVisible()) {
-        songs=albumsPage->selectedSongs();
-    } else if (folderPage->isVisible()) {
+    if (currentPage==folderPage) {
         songs=folderPage->selectedSongs(FolderPage::ES_FillEmpty);
+    } else if (currentPage) {
+        songs=currentPage->selectedSongs();
     }
-    #ifdef ENABLE_DEVICES_SUPPORT
-    else if (devicesPage->isVisible()) {
-        songs=devicesPage->selectedSongs();
-    }
-    #endif
     editTags(songs, false);
     #endif
 }
@@ -2696,17 +2580,16 @@ void MainWindow::editPlayQueueTags()
 #ifdef TAGLIB_FOUND
 void MainWindow::editTags(const QList<Song> &songs, bool isPlayQueue)
 {
+    if (songs.isEmpty() && isPlayQueue) {
+        MessageBox::error(this, i18n("Can only edit tags of songs within MPD's music collection."));
+    }
     if (songs.isEmpty() || TagEditor::instanceCount() || !canShowDialog()) {
         return;
     }
-    QSet<QString> artists;
-    QSet<QString> albumArtists;
-    QSet<QString> composers;
-    QSet<QString> albums;
-    QSet<QString> genres;
+    QSet<QString> artists, albumArtists, composers, albums, genres;
     QString udi;
     #ifdef ENABLE_DEVICES_SUPPORT
-    if (!isPlayQueue && devicesPage->isVisible()) {
+    if (!isPlayQueue && currentPage==devicesPage) {
         DevicesModel::self()->getDetails(artists, albumArtists, composers, albums, genres);
         udi=devicesPage->activeFsDeviceUdi();
         if (udi.isEmpty()) {
@@ -2730,23 +2613,14 @@ void MainWindow::organiseFiles()
     }
 
     QList<Song> songs;
-    if (libraryPage->isVisible()) {
-        songs=libraryPage->selectedSongs();
-    } else if (albumsPage->isVisible()) {
-        songs=albumsPage->selectedSongs();
-    } else if (folderPage->isVisible()) {
-        songs=folderPage->selectedSongs(FolderPage::ES_None);
-    }
-    #ifdef ENABLE_DEVICES_SUPPORT
-    else if (devicesPage->isVisible()) {
-        songs=devicesPage->selectedSongs();
+    if (currentPage) {
+        songs=currentPage->selectedSongs();
     }
-    #endif
 
     if (!songs.isEmpty()) {
         QString udi;
         #ifdef ENABLE_DEVICES_SUPPORT
-        if (devicesPage->isVisible()) {
+        if (currentPage==devicesPage) {
             udi=devicesPage->activeFsDeviceUdi();
             if (udi.isEmpty()) {
                 return;
@@ -2763,14 +2637,8 @@ void MainWindow::organiseFiles()
 void MainWindow::addToDevice(const QString &udi)
 {
     #ifdef ENABLE_DEVICES_SUPPORT
-    if (libraryPage->isVisible()) {
-        libraryPage->addSelectionToDevice(udi);
-    } else if (albumsPage->isVisible()) {
-        albumsPage->addSelectionToDevice(udi);
-    } else if (folderPage->isVisible()) {
-        folderPage->addSelectionToDevice(udi);
-    } else if (playlistsPage->isVisible()) {
-        playlistsPage->addSelectionToDevice(udi);
+    if (currentPage) {
+        currentPage->addSelectionToDevice(udi);
     }
     #else
     Q_UNUSED(udi)
@@ -2783,14 +2651,8 @@ void MainWindow::deleteSongs()
     if (!StdActions::self()->deleteSongsAction->isVisible()) {
         return;
     }
-    if (libraryPage->isVisible()) {
-        libraryPage->deleteSongs();
-    } else if (albumsPage->isVisible()) {
-        albumsPage->deleteSongs();
-    } else if (folderPage->isVisible()) {
-        folderPage->deleteSongs();
-    } else if (devicesPage->isVisible()) {
-        devicesPage->deleteSongs();
+    if (currentPage) {
+        currentPage->deleteSongs();
     }
     #endif
 }
@@ -2829,30 +2691,22 @@ void MainWindow::replayGain()
     }
 
     QList<Song> songs;
-    if (libraryPage->isVisible()) {
-        songs=libraryPage->selectedSongs();
-    } else if (albumsPage->isVisible()) {
-        songs=albumsPage->selectedSongs();
-    } else if (folderPage->isVisible()) {
+    if (currentPage==folderPage) {
         songs=folderPage->selectedSongs(FolderPage::ES_GuessTags);
+    } else if (currentPage) {
+        songs=currentPage->selectedSongs();
     }
-    #ifdef ENABLE_DEVICES_SUPPORT
-    else if (devicesPage->isVisible()) {
-        songs=devicesPage->selectedSongs();
-    }
-    #endif
 
     if (!songs.isEmpty()) {
         QString udi;
         #ifdef ENABLE_DEVICES_SUPPORT
-        if (devicesPage->isVisible()) {
+        if (currentPage==devicesPage) {
             udi=devicesPage->activeFsDeviceUdi();
             if (udi.isEmpty()) {
                 return;
             }
         }
         #endif
-
         RgDialog *dlg=new RgDialog(this);
         dlg->show(songs, udi);
     }
@@ -2866,10 +2720,8 @@ void MainWindow::setCover()
     }
 
     Song song;
-    if (libraryPage->isVisible()) {
-        song=libraryPage->coverRequest();
-    } else if (albumsPage->isVisible()) {
-        song=albumsPage->coverRequest();
+    if (currentPage) {
+        song=currentPage->coverRequest();
     }
 
     if (!song.isEmpty()) {
@@ -2878,16 +2730,6 @@ void MainWindow::setCover()
     }
 }
 
-int MainWindow::currentTrackPosition() const
-{
-    return positionSlider->value();
-}
-
-QString MainWindow::coverFile() const
-{
-    return coverWidget->fileName();
-}
-
 void MainWindow::updateNextTrack(int nextTrackId)
 {
     if (-1!=nextTrackId && MPDState_Stopped==MPDStatus::self()->state()) {
@@ -2919,22 +2761,66 @@ void MainWindow::updateActionToolTips()
     tabWidget->SetToolTip(PAGE_ALBUMS, albumsTabAction->toolTip());
     tabWidget->SetToolTip(PAGE_FOLDERS, foldersTabAction->toolTip());
     tabWidget->SetToolTip(PAGE_PLAYLISTS, playlistsTabAction->toolTip());
+    #ifdef ENABLE_DYNAMIC
     tabWidget->SetToolTip(PAGE_DYNAMIC, dynamicTabAction->toolTip());
+    #endif
+    #ifdef ENABLE_STREAMS
     tabWidget->SetToolTip(PAGE_STREAMS, streamsTabAction->toolTip());
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     tabWidget->SetToolTip(PAGE_ONLINE, onlineTabAction->toolTip());
+    #endif
     #ifdef ENABLE_DEVICES_SUPPORT
     tabWidget->SetToolTip(PAGE_DEVICES, devicesTabAction->toolTip());
     #endif
+    tabWidget->SetToolTip(PAGE_SEARCH, searchTabAction->toolTip());
     tabWidget->SetToolTip(PAGE_CONTEXT, songInfoAction->toolTip());
 }
 
 void MainWindow::setPlaylistsEnabled(bool e)
 {
     PlaylistsModel::self()->setEnabled(e);
-    StdActions::self()->addToStoredPlaylistAction->setVisible(PlaylistsModel::self()->isEnabled());
-    StdActions::self()->savePlayQueueAction->setVisible(PlaylistsModel::self()->isEnabled());
-    savePlayQueueButton->setVisible(PlaylistsModel::self()->isEnabled());
-    addPlayQueueToStoredPlaylistAction->setVisible(PlaylistsModel::self()->isEnabled());
+    controlPlaylistActions();
+}
+
+void MainWindow::controlPlaylistActions()
+{
+    bool enable=!MPDConnection::self()->isMopdidy() && PlaylistsModel::self()->isEnabled();
+    StdActions::self()->addToStoredPlaylistAction->setVisible(enable);
+    StdActions::self()->savePlayQueueAction->setVisible(enable);
+    savePlayQueueButton->setVisible(enable);
+    midSpacer->setVisible(enable);
+    addPlayQueueToStoredPlaylistAction->setVisible(enable);
+}
+
+void MainWindow::startContextTimer()
+{
+    if (!contextSwitchTime) {
+        return;
+    }
+    if (!contextTimer) {
+        contextTimer=new QTimer(this);
+        contextTimer->setSingleShot(true);
+        connect(contextTimer, SIGNAL(timeout()), this, SLOT(toggleContext()));
+    }
+    contextTimer->start(contextSwitchTime);
+}
+
+void MainWindow::toggleContext()
+{
+    if ( songInfoButton->isVisible() &&
+         ( (MPDState_Playing==MPDStatus::self()->state() && !songInfoAction->isChecked()) ||
+           (MPDState_Stopped==MPDStatus::self()->state() && songInfoAction->isChecked()) ) ) {
+        songInfoAction->trigger();
+    }
+}
+
+void MainWindow::hideMenuBar()
+{
+    // For Qt builds that have not been modified for dbus-menu, we need to hide the actual menubar!
+    if (menuBar()) {
+        menuBar()->setVisible(false);
+    }
 }
 
 #if !defined Q_OS_WIN && !defined Q_OS_MAC && QT_VERSION < 0x050000
@@ -2957,10 +2843,9 @@ void MainWindow::restoreWindow()
     raise();
     showNormal();
     activateWindow();
-    #if !defined Q_OS_WIN && !defined Q_OS_MAC && QT_VERSION < 0x050000
-    // This section seems to be required for compiz...
-    // ...without this, when 'qdbus com.googlecode.cantata /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Raise' is used
-    // the Unity launcher item is highlighted, but the window is not shown!
+    #if !defined Q_OS_WIN && !defined Q_OS_MAC
+    // This section seems to be required for compiz, so that MPRIS.Raise actually shows the window, and not just highlight launcher.
+    #if QT_VERSION < 0x050000
     static const Atom constNetActive=XInternAtom(QX11Info::display(), "_NET_ACTIVE_WINDOW", False);
     QX11Info info;
     XEvent xev;
@@ -2974,14 +2859,23 @@ void MainWindow::restoreWindow()
     xev.xclient.data.l[0] = 2;
     xev.xclient.data.l[1] = xev.xclient.data.l[2] = xev.xclient.data.l[3] = xev.xclient.data.l[4] = 0;
     XSendEvent(QX11Info::display(), QX11Info::appRootWindow(info.screen()), False, SubstructureRedirectMask|SubstructureNotifyMask, &xev);
-    #endif
+    #else // QT_VERSION < 0x050000
+    QString wmctrl=Utils::findExe(QLatin1String("wmctrl"));
+    if (!wmctrl.isEmpty()) {
+        if (wasHidden) {
+            QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
+        }
+        QProcess::execute(wmctrl, QStringList() << QLatin1String("-i") << QLatin1String("-a") << QString::number(effectiveWinId()));
+    }
+    #endif // QT_VERSION < 0x050000
+    #endif // !defined Q_OS_WIN && !defined Q_OS_MAC
     if (wasHidden && !lastPos.isNull()) {
         move(lastPos);
     }
 }
 
 #ifdef Q_OS_WIN
-// This is down here, because windows.h includes ALL windows stuff - and we get conflics with MessageBox :-(
+// This is down here, because windows.h includes ALL windows stuff - and we get conflicts with MessageBox :-(
 #include <windows.h>
 static void raiseWindow(QWidget *w)
 {
diff --git a/gui/mainwindow.h b/gui/mainwindow.h
index c23f861..be67591 100644
--- a/gui/mainwindow.h
+++ b/gui/mainwindow.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -46,27 +46,28 @@
 #include "mpdconnection.h"
 #include "song.h"
 #include "config.h"
-#ifdef ENABLE_HTTP_STREAM_PLAYBACK
-#if QT_VERSION < 0x050000
-#include <phonon/mediaobject.h>
-#else
-#include <QtMultimedia/QMediaPlayer>
-#endif
-#endif
 
 class Action;
 class ActionCollection;
 class MainWindow;
+class Page;
 class LibraryPage;
 class AlbumsPage;
 class FolderPage;
 class PlaylistsPage;
+#ifdef ENABLE_DYNAMIC
 class DynamicPage;
+#endif
+#ifdef ENABLE_STREAMS
 class StreamsPage;
+#endif
+#ifdef ENABLE_ONLINE_SERVICES
 class OnlineServicesPage;
+#endif
 #ifdef ENABLE_DEVICES_SUPPORT
 class DevicesPage;
 #endif
+class SearchPage;
 class QAbstractItemView;
 #ifndef Q_OS_WIN
 class Mpris;
@@ -77,6 +78,7 @@ class QActionGroup;
 class QDateTime;
 class TrayItem;
 class GtkProxyStyle;
+class HttpStream;
 
 // Dummy classes so that when class name is saved to the config file, we get a more meaningful name than QWidget!!!
 class PlayQueuePage : public QWidget
@@ -114,19 +116,26 @@ class MainWindow : public MAIN_WINDOW_BASE_CLASS, private Ui::MainWindow
     Q_OBJECT
 
 public:
-    enum Page
+    enum Pages
     {
         PAGE_PLAYQUEUE,
         PAGE_LIBRARY,
         PAGE_ALBUMS,
         PAGE_FOLDERS,
         PAGE_PLAYLISTS,
+        #ifdef ENABLE_DYNAMIC
         PAGE_DYNAMIC,
+        #endif
+        #ifdef ENABLE_STREAMS
         PAGE_STREAMS,
+        #endif
+        #ifdef ENABLE_ONLINE_SERVICES
         PAGE_ONLINE,
+        #endif
         #ifdef ENABLE_DEVICES_SUPPORT
         PAGE_DEVICES,
         #endif
+        PAGE_SEARCH,
         PAGE_CONTEXT
     };
 
@@ -135,9 +144,9 @@ public:
     MainWindow(QWidget *parent = 0);
     ~MainWindow();
 
-    int mpdVolume() const;
-    int currentTrackPosition() const;
-    QString coverFile() const;
+    int mpdVolume() const { return volumeSlider->value(); }
+    int currentTrackPosition() const { return positionSlider->value(); }
+    QString coverFile() const { return coverWidget->fileName(); }
 
 protected:
     void keyPressEvent(QKeyEvent *event);
@@ -154,9 +163,6 @@ Q_SIGNALS:
     void play();
     void stop(bool afterCurrent=false);
     void getStatus();
-    void getStats(bool andUpdate);
-    void updateMpd();
-    void clear();
     void playListInfo();
     void currentSong();
     void setSeekId(qint32, quint32);
@@ -166,13 +172,11 @@ Q_SIGNALS:
     void enableOutput(int id, bool);
     void setPriority(const QList<qint32> &ids, quint8 priority);
     void addSongsToPlaylist(const QString &name, const QStringList &files);
-    void addAndPlay(const QString &file);
     void showPreferencesPage(const QString &page);
 
 public Q_SLOTS:
     void showError(const QString &message, bool showActions=false);
     void showInformation(const QString &message);
-    void showPage(const QString &page, bool showSearch);
     void dynamicStatus(const QString &message);
     void hideWindow();
     void restoreWindow();
@@ -186,6 +190,7 @@ public Q_SLOTS:
     void messageWidgetVisibility(bool v);
     void mpdConnectionStateChanged(bool connected);
     void playQueueItemsSelected(bool s);
+    void showSidebarPreferencesPage() { showPreferencesDialog("interface:sidebar"); }
     void showPreferencesDialog(const QString &page=QString());
     void quit();
     void updateSettings();
@@ -194,12 +199,11 @@ public Q_SLOTS:
     void connectToMpd();
     void connectToMpd(const MPDConnectionDetails &details);
     void streamUrl(const QString &u);
-    void refresh();
+    void refreshDbPromp();
     #ifndef ENABLE_KDE_SUPPORT
     void showAboutDialog();
     #endif
     void showServerInfo();
-    void toggleStream(bool s, const QString &url=QString());
     void stopPlayback();
     void stopAfterCurrentTrack();
     void stopAfterTrack();
@@ -207,6 +211,7 @@ public Q_SLOTS:
     void setPosition();
     void searchPlayQueue();
     void realSearchPlayQueue();
+    void playQueueSearchActivated(bool a);
     void updatePlayQueue(const QList<Song> &songs);
     void updateCurrentSong(const Song &song);
     void scrollPlayQueue();
@@ -215,20 +220,19 @@ public Q_SLOTS:
     void playQueueItemActivated(const QModelIndex &);
     void promptClearPlayQueue();
     void clearPlayQueue();
-    void removeFromPlayQueue();
-    void replacePlayQueue();
-    void addToPlayQueue();
-    void addRandomToPlayQueue();
+    void removeFromPlayQueue() { playQueueModel.remove(playQueueProxyModel.mapToSourceRows(playQueue->selectedIndexes())); }
+    void replacePlayQueue() { addToPlayQueue(true); }
+    void addToPlayQueue() { addToPlayQueue(false); }
+    void addRandomToPlayQueue() { addToPlayQueue(false, 0, true); }
     void addWithPriority();
     void addToNewStoredPlaylist();
-    void addToExistingStoredPlaylist(const QString &name);
+    void addToExistingStoredPlaylist(const QString &name) { addToExistingStoredPlaylist(name, playQueue->hasFocus()); }
     void addToExistingStoredPlaylist(const QString &name, bool pq);
     void addStreamToPlayQueue();
     void removeItems();
     void checkMpdAccessibility();
-    void cropPlayQueue();
+    void cropPlayQueue() { playQueueModel.crop(playQueueProxyModel.mapToSourceRows(playQueue->selectedIndexes())); }
     void updatePlayQueueStats(int songs, quint32 time);
-    void copyTrackInfo();
     void expandOrCollapse(bool saveCurrentSize=true);
     void showSongInfo();
     void fullScreen();
@@ -240,21 +244,33 @@ public Q_SLOTS:
     void showAlbumsTab() { showTab(PAGE_ALBUMS); }
     void showFoldersTab() { showTab(PAGE_FOLDERS); }
     void showPlaylistsTab() { showTab(PAGE_PLAYLISTS); }
-    void showDynamicTab() { showTab(PAGE_DYNAMIC); }
-    void showStreamsTab() { showTab(PAGE_STREAMS); }
-    void showOnlineTab() { showTab(PAGE_ONLINE); }
+    void showDynamicTab() {
+        #ifdef ENABLE_DYNAMIC
+        showTab(PAGE_DYNAMIC);
+        #endif
+    }
+    void showStreamsTab() {
+        #ifdef ENABLE_STREAMS
+        showTab(PAGE_STREAMS);
+        #endif
+    }
+    void showOnlineTab() {
+        #ifdef ENABLE_ONLINE_SERVICES
+        showTab(PAGE_ONLINE); 
+        #endif
+    }
     void showContextTab() { showTab(PAGE_CONTEXT); }
     void showDevicesTab() {
         #ifdef ENABLE_DEVICES_SUPPORT
         showTab(PAGE_DEVICES);
         #endif
     }
+    void showSearchTab() { showTab(PAGE_SEARCH); }
     void toggleSplitterAutoHide();
     void toggleMonoIcons();
     void locateTrack();
     void locateArtist(const QString &artist);
     void locateAlbum(const QString &artist, const QString &album);
-    void playSong(const QString &song);
     void editTags();
     void editPlayQueueTags();
     void organiseFiles();
@@ -264,7 +280,6 @@ public Q_SLOTS:
     void deleteSongs(const QString &from, const QList<Song> &songs);
     void replayGain();
     void setCover();
-    void goBack();
     void showSearch();
     void expandAll();
     void collapseAll();
@@ -275,6 +290,7 @@ public Q_SLOTS:
     void controlDynamicButton();
 
 private:
+    void expand();
     bool canShowDialog();
     void enableStopActions(bool enable);
     void updateStatus(MPDStatus * const status);
@@ -285,15 +301,21 @@ private:
     #ifdef TAGLIB_FOUND
     void editTags(const QList<Song> &songs, bool isPlayQueue);
     #endif
-    bool currentIsStream() const;
+    bool currentIsStream() const { return playQueueModel.rowCount() && -1!=current.id && current.isStream(); }
     void updateWindowTitle();
     void startVolumeFade(/*bool stop*/);
     void stopVolumeFade();
-    void showTab(int page);
-    bool fadeWhenStop() const;
+    void showTab(int page) { tabWidget->SetCurrentIndex(page); }
+    bool fadeWhenStop() const { return fadeStop && volumeSlider->isEnabled(); }
     void updateNextTrack(int nextTrackId);
     void updateActionToolTips();
     void setPlaylistsEnabled(bool e);
+    void controlPlaylistActions();
+    void startContextTimer();
+
+private Q_SLOTS:
+    void toggleContext();
+    void hideMenuBar();
 
 private:
     int loaded;
@@ -303,6 +325,8 @@ private:
     PlayQueueProxyModel playQueueProxyModel;
     bool autoScrollPlayQueue;
     Action *prefAction;
+    Action *refreshDbAction;
+    Action *doDbRefreshAction;
     #ifdef ENABLE_KDE_SUPPORT
     Action *shortcutsAction;
     #endif
@@ -314,7 +338,6 @@ private:
     Action *removeFromPlayQueueAction;
     Action *addPlayQueueToStoredPlaylistAction;
     Action *promptClearPlayQueueAction;
-    Action *copyTrackInfoAction;
     Action *cropPlayQueueAction;
     Action *shufflePlayQueueAction;
     Action *shufflePlayQueueAlbumsAction;
@@ -326,6 +349,7 @@ private:
     Action *searchPlayQueueAction;
     Action *setPriorityAction;
     #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+    HttpStream *httpStream;
     Action *streamPlayAction;
     #endif
     Action *expandInterfaceAction;
@@ -339,39 +363,52 @@ private:
     Action *albumsTabAction;
     Action *foldersTabAction;
     Action *playlistsTabAction;
+    #ifdef ENABLE_DYNAMIC
     Action *dynamicTabAction;
+    #endif
+    #ifdef ENABLE_STREAMS
     Action *streamsTabAction;
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     Action *onlineTabAction;
+    #endif
     #ifdef TAGLIB_FOUND
     Action *editPlayQueueTagsAction;
     #endif
     #ifdef ENABLE_DEVICES_SUPPORT
     Action *devicesTabAction;
     #endif
+    Action *searchTabAction;
     Action *expandAllAction;
     Action *collapseAllAction;
     Action *serverInfoAction;
     Action *clearPlayQueueAction;
     Action *cancelAction;
-    QAction *autoHideSplitterAction;
-    QAction *monoIconsAction;
     TrayItem *trayItem;
     QPoint lastPos;
     QSize expandedSize;
     QSize collapsedSize;
     Song current;
+    Page *currentPage;
     QWidget *playQueuePage;
     LibraryPage *libraryPage;
     AlbumsPage *albumsPage;
     FolderPage *folderPage;
     PlaylistsPage *playlistsPage;
+    #ifdef ENABLE_DYNAMIC
     DynamicPage *dynamicPage;
+    #endif
+    #ifdef ENABLE_STREAMS
     StreamsPage *streamsPage;
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     OnlineServicesPage *onlinePage;
+    #endif
     QWidget *contextPage;
     #ifdef ENABLE_DEVICES_SUPPORT
     DevicesPage *devicesPage;
     #endif
+    SearchPage *searchPage;
     #ifndef Q_OS_WIN
     Mpris *mpris;
     GtkProxyStyle *gtkStyle;
@@ -381,6 +418,8 @@ private:
     #if !defined Q_OS_WIN && !defined Q_OS_MAC
     QTimer *mpdAccessibilityTimer;
     #endif
+    QTimer *contextTimer;
+    int contextSwitchTime;
 
     enum ConnState {
         CS_Init,
@@ -403,14 +442,6 @@ private:
     int origVolume;
     int lastVolume;
     StopState stopState;
-    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-    bool httpStreamEnabled;
-    #if QT_VERSION < 0x050000
-    Phonon::MediaObject *httpStream;
-    #else
-    QMediaPlayer *httpStream;
-    #endif
-    #endif
     friend class CoverEventHandler;
     friend class TrayItem;
 };
diff --git a/gui/mainwindow.ui b/gui/mainwindow.ui
index dd5de22..52b6f9a 100644
--- a/gui/mainwindow.ui
+++ b/gui/mainwindow.ui
@@ -27,7 +27,7 @@
     <number>0</number>
    </property>
    <item>
-    <widget class="ToolBar" name="toolbar" native="true">
+    <widget class="QWidget" name="toolbar" native="true">
      <layout class="QGridLayout" name="gridLayout_2">
       <property name="leftMargin">
        <number>0</number>
@@ -72,7 +72,11 @@
          <number>0</number>
         </property>
         <item>
-         <widget class="ToolButton" name="prevTrackButton"/>
+         <widget class="ToolButton" name="prevTrackButton">
+          <property name="focusPolicy">
+           <enum>Qt::NoFocus</enum>
+          </property>
+         </widget>
         </item>
         <item>
          <widget class="ToolButton" name="playPauseTrackButton"/>
@@ -257,10 +261,10 @@
          </spacer>
         </item>
         <item>
-         <widget class="PlayQueueView" name="playQueue"/>
+         <widget class="SearchWidget" name="playQueueSearchWidget"/>
         </item>
         <item>
-         <widget class="SearchWidget" name="playQueueSearchWidget"/>
+         <widget class="PlayQueueView" name="playQueue"/>
         </item>
         <item>
          <layout class="QHBoxLayout" name="hlayout">
@@ -346,10 +350,7 @@
            </widget>
           </item>
           <item>
-           <widget class="SpacerWidget" name="horizontalSpacer_4b" native="true"/>
-          </item>
-          <item>
-           <widget class="ToolButton" name="searchPlayQueueButton"/>
+           <widget class="SpacerWidget" name="midSpacer" native="true"/>
           </item>
           <item>
            <widget class="ToolButton" name="savePlayQueueButton"/>
@@ -380,11 +381,6 @@
    <header>squeezedtextlabel.h</header>
   </customwidget>
   <customwidget>
-   <class>ToolBar</class>
-   <extends>QWidget</extends>
-   <header>toolbar.h</header>
-  </customwidget>
-  <customwidget>
    <class>PlayQueueView</class>
    <extends>QTreeView</extends>
    <header>playqueueview.h</header>
diff --git a/gui/mediakeys.cpp b/gui/mediakeys.cpp
index 2090cb7..f93c58d 100644
--- a/gui/mediakeys.cpp
+++ b/gui/mediakeys.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/gui/mediakeys.h b/gui/mediakeys.h
index 52a4e32..c320f52 100644
--- a/gui/mediakeys.h
+++ b/gui/mediakeys.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/gui/multimediakeysinterface.h b/gui/multimediakeysinterface.h
index 6ddbb8b..b7aaac5 100644
--- a/gui/multimediakeysinterface.h
+++ b/gui/multimediakeysinterface.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/context/lyricsdialog.h b/gui/page.h
similarity index 50%
copy from context/lyricsdialog.h
copy to gui/page.h
index f27d543..d5e1cd1 100644
--- a/context/lyricsdialog.h
+++ b/gui/page.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -21,29 +21,28 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef LYRICSDIALOG_H
-#define LYRICSDIALOG_H
+#ifndef PAGE_H
+#define PAGE_H
 
-#include "dialog.h"
-#include "lineedit.h"
 #include "song.h"
 
-class LyricsDialog : public Dialog
+class Page
 {
-    Q_OBJECT
-
 public:
-    LyricsDialog(const Song &s, QWidget *parent);
-
-    Song song() const;
-
-private Q_SLOTS:
-    void changed();
-
-private:
-    Song prev;
-    LineEdit *titleEntry;
-    LineEdit *artistEntry;
+    Page() { }
+    virtual ~Page() { }
+    virtual Song coverRequest() const { return Song(); }
+    virtual QList<Song> selectedSongs(bool allowPlaylists=false) const { Q_UNUSED(allowPlaylists) return QList<Song>(); }
+    virtual void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0, bool randomAlbums=false) {
+        Q_UNUSED(name) Q_UNUSED(replace) Q_UNUSED(priorty) Q_UNUSED(randomAlbums)
+    }
+    #ifdef ENABLE_DEVICES_SUPPORT
+    virtual void addSelectionToDevice(const QString &udi) { Q_UNUSED(udi) }
+    virtual void deleteSongs() { }
+    #endif
+    virtual void focusSearch() { }
+    virtual void removeItems() { }
+    virtual void controlActions() { }
 };
 
 #endif
diff --git a/gui/playbacksettings.cpp b/gui/playbacksettings.cpp
index 75e7b60..c1f1a69 100644
--- a/gui/playbacksettings.cpp
+++ b/gui/playbacksettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -39,8 +39,6 @@ PlaybackSettings::PlaybackSettings(QWidget *p)
     : QWidget(p)
 {
     setupUi(this);
-    stopFadeDuration->setSpecialValueText(i18n("Do not fadeout"));
-    stopFadeDuration->setSuffix(i18n(" ms"));
     stopFadeDuration->setRange(Settings::MinFade, Settings::MaxFade);
     stopFadeDuration->setSingleStep(100);
 
@@ -63,7 +61,6 @@ PlaybackSettings::PlaybackSettings(QWidget *p)
     messageIcon->setMaximumSize(iconSize, iconSize);
     mpdConnectionStateChanged(MPDConnection::self()->isConnected());
     #ifdef Q_OS_WIN
-    REMOVE(inhibitSuspendLabel)
     REMOVE(inhibitSuspend)
     #endif
     outputsView->setVisible(outputsView->count()>1);
diff --git a/gui/playbacksettings.h b/gui/playbacksettings.h
index 24527fa..9fb86f4 100644
--- a/gui/playbacksettings.h
+++ b/gui/playbacksettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/gui/playbacksettings.ui b/gui/playbacksettings.ui
index 2ad3b86..1c3d535 100644
--- a/gui/playbacksettings.ui
+++ b/gui/playbacksettings.ui
@@ -11,9 +11,97 @@
    </rect>
   </property>
   <layout class="QVBoxLayout" name="mainLayout">
-   <property name="margin">
+   <property name="leftMargin">
     <number>0</number>
    </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QGroupBox" name="stopPlaybackBox">
+     <property name="title">
+      <string>Playback</string>
+     </property>
+     <layout class="QFormLayout" name="formLayout">
+      <property name="fieldGrowthPolicy">
+       <enum>QFormLayout::ExpandingFieldsGrow</enum>
+      </property>
+      <item row="0" column="0">
+       <widget class="BuddyLabel" name="label_6b">
+        <property name="text">
+         <string>Fadeout on stop:</string>
+        </property>
+        <property name="buddy">
+         <cstring>stopFadeDuration</cstring>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QSpinBox" name="stopFadeDuration">
+        <property name="suffix">
+         <string> ms</string>
+        </property>
+        <property name="specialValueText">
+         <string>None</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0" colspan="2">
+       <widget class="QCheckBox" name="stopOnExit">
+        <property name="text">
+         <string>Stop playback on exit</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0" colspan="2">
+       <widget class="QCheckBox" name="stopDynamizerOnExit">
+        <property name="text">
+         <string>Stop dynamizer on exit</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0" colspan="2">
+       <widget class="QCheckBox" name="inhibitSuspend">
+        <property name="text">
+         <string>Inhibit suspend whilst playing</string>
+        </property>
+       </widget>
+      </item>
+      <item row="4" column="0">
+       <spacer name="verticalSpacer_8">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeType">
+         <enum>QSizePolicy::Fixed</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>20</width>
+          <height>13</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="5" column="0" colspan="2">
+       <widget class="QLabel" name="noteLabel">
+        <property name="text">
+         <string><i><b>NOTE:</b> If you press and hold the stop button, then a menu will be shown allowing you to choose whether to stop playback now, or after the current track.</i></string>
+        </property>
+        <property name="wordWrap">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
    <item>
     <widget class="QGroupBox" name="outputBox">
      <property name="title">
@@ -38,7 +126,7 @@
         <item row="0" column="0">
          <widget class="BuddyLabel" name="crossfadingLabel">
           <property name="text">
-           <string>Crossfading:</string>
+           <string>Crossfade between tracks:</string>
           </property>
           <property name="buddy">
            <cstring>crossfading</cstring>
@@ -46,13 +134,16 @@
          </widget>
         </item>
         <item row="0" column="1">
-         <widget class="SpinBox" name="crossfading">
+         <widget class="QSpinBox" name="crossfading">
           <property name="suffix">
-           <string> seconds</string>
+           <string> s</string>
           </property>
           <property name="maximum">
            <number>20</number>
           </property>
+          <property name="specialValueText">
+           <string>None</string>
+          </property>
          </widget>
         </item>
         <item row="1" column="0">
@@ -67,7 +158,16 @@
         </item>
         <item row="1" column="1">
          <layout class="QHBoxLayout" name="replayGainayout">
-          <property name="margin">
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
            <number>0</number>
           </property>
           <item>
@@ -98,14 +198,17 @@
           </item>
          </layout>
         </item>
-        <item row="2" column="0">
+        <item row="2" column="0" colspan="2">
          <widget class="QLabel" name="outputsViewLabel">
           <property name="text">
-           <string>Devices:</string>
+           <string>Use the checkboxes below to control the active outputs.</string>
+          </property>
+          <property name="wordWrap">
+           <bool>true</bool>
           </property>
          </widget>
         </item>
-        <item row="2" column="1">
+        <item row="3" column="0" colspan="2">
          <widget class="QListWidget" name="outputsView"/>
         </item>
        </layout>
@@ -127,104 +230,6 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="stopPlaybackBox">
-     <property name="title">
-      <string>Playback</string>
-     </property>
-     <layout class="QFormLayout" name="formLayout">
-      <property name="fieldGrowthPolicy">
-       <enum>QFormLayout::ExpandingFieldsGrow</enum>
-      </property>
-      <item row="0" column="0">
-       <widget class="BuddyLabel" name="label_6b">
-        <property name="text">
-         <string>Fadeout on stop:</string>
-        </property>
-        <property name="buddy">
-         <cstring>stopFadeDuration</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="SpinBox" name="stopFadeDuration"/>
-      </item>
-      <item row="1" column="0">
-       <widget class="BuddyLabel" name="stopOnExitLabel">
-        <property name="text">
-         <string>Stop playback on exit:</string>
-        </property>
-        <property name="buddy">
-         <cstring>stopOnExit</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="OnOffButton" name="stopOnExit"/>
-      </item>
-      <item row="2" column="0">
-       <widget class="BuddyLabel" name="stopDynamizerOnExitLabel">
-        <property name="text">
-         <string>Stop dynamizer on exit:</string>
-        </property>
-        <property name="buddy">
-         <cstring>stopDynamizerOnExit</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="OnOffButton" name="stopDynamizerOnExit">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="0">
-       <widget class="BuddyLabel" name="inhibitSuspendLabel">
-        <property name="text">
-         <string>Inhibit suspend whilst playing:</string>
-        </property>
-        <property name="buddy">
-         <cstring>inhibitSuspend</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1">
-       <widget class="OnOffButton" name="inhibitSuspend">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="0">
-       <spacer name="verticalSpacer_8">
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="sizeType">
-         <enum>QSizePolicy::Fixed</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>20</width>
-          <height>13</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="5" column="0" colspan="2">
-       <widget class="QLabel" name="noteLabel">
-        <property name="text">
-         <string><i><b>NOTE:</b> If you press and hold the stop button, then a menu will be shown allowing you to choose whether to stop playback now, or after the current track.</i></string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
     <spacer name="paddingSpacer">
      <property name="orientation">
       <enum>Qt::Vertical</enum>
@@ -246,30 +251,11 @@
    <header>buddylabel.h</header>
   </customwidget>
   <customwidget>
-   <class>SpinBox</class>
-   <extends>QSpinBox</extends>
-   <header>spinbox.h</header>
-  </customwidget>
-  <customwidget>
-   <class>OnOffButton</class>
-   <extends>QCheckBox</extends>
-   <header>onoffbutton.h</header>
-  </customwidget>
-  <customwidget>
    <class>UrlLabel</class>
    <extends>QWidget</extends>
    <header>urllabel.h</header>
   </customwidget>
  </customwidgets>
- <tabstops>
-  <tabstop>crossfading</tabstop>
-  <tabstop>replayGain</tabstop>
-  <tabstop>outputsView</tabstop>
-  <tabstop>stopFadeDuration</tabstop>
-  <tabstop>stopOnExit</tabstop>
-  <tabstop>stopDynamizerOnExit</tabstop>
-  <tabstop>inhibitSuspend</tabstop>
- </tabstops>
  <resources/>
  <connections/>
 </ui>
diff --git a/gui/playlistspage.cpp b/gui/playlistspage.cpp
index 5360942..2146b9b 100644
--- a/gui/playlistspage.cpp
+++ b/gui/playlistspage.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -31,31 +31,48 @@
 #include "stdactions.h"
 #include "actioncollection.h"
 #include "mpdconnection.h"
+#include "tableview.h"
 #include <QMenu>
 #ifndef ENABLE_KDE_SUPPORT
 #include <QStyle>
 #endif
 
+class PlaylistTableView : public TableView
+{
+public:
+    PlaylistTableView(QWidget *p)
+        : TableView(QLatin1String("playlist"), p)
+    {
+        setUseSimpleDelegate();
+        setIndentation(fontMetrics().width(QLatin1String("XX")));
+    }
+
+    virtual ~PlaylistTableView() { }
+};
+
 PlaylistsPage::PlaylistsPage(QWidget *p)
     : QWidget(p)
 {
     setupUi(this);
     renamePlaylistAction = ActionCollection::get()->createAction("renameplaylist", i18n("Rename"), "edit-rename");
+    removeDuplicatesAction=new Action(i18n("Remove Duplicates"), this);
+    removeDuplicatesAction->setEnabled(false);
     replacePlayQueue->setDefaultAction(StdActions::self()->replacePlayQueueAction);
-    libraryUpdate->setDefaultAction(StdActions::self()->refreshAction);
-    searchButton->setDefaultAction(StdActions::self()->searchAction);
     connect(genreCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(searchItems()));
     connect(PlaylistsModel::self(), SIGNAL(updateGenres(const QSet<QString> &)), genreCombo, SLOT(update(const QSet<QString> &)));
 
     view->allowGroupedView();
+    view->allowTableView(new PlaylistTableView(view));
     view->addAction(StdActions::self()->addToPlayQueueAction);
     view->addAction(StdActions::self()->replacePlayQueueAction);
     view->addAction(StdActions::self()->addWithPriorityAction);
+    view->addAction(StdActions::self()->addToStoredPlaylistAction);
     #ifdef ENABLE_DEVICES_SUPPORT
     view->addAction(StdActions::self()->copyToDeviceAction);
     #endif
     view->addAction(renamePlaylistAction);
     view->addAction(StdActions::self()->removeAction);
+    view->addAction(removeDuplicatesAction);
     view->setUniformRowHeights(true);
     view->setAcceptDrops(true);
     view->setDragDropOverwriteMode(false);
@@ -70,6 +87,7 @@ PlaylistsPage::PlaylistsPage(QWidget *p)
     connect(view, SIGNAL(searchItems()), this, SLOT(searchItems()));
     connect(view, SIGNAL(rootIndexSet(QModelIndex)), this, SLOT(updateGenres(QModelIndex)));
     //connect(this, SIGNAL(add(const QStringList &)), MPDConnection::self(), SLOT(add(const QStringList &)));
+    connect(this, SIGNAL(addSongsToPlaylist(const QString &, const QStringList &)), MPDConnection::self(), SLOT(addToPlaylist(const QString &, const QStringList &)));
     connect(this, SIGNAL(loadPlaylist(const QString &, bool)), MPDConnection::self(), SLOT(loadPlaylist(const QString &, bool)));
     connect(this, SIGNAL(removePlaylist(const QString &)), MPDConnection::self(), SLOT(removePlaylist(const QString &)));
     connect(this, SIGNAL(savePlaylist(const QString &)), MPDConnection::self(), SLOT(savePlaylist(const QString &)));
@@ -77,6 +95,7 @@ PlaylistsPage::PlaylistsPage(QWidget *p)
     connect(this, SIGNAL(removeFromPlaylist(const QString &, const QList<quint32> &)), MPDConnection::self(), SLOT(removeFromPlaylist(const QString &, const QList<quint32> &)));
     connect(StdActions::self()->savePlayQueueAction, SIGNAL(triggered(bool)), this, SLOT(savePlaylist()));
     connect(renamePlaylistAction, SIGNAL(triggered(bool)), this, SLOT(renamePlaylist()));
+    connect(removeDuplicatesAction, SIGNAL(triggered(bool)), this, SLOT(removeDuplicates()));
     connect(PlaylistsModel::self(), SIGNAL(updated(const QModelIndex &)), this, SLOT(updated(const QModelIndex &)));
     connect(PlaylistsModel::self(), SIGNAL(playlistRemoved(quint32)), view, SLOT(collectionRemoved(quint32)));
     QMenu *menu=new QMenu(this);
@@ -91,6 +110,14 @@ PlaylistsPage::~PlaylistsPage()
 {
 }
 
+void PlaylistsPage::saveConfig()
+{
+    TableView *tv=qobject_cast<TableView *>(view->view());
+    if (tv) {
+        tv->saveHeader();
+    }
+}
+
 void PlaylistsPage::showEvent(QShowEvent *e)
 {
     view->focusView();
@@ -114,7 +141,7 @@ void PlaylistsPage::updateRows()
 
 void PlaylistsPage::refresh()
 {
-    view->setLevel(0);
+    view->goToTop();
     PlaylistsModel::self()->getPlaylists();
 }
 
@@ -138,14 +165,16 @@ void PlaylistsPage::clear()
 //    return PlaylistsModel::self()->filenames(mapped, true);
 //}
 
-void PlaylistsPage::addSelectionToPlaylist(bool replace, quint8 priorty)
+void PlaylistsPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty, bool randomAlbums)
 {
-    addItemsToPlayQueue(view->selectedIndexes(), replace, priorty);
+    Q_UNUSED(randomAlbums)
+    addItemsToPlayList(view->selectedIndexes(), name, replace, priorty);
 }
 
 void PlaylistsPage::setView(int mode)
 {
     //bool diff=view->viewMode()!=mode;
+    PlaylistsModel::self()->setMultiColumn(ItemView::Mode_Table==mode);
     view->setMode((ItemView::Mode)mode);
     //if (diff) {
     //    clear();
@@ -165,15 +194,17 @@ void PlaylistsPage::removeItems()
 
             if(realIndex.isValid()) {
                 PlaylistsModel::Item *item=static_cast<PlaylistsModel::Item *>(realIndex.internalPointer());
-                if(item->isPlaylist()) {
+                if (item->isPlaylist()) {
                     PlaylistsModel::PlaylistItem *pl=static_cast<PlaylistsModel::PlaylistItem *>(item);
-                    remPlaylists.insert(pl->name);
+                    if (!pl->isSmartPlaylist) {
+                        remPlaylists.insert(pl->name);
+                    }
                     if (remSongs.contains(pl->name)) {
                         remSongs.remove(pl->name);
                     }
                 } else {
                     PlaylistsModel::SongItem *song=static_cast<PlaylistsModel::SongItem *>(item);
-                    if (!remPlaylists.contains(song->parent->name)) {
+                    if (!song->parent->isSmartPlaylist && !remPlaylists.contains(song->parent->name)) {
                         remSongs[song->parent->name].append(song->parent->songs.indexOf(song));
                     }
                 }
@@ -225,8 +256,12 @@ void PlaylistsPage::renamePlaylist()
     const QModelIndexList items = view->selectedIndexes(false); // Dont need sorted selection here...
 
     if (1==items.size()) {
-        QModelIndex sourceIndex = proxy.mapToSource(items.first());
-        QString name = PlaylistsModel::self()->data(sourceIndex, Qt::DisplayRole).toString();
+        QModelIndex index = proxy.mapToSource(items.first());
+        PlaylistsModel::Item *item=static_cast<PlaylistsModel::Item *>(index.internalPointer());
+        if (!item->isPlaylist()) {
+            return;
+        }
+        QString name = static_cast<PlaylistsModel::PlaylistItem *>(item)->name;
         QString newName = InputDialog::getText(i18n("Rename Playlist"), i18n("Enter new name for playlist:"), name, 0, this);
 
         if (!newName.isEmpty() && name!=newName) {
@@ -244,6 +279,41 @@ void PlaylistsPage::renamePlaylist()
     }
 }
 
+void PlaylistsPage::removeDuplicates()
+{
+    const QModelIndexList items = view->selectedIndexes(false); // Dont need sorted selection here...
+
+    if (1==items.size()) {
+        QModelIndex index = proxy.mapToSource(items.first());
+        PlaylistsModel::Item *item=static_cast<PlaylistsModel::Item *>(index.internalPointer());
+        if (!item->isPlaylist()) {
+            return;
+        }
+
+        PlaylistsModel::PlaylistItem *pl=static_cast<PlaylistsModel::PlaylistItem *>(item);
+        QMap<QString, QList<Song> > map;
+        for (int i=0; i<pl->songs.count(); ++i) {
+            Song song=*(pl->songs.at(i));
+            song.id=i;
+            map[song.artistSong()].append(song);
+        }
+
+        QList<quint32> toRemove;
+        foreach (const QString &key, map.keys()) {
+            QList<Song> values=map.value(key);
+            if (values.size()>1) {
+                Song::sortViaType(values);
+                for (int i=1; i<values.count(); ++i) {
+                    toRemove.append(values.at(i).id);
+                }
+            }
+        }
+        if (!toRemove.isEmpty()) {
+            emit removeFromPlaylist(pl->name, toRemove);
+        }
+    }
+}
+
 void PlaylistsPage::itemDoubleClicked(const QModelIndex &index)
 {
     if (
@@ -255,11 +325,11 @@ void PlaylistsPage::itemDoubleClicked(const QModelIndex &index)
         || !static_cast<PlaylistsModel::Item *>(proxy.mapToSource(index).internalPointer())->isPlaylist()) {
         QModelIndexList indexes;
         indexes.append(index);
-        addItemsToPlayQueue(indexes, false);
+        addItemsToPlayList(indexes, QString(), false);
     }
 }
 
-void PlaylistsPage::addItemsToPlayQueue(const QModelIndexList &indexes, bool replace, quint8 priorty)
+void PlaylistsPage::addItemsToPlayList(const QModelIndexList &indexes, const QString &name, bool replace, quint8 priorty)
 {
     if (indexes.isEmpty()) {
         return;
@@ -267,7 +337,7 @@ void PlaylistsPage::addItemsToPlayQueue(const QModelIndexList &indexes, bool rep
 
     // If we only have 1 item selected, see if it is a playlist. If so, we might be able to
     // just ask MPD to load it...
-    if (1==indexes.count() && 0==priorty) {
+    if (name.isEmpty() && 1==indexes.count() && 0==priorty) {
         QModelIndex idx=proxy.mapToSource(*(indexes.begin()));
         PlaylistsModel::Item *item=static_cast<PlaylistsModel::Item *>(idx.internalPointer());
 
@@ -278,20 +348,35 @@ void PlaylistsPage::addItemsToPlayQueue(const QModelIndexList &indexes, bool rep
     }
 
     QModelIndexList mapped;
+    bool checkNames=!name.isEmpty();
     foreach (const QModelIndex &idx, indexes) {
-        mapped.append(proxy.mapToSource(idx));
+        QModelIndex m=proxy.mapToSource(idx);
+        if (checkNames) {
+            PlaylistsModel::Item *item=static_cast<PlaylistsModel::Item *>(m.internalPointer());
+            if ( (item->isPlaylist() && static_cast<PlaylistsModel::PlaylistItem *>(item)->name==name) ||
+                 (!item->isPlaylist() && static_cast<PlaylistsModel::SongItem *>(item)->parent->name==name) ) {
+                MessageBox::error(this, i18n("Cannot add songs from '%1' to '%2'", name, name));
+                return;
+            }
+        }
+        mapped.append(m);
     }
 
     QStringList files=PlaylistsModel::self()->filenames(mapped);
     if (!files.isEmpty()) {
-        emit add(files, replace, priorty);
+        if (name.isEmpty()) {
+            emit add(files, replace, priorty);
+        } else {
+            emit addSongsToPlaylist(name, files);
+        }
         view->clearSelection();
     }
 }
 
 #ifdef ENABLE_DEVICES_SUPPORT
-QList<Song> PlaylistsPage::selectedSongs() const
+QList<Song> PlaylistsPage::selectedSongs(bool allowPlaylists) const
 {
+    Q_UNUSED(allowPlaylists)
     QModelIndexList selected = view->selectedIndexes();
 
     if (selected.isEmpty()) {
@@ -319,24 +404,45 @@ void PlaylistsPage::addSelectionToDevice(const QString &udi)
 void PlaylistsPage::controlActions()
 {
     QModelIndexList selected=view->selectedIndexes(false); // Dont need sorted selection here...
-    bool canRename=false;
     bool enableActions=selected.count()>0;
+    bool allSmartPlaylists=false;
+    bool canRename=false;
 
     if (1==selected.count()) {
         QModelIndex index = proxy.mapToSource(selected.first());
         PlaylistsModel::Item *item=static_cast<PlaylistsModel::Item *>(index.internalPointer());
-        if (item && item->isPlaylist()) {
-            canRename=true;
+        if (item) {
+            if (item->isPlaylist()) {
+                if (static_cast<PlaylistsModel::PlaylistItem *>(item)->isSmartPlaylist) {
+                    allSmartPlaylists=true;
+                } else {
+                    canRename=true;
+                }
+            } else if (static_cast<PlaylistsModel::SongItem *>(item)->parent->isSmartPlaylist) {
+                allSmartPlaylists=true;
+            }
+        }
+    } else if (selected.count()<=200) {
+        allSmartPlaylists=true;
+        foreach (const QModelIndex &index, selected) {
+            PlaylistsModel::Item *item=static_cast<PlaylistsModel::Item *>(proxy.mapToSource(index).internalPointer());
+            if (item && !(item->isPlaylist() ? static_cast<PlaylistsModel::PlaylistItem *>(item)->isSmartPlaylist
+                                             : static_cast<PlaylistsModel::SongItem *>(item)->parent->isSmartPlaylist)) {
+                allSmartPlaylists=false;
+                break;
+            }
         }
     }
 
     renamePlaylistAction->setEnabled(canRename);
-    StdActions::self()->removeAction->setEnabled(enableActions);
+    removeDuplicatesAction->setEnabled(enableActions && !allSmartPlaylists);
+    StdActions::self()->removeAction->setEnabled(enableActions && !allSmartPlaylists);
     StdActions::self()->replacePlayQueueAction->setEnabled(enableActions);
     StdActions::self()->addToPlayQueueAction->setEnabled(enableActions);
     StdActions::self()->addWithPriorityAction->setEnabled(enableActions);
+    StdActions::self()->addToStoredPlaylistAction->setEnabled(enableActions);
     #ifdef ENABLE_DEVICES_SUPPORT
-    StdActions::self()->copyToDeviceAction->setEnabled(enableActions);
+    StdActions::self()->copyToDeviceAction->setEnabled(enableActions && !allSmartPlaylists);
     #endif
     menuButton->controlState();
 }
diff --git a/gui/playlistspage.h b/gui/playlistspage.h
index da8540b..1381bb6 100644
--- a/gui/playlistspage.h
+++ b/gui/playlistspage.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,29 +26,29 @@
 
 #include "ui_playlistspage.h"
 #include "playlistsproxymodel.h"
-#include "config.h"
+#include "page.h"
 
 class Action;
 
-class PlaylistsPage : public QWidget, public Ui::PlaylistsPage
+class PlaylistsPage : public QWidget, public Ui::PlaylistsPage, public Page
 {
     Q_OBJECT
 public:
     PlaylistsPage(QWidget *p);
     virtual ~PlaylistsPage();
 
+    void saveConfig();
     void setStartClosed(bool sc);
     bool isStartClosed();
     void updateRows();
     void refresh();
     void clear();
     //QStringList selectedFiles() const;
-    void addSelectionToPlaylist(bool replace, quint8 priorty=0);
+    void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0, bool randomAlbums=false);
     void setView(int mode);
     void focusSearch() { view->focusSearch(); }
-    void goBack() { view->backActivated(); }
     #ifdef ENABLE_DEVICES_SUPPORT
-    QList<Song> selectedSongs() const;
+    QList<Song> selectedSongs(bool allowPlaylists=false) const;
     void addSelectionToDevice(const QString &udi);
     #endif
     void showEvent(QShowEvent *e);
@@ -62,10 +62,11 @@ Q_SIGNALS:
     void removeFromPlaylist(const QString &name, const QList<quint32> &positions);
 
     void add(const QStringList &files, bool replace, quint8 priorty);
+    void addSongsToPlaylist(const QString &name, const QStringList &files);
     void addToDevice(const QString &from, const QString &to, const QList<Song> &songs);
 
 private:
-    void addItemsToPlayQueue(const QModelIndexList &indexes, bool replace, quint8 priorty=0);
+    void addItemsToPlayList(const QModelIndexList &indexes, const QString &name, bool replace, quint8 priorty=0);
 
 public Q_SLOTS:
     void removeItems();
@@ -74,6 +75,7 @@ public Q_SLOTS:
 private Q_SLOTS:
     void savePlaylist();
     void renamePlaylist();
+    void removeDuplicates();
     void itemDoubleClicked(const QModelIndex &index);
     void searchItems();
     void updated(const QModelIndex &index);
@@ -81,6 +83,7 @@ private Q_SLOTS:
 
 private:
     Action *renamePlaylistAction;
+    Action *removeDuplicatesAction;
     PlaylistsProxyModel proxy;
 };
 
diff --git a/gui/playlistspage.ui b/gui/playlistspage.ui
index 775441c..1b029a6 100644
--- a/gui/playlistspage.ui
+++ b/gui/playlistspage.ui
@@ -47,12 +47,6 @@
       <number>0</number>
      </property>
      <item>
-      <widget class="ToolButton" name="libraryUpdate"/>
-     </item>
-     <item>
-      <widget class="ToolButton" name="searchButton"/>
-     </item>
-     <item>
       <widget class="GenreCombo" name="genreCombo"/>
      </item>
      <item>
diff --git a/gui/preferencesdialog.cpp b/gui/preferencesdialog.cpp
index 20a4e79..049f66d 100644
--- a/gui/preferencesdialog.cpp
+++ b/gui/preferencesdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,12 +26,18 @@
 #include "settings.h"
 #include "icons.h"
 #include "interfacesettings.h"
+#ifdef ENABLE_STREAMS
 #include "streamssettings.h"
+#endif
+#ifdef ENABLE_ONLINE_SERVICES
 #include "onlinesettings.h"
+#endif
 #include "serversettings.h"
 #include "playbacksettings.h"
 #include "filesettings.h"
+#ifdef ENABLE_HTTP_SERVER
 #include "httpserversettings.h"
+#endif
 #include "contextsettings.h"
 #include "cachesettings.h"
 #include "localize.h"
@@ -56,7 +62,7 @@ int PreferencesDialog::instanceCount()
     return iCount;
 }
 
-PreferencesDialog::PreferencesDialog(QWidget *parent, const QStringList &hiddenPages)
+PreferencesDialog::PreferencesDialog(QWidget *parent)
     : Dialog(parent, "PreferencesDialog")
 {
     iCount++;
@@ -66,30 +72,31 @@ PreferencesDialog::PreferencesDialog(QWidget *parent, const QStringList &hiddenP
     server = new ServerSettings(0);
     playback = new PlaybackSettings(0);
     files = new FileSettings(0);
-    interface = new InterfaceSettings(0, hiddenPages);
-    streams = hiddenPages.contains(QLatin1String("StreamsPage")) ? 0 : new StreamsSettings(0);
-    online = hiddenPages.contains(QLatin1String("OnlineServicesPage")) ? 0 : new OnlineSettings(0);
+    interface = new InterfaceSettings(0);
     context = new ContextSettings(0);
-    http = new HttpServerSettings(0);
     cache = new CacheSettings(0);
     server->load();
     playback->load();
     files->load();
     interface->load();
     context->load();
-    pageWidget->addPage(server, i18n("Collection"), Icons::self()->libraryIcon, i18n("Collection Settings"));
+    pages.insert(QLatin1String("collection"), pageWidget->addPage(server, i18n("Collection"), Icons::self()->libraryIcon, i18n("Collection Settings")));
     pageWidget->addPage(playback, i18n("Playback"), Icon("media-playback-start"), i18n("Playback Settings"));
     pageWidget->addPage(files, i18n("Files"), Icons::self()->filesIcon, i18n("File Settings"));
-    pageWidget->addPage(interface, i18n("Interface"), Icon("preferences-other"), i18n("Interface Settings"));
-    if (streams) {
-        pages.insert(QLatin1String("streams"), pageWidget->addPage(streams, i18n("Streams"), Icons::self()->radioStreamIcon, i18n("Streams Settings")));
-        streams->load();
-    }
-    if (online) {
-        pages.insert(QLatin1String("online"), pageWidget->addPage(online, i18n("Online"), Icon("applications-internet"), i18n("Online Providers")));
-        online->load();
-    }
+    pages.insert(QLatin1String("interface"), pageWidget->addPage(interface, i18n("Interface"), Icon("preferences-other"), i18n("Interface Settings")));
+    #ifdef ENABLE_STREAMS
+    streams = new StreamsSettings(0);
+    pages.insert(QLatin1String("streams"), pageWidget->addPage(streams, i18n("Streams"), Icons::self()->radioStreamIcon, i18n("Streams Settings")));
+    streams->load();
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
+    online = new OnlineSettings(0);
+    pages.insert(QLatin1String("online"), pageWidget->addPage(online, i18n("Online"), Icon("applications-internet"), i18n("Online Providers")));
+    online->load();
+    #endif
     pageWidget->addPage(context, i18n("Context"), Icons::self()->contextIcon, i18n("Context View Settings"));
+    #ifdef ENABLE_HTTP_SERVER
+    http = new HttpServerSettings(0);
     if (http->haveMultipleInterfaces()) {
         http->load();
         Icon icon("network-server");
@@ -101,6 +108,7 @@ PreferencesDialog::PreferencesDialog(QWidget *parent, const QStringList &hiddenP
         http->deleteLater();
         http=0;
     }
+    #endif
     #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
     audiocd = new AudioCdSettings(0);
     audiocd->load();
@@ -121,11 +129,9 @@ PreferencesDialog::PreferencesDialog(QWidget *parent, const QStringList &hiddenP
     setMainWidget(pageWidget);
     setAttribute(Qt::WA_DeleteOnClose);
     connect(files, SIGNAL(reloadStreams()), SIGNAL(reloadStreams()));
-    #ifndef ENABLE_KDE_SUPPORT
     int h=sizeHint().height();
     setMinimumHeight(h);
-    setMinimumWidth(h);
-    #endif
+    setMinimumWidth(h*1.1);
     setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
 }
 
@@ -136,8 +142,12 @@ PreferencesDialog::~PreferencesDialog()
 
 void PreferencesDialog::showPage(const QString &page)
 {
-    if (pages.contains(page)) {
-        pageWidget->setCurrentPage(pages[page]);
+    QStringList parts=page.split(QLatin1Char(':'));
+    if (pages.contains(parts.at(0))) {
+        pageWidget->setCurrentPage(pages[parts.at(0)]);
+        if (parts.count()>1 && qobject_cast<InterfaceSettings *>(pages[parts.at(0)]->widget())) {
+            static_cast<InterfaceSettings *>(pages[parts.at(0)]->widget())->showPage(parts.at(1));
+        }
     }
 }
 
@@ -148,15 +158,17 @@ void PreferencesDialog::writeSettings()
     playback->save();
     files->save();
     interface->save();
-    if (streams) {
-        streams->save();
-    }
-    if (online) {
-        online->save();
-    }
+    #ifdef ENABLE_STREAMS
+    streams->save();
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
+    online->save();
+    #endif
+    #ifdef ENABLE_HTTP_SERVER
     if (http) {
         http->save();
     }
+    #endif
     #ifndef ENABLE_KDE_SUPPORT
     #ifdef ENABLE_PROXY_CONFIG
     proxy->save();
diff --git a/gui/preferencesdialog.h b/gui/preferencesdialog.h
index 1d55aa0..cfd2cce 100644
--- a/gui/preferencesdialog.h
+++ b/gui/preferencesdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -37,8 +37,12 @@ class ServerSettings;
 class PlaybackSettings;
 class FileSettings;
 class InterfaceSettings;
+#ifdef ENABLE_STREAMS
 class StreamsSettings;
+#endif
+#ifdef ENABLE_ONLINE_SERVICES
 class OnlineSettings;
+#endif
 class ContextSettings;
 class HttpServerSettings;
 struct MPDConnectionDetails;
@@ -55,7 +59,7 @@ class PreferencesDialog : public Dialog
 public:
     static int instanceCount();
 
-    PreferencesDialog(QWidget *parent, const QStringList &hiddenPages);
+    PreferencesDialog(QWidget *parent);
     virtual ~PreferencesDialog();
 
 private:
@@ -77,10 +81,16 @@ private:
     PlaybackSettings *playback;
     FileSettings *files;
     InterfaceSettings *interface;
+    #ifdef ENABLE_STREAMS
     StreamsSettings *streams;
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     OnlineSettings *online;
+    #endif
     ContextSettings *context;
+    #ifdef ENABLE_HTTP_SERVER
     HttpServerSettings *http;
+    #endif
     #ifdef ENABLE_PROXY_CONFIG
     ProxySettings *proxy;
     #endif
diff --git a/gui/qtplural.h b/gui/qtplural.h
index 0d63c35..6c7abc9 100644
--- a/gui/qtplural.h
+++ b/gui/qtplural.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/gui/qxtmediakeys.cpp b/gui/qxtmediakeys.cpp
index 6d06a8f..d057b83 100644
--- a/gui/qxtmediakeys.cpp
+++ b/gui/qxtmediakeys.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/gui/qxtmediakeys.h b/gui/qxtmediakeys.h
index 202e3c9..adde4d2 100644
--- a/gui/qxtmediakeys.h
+++ b/gui/qxtmediakeys.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/gui/searchpage.cpp b/gui/searchpage.cpp
new file mode 100644
index 0000000..070566c
--- /dev/null
+++ b/gui/searchpage.cpp
@@ -0,0 +1,251 @@
+/*
+ * Cantata
+ *
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
+ *
+ * ----
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "searchpage.h"
+#include "mpdconnection.h"
+#include "localize.h"
+#include "settings.h"
+#include "stdactions.h"
+#include "utils.h"
+#include "icon.h"
+#include "qtplural.h"
+#include "tableview.h"
+
+class SearchTableView : public TableView
+{
+public:
+    SearchTableView(QWidget *p)
+        : TableView(QLatin1String("search"), p)
+    {
+        setUseSimpleDelegate();
+        setIndentation(0);
+    }
+
+    virtual ~SearchTableView() { }
+};
+
+SearchPage::SearchPage(QWidget *p)
+    : QWidget(p)
+    , state(Initial)
+    , model(this)
+    , proxy(this)
+{
+    setupUi(this);
+    addToPlayQueue->setDefaultAction(StdActions::self()->addToPlayQueueAction);
+    replacePlayQueue->setDefaultAction(StdActions::self()->replacePlayQueueAction);
+
+    view->allowTableView(new SearchTableView(view));
+    view->addAction(StdActions::self()->addToPlayQueueAction);
+    view->addAction(StdActions::self()->addRandomToPlayQueueAction);
+    view->addAction(StdActions::self()->replacePlayQueueAction);
+    view->addAction(StdActions::self()->addWithPriorityAction);
+    view->addAction(StdActions::self()->addToStoredPlaylistAction);
+    #ifdef TAGLIB_FOUND
+    #ifdef ENABLE_DEVICES_SUPPORT
+    view->addAction(StdActions::self()->copyToDeviceAction);
+    #endif
+    #endif // TAGLIB_FOUND
+
+    connect(this, SIGNAL(add(const QStringList &, bool, quint8)), MPDConnection::self(), SLOT(add(const QStringList &, bool, quint8)));
+    connect(this, SIGNAL(addSongsToPlaylist(const QString &, const QStringList &)), MPDConnection::self(), SLOT(addToPlaylist(const QString &, const QStringList &)));
+    connect(&model, SIGNAL(searching()), view, SLOT(showSpinner()));
+    connect(&model, SIGNAL(searched()), view, SLOT(hideSpinner()));
+    connect(&model, SIGNAL(statsUpdated(int, quint32)), this, SLOT(statsUpdated(int, quint32)));
+    connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions()));
+    connect(view, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(itemDoubleClicked(const QModelIndex &)));
+    connect(view, SIGNAL(searchItems()), this, SLOT(searchItems()));
+    connect(MPDConnection::self(), SIGNAL(stateChanged(bool)), this, SLOT(setSearchCategories()));
+    proxy.setSourceModel(&model);
+    view->setModel(&proxy);
+    view->setMode(ItemView::Mode_List);
+    view->setPermanentSearch();
+    setSearchCategories();
+    view->setSearchCategory(Settings::self()->searchCategory());
+    view->hideBackAction();
+    statsUpdated(0, 0);
+}
+
+SearchPage::~SearchPage()
+{
+}
+
+void SearchPage::showEvent(QShowEvent *e)
+{
+    view->focusSearch();
+    QWidget::showEvent(e);
+}
+
+void SearchPage::saveConfig()
+{
+    Settings::self()->saveSearchCategory(view->searchCategory());
+    TableView *tv=qobject_cast<TableView *>(view->view());
+    if (tv) {
+        tv->saveHeader();
+    }
+}
+
+void SearchPage::refresh()
+{
+    model.refresh();
+}
+
+void SearchPage::clear()
+{
+    model.clear();
+}
+
+void SearchPage::setView(int mode)
+{
+    view->setMode((ItemView::Mode)mode);
+    model.setMultiColumn(ItemView::Mode_Table==mode);
+}
+
+QStringList SearchPage::selectedFiles(bool allowPlaylists) const
+{
+    QModelIndexList selected = view->selectedIndexes();
+    if (selected.isEmpty()) {
+        return QStringList();
+    }
+
+    QModelIndexList mapped;
+    foreach (const QModelIndex &idx, selected) {
+        mapped.append(proxy.mapToSource(idx));
+    }
+
+    return model.filenames(mapped, allowPlaylists);
+}
+
+QList<Song> SearchPage::selectedSongs(bool allowPlaylists) const
+{
+    QModelIndexList selected = view->selectedIndexes();
+    if (selected.isEmpty()) {
+        return QList<Song>();
+    }
+
+    QModelIndexList mapped;
+    foreach (const QModelIndex &idx, selected) {
+        mapped.append(proxy.mapToSource(idx));
+    }
+
+    return model.songs(mapped, allowPlaylists);
+}
+
+void SearchPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty, bool randomAlbums)
+{
+    Q_UNUSED(randomAlbums)
+    QStringList files=selectedFiles(true);
+
+    if (!files.isEmpty()) {
+        if (name.isEmpty()) {
+            emit add(files, replace, priorty);
+        } else {
+            emit addSongsToPlaylist(name, files);
+        }
+        view->clearSelection();
+    }
+}
+
+#ifdef ENABLE_DEVICES_SUPPORT
+void SearchPage::addSelectionToDevice(const QString &udi)
+{
+    QList<Song> songs=selectedSongs();
+
+    if (!songs.isEmpty()) {
+        emit addToDevice(QString(), udi, songs);
+        view->clearSelection();
+    }
+}
+#endif
+
+void SearchPage::searchItems()
+{
+    QString text=view->searchText().trimmed();
+
+    if (text.isEmpty()) {
+        model.clear();
+    } else {
+        model.search(view->searchCategory(), text);
+    }
+}
+
+void SearchPage::itemDoubleClicked(const QModelIndex &)
+{
+    const QModelIndexList selected = view->selectedIndexes(false); // Dont need sorted selection here...
+    if (1!=selected.size()) {
+        return; //doubleclick should only have one selected item
+    }
+    addSelectionToPlaylist();
+}
+
+void SearchPage::controlActions()
+{
+    QModelIndexList selected=view->selectedIndexes(false); // Dont need sorted selection here...
+    bool enable=selected.count()>0;
+
+    StdActions::self()->addToPlayQueueAction->setEnabled(enable);
+    StdActions::self()->addWithPriorityAction->setEnabled(enable);
+    StdActions::self()->replacePlayQueueAction->setEnabled(enable);
+    StdActions::self()->addToStoredPlaylistAction->setEnabled(enable);
+    StdActions::self()->addRandomToPlayQueueAction->setEnabled(false);
+}
+
+void SearchPage::setSearchCategories()
+{
+    bool composerSupported=MPDConnection::self()->composerTagSupported();
+
+    if ( (composerSupported && ComposerSupported==state) || (!composerSupported && ComposerNotSupported==state)) {
+        // No changes to be made!
+        return;
+    }
+
+    state=composerSupported ? ComposerSupported : ComposerNotSupported;
+    QList<QPair<QString, QString> > categories;
+
+    categories << QPair<QString, QString>(i18n("Artist:"), QLatin1String("artist"));
+
+    if (composerSupported) {
+        categories << QPair<QString, QString>(i18n("Composer:"), QLatin1String("composer"));
+    }
+
+    categories << QPair<QString, QString>(i18n("Album:"), QLatin1String("album"))
+               << QPair<QString, QString>(i18n("Title:"), QLatin1String("title"))
+               << QPair<QString, QString>(i18n("Genre:"), QLatin1String("genre"))
+               << QPair<QString, QString>(i18n("Date:"), QLatin1String("date"))
+               << QPair<QString, QString>(i18n("File:"), QLatin1String("file"))
+               << QPair<QString, QString>(i18n("Any:"), QLatin1String("any"));
+    view->setSearchCategories(categories);
+}
+
+void SearchPage::statsUpdated(int songs, quint32 time)
+{
+    if (0==songs) {
+        statsLabel->setText(i18n("No tracks found."));
+        return;
+    }
+
+    #ifdef ENABLE_KDE_SUPPORT
+    statsLabel->setText(i18np("1 Track (%2)", "%1 Tracks (%2)", songs, Utils::formatDuration(time)));
+    #else
+    statsLabel->setText(QTP_TRACKS_DURATION_STR(songs, Utils::formatDuration(time)));
+    #endif
+}
diff --git a/gui/librarypage.h b/gui/searchpage.h
similarity index 62%
copy from gui/librarypage.h
copy to gui/searchpage.h
index 1a21ff5..6443839 100644
--- a/gui/librarypage.h
+++ b/gui/searchpage.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -21,62 +21,61 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef LIBRARYPAGE_H
-#define LIBRARYPAGE_H
+#ifndef SEARCHPAGE_H
+#define SEARCHPAGE_H
 
-#include "ui_librarypage.h"
-#include "musiclibraryproxymodel.h"
-#include "config.h"
+#include "ui_searchpage.h"
+#include "page.h"
+#include "searchmodel.h"
+#include "searchproxymodel.h"
 
 class Action;
 
-class LibraryPage : public QWidget, public Ui::LibraryPage
+class SearchPage : public QWidget, public Ui::SearchPage, public Page
 {
     Q_OBJECT
 
 public:
-    LibraryPage(QWidget *p);
-    virtual ~LibraryPage();
+    SearchPage(QWidget *p);
+    virtual ~SearchPage();
 
+    void saveConfig();
     void refresh();
     void clear();
-    QStringList selectedFiles(bool allowPlaylists=false, bool randomAlbums=false) const;
+    void setView(int mode);
+    QStringList selectedFiles(bool allowPlaylists=false) const;
     QList<Song> selectedSongs(bool allowPlaylists=false) const;
-    Song coverRequest() const;
     void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0, bool randomAlbums=false);
     #ifdef ENABLE_DEVICES_SUPPORT
     void addSelectionToDevice(const QString &udi);
-    void deleteSongs();
     #endif
-    void setView(int v);
-    ItemView::Mode viewMode() const { return view->viewMode(); }
-    void showSongs(const QList<Song> &songs);
-    void showArtist(const QString &artist);
-    void showAlbum(const QString &artist, const QString &album);
-    void focusSearch() { view->focusSearch(); }
-    void goBack() { view->backActivated(); }
     void showEvent(QShowEvent *e);
 
-private:
-    void setItemSize(int v);
-
 Q_SIGNALS:
     // These are for communicating with MPD object (which is in its own thread, so need to talk via signal/slots)
     void add(const QStringList &files, bool replace, quint8 priorty);
     void addSongsToPlaylist(const QString &name, const QStringList &files);
-    void loadLibrary();
 
     void addToDevice(const QString &from, const QString &to, const QList<Song> &songs);
-    void deleteSongs(const QString &from, const QList<Song> &songs);
 
 public Q_SLOTS:
-    void itemDoubleClicked(const QModelIndex &);
     void searchItems();
+    void itemDoubleClicked(const QModelIndex &);
     void controlActions();
-    void updateGenres(const QModelIndex &);
+    void setSearchCategories();
+    void statsUpdated(int songs, quint32 time);
 
 private:
-    MusicLibraryProxyModel proxy;
+    enum State
+    {
+        Initial,
+        ComposerSupported,
+        ComposerNotSupported
+    };
+
+    State state;
+    SearchModel model;
+    SearchProxyModel proxy;
 };
 
 #endif
diff --git a/gui/librarypage.ui b/gui/searchpage.ui
similarity index 83%
copy from gui/librarypage.ui
copy to gui/searchpage.ui
index 700c6e4..8e557ce 100644
--- a/gui/librarypage.ui
+++ b/gui/searchpage.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>LibraryPage</class>
- <widget class="QWidget" name="LibraryPage">
+ <class>SearchPage</class>
+ <widget class="QWidget" name="SearchPage">
   <property name="geometry">
    <rect>
     <x>0</x>
@@ -47,13 +47,7 @@
       <number>0</number>
      </property>
      <item>
-      <widget class="ToolButton" name="libraryUpdate"/>
-     </item>
-     <item>
-      <widget class="ToolButton" name="searchButton"/>
-     </item>
-     <item>
-      <widget class="GenreCombo" name="genreCombo"/>
+      <widget class="SqueezedTextLabel" name="statsLabel"/>
      </item>
      <item>
       <widget class="SizeWidget" name="sizeWidget"/>
@@ -70,16 +64,16 @@
  </widget>
  <customwidgets>
   <customwidget>
+   <class>SqueezedTextLabel</class>
+   <extends>QLabel</extends>
+   <header>squeezedtextlabel.h</header>
+  </customwidget>
+  <customwidget>
    <class>ItemView</class>
    <extends>QTreeView</extends>
    <header>itemview.h</header>
   </customwidget>
   <customwidget>
-   <class>GenreCombo</class>
-   <extends>QComboBox</extends>
-   <header>genrecombo.h</header>
-  </customwidget>
-  <customwidget>
    <class>ToolButton</class>
    <extends>QToolButton</extends>
    <header>toolbutton.h</header>
diff --git a/gui/serversettings.cpp b/gui/serversettings.cpp
index 35c6f0c..0113e32 100644
--- a/gui/serversettings.cpp
+++ b/gui/serversettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -131,6 +131,11 @@ ServerSettings::ServerSettings(QWidget *p)
     REMOVE(streamUrl)
     REMOVE(streamUrlNoteLabel)
     #endif
+    #ifndef ENABLE_DYNAMIC
+    REMOVE(dynamizerPort)
+    REMOVE(dynamizerPortLabel)
+    REMOVE(dynamizerNoteLabel)
+    #endif
 }
 
 void ServerSettings::load()
@@ -354,7 +359,9 @@ void ServerSettings::setDetails(const MPDConnectionDetails &details)
         port->setValue(details.port);
         password->setText(details.password);
         dir->setText(Utils::convertDirForDisplay(details.dir));
-        dynamizerPort->setValue(details.dynamizerPort);
+        if (dynamizerPort) {
+            dynamizerPort->setValue(details.dynamizerPort);
+        }
         coverName->setText(details.coverName);
         #ifdef ENABLE_HTTP_STREAM_PLAYBACK
         streamUrl->setText(details.streamUrl);
@@ -375,7 +382,7 @@ MPDConnectionDetails ServerSettings::getDetails() const
         details.port=port->value();
         details.password=password->text();
         details.dir=Utils::convertDirFromDisplay(dir->text());
-        details.dynamizerPort=dynamizerPort->value();
+        details.dynamizerPort=dynamizerPort ? dynamizerPort->value() : 0;
         details.coverName=coverName->text().trimmed();
         #ifdef ENABLE_HTTP_STREAM_PLAYBACK
         details.streamUrl=streamUrl->text().trimmed();
diff --git a/gui/serversettings.h b/gui/serversettings.h
index d3d9a8b..e30a2e9 100644
--- a/gui/serversettings.h
+++ b/gui/serversettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/gui/serversettings.ui b/gui/serversettings.ui
index 5bfa7c5..4d7c5c6 100644
--- a/gui/serversettings.ui
+++ b/gui/serversettings.ui
@@ -94,7 +94,7 @@
           </widget>
          </item>
          <item row="2" column="1">
-          <widget class="SpinBox" name="port">
+          <widget class="QSpinBox" name="port">
            <property name="minimum">
             <number>1</number>
            </property>
@@ -160,7 +160,7 @@
           </widget>
          </item>
          <item row="6" column="1">
-          <widget class="SpinBox" name="dynamizerPort"/>
+          <widget class="QSpinBox" name="dynamizerPort"/>
          </item>
          <item row="7" column="0">
           <widget class="BuddyLabel" name="streamUrlLabel">
@@ -417,11 +417,6 @@
    <header>statelabel.h</header>
   </customwidget>
   <customwidget>
-   <class>SpinBox</class>
-   <extends>QSpinBox</extends>
-   <header>spinbox.h</header>
-  </customwidget>
-  <customwidget>
    <class>LineEdit</class>
    <extends>QLineEdit</extends>
    <header>lineedit.h</header>
diff --git a/gui/settings.cpp b/gui/settings.cpp
index 9b7bad1..3face7a 100644
--- a/gui/settings.cpp
+++ b/gui/settings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -47,6 +47,8 @@ K_GLOBAL_STATIC(Settings, instance)
 #include <QDir>
 #include <qglobal.h>
 
+#define RESTRICT(VAL, MIN_VAL, MAX_VAL) (VAL<MIN_VAL ? MIN_VAL : (VAL>MAX_VAL ? MAX_VAL : VAL))
+
 Settings * Settings::self()
 {
     #ifdef ENABLE_KDE_SUPPORT
@@ -84,11 +86,11 @@ struct MpdDefaults
 
     void read() {
         QFile f("/etc/mpd.conf");
-        int details=0;
 
         if (f.open(QIODevice::ReadOnly|QIODevice::Text)) {
+            int details=0;
             while (!f.atEnd()) {
-                QString line = f.readLine().trimmed();
+                QString line = QString::fromUtf8(f.readLine()).trimmed();
                 if (line.startsWith('#')) {
                     continue;
                 } else if (!(details&DT_DIR) && line.startsWith(QLatin1String("music_directory"))) {
@@ -134,6 +136,26 @@ struct MpdDefaults
 
 static MpdDefaults mpdDefaults;
 
+static QString getStartupStateStr(Settings::StartupState s)
+{
+    switch (s) {
+    case Settings::SS_ShowMainWindow: return QLatin1String("show");
+    case Settings::SS_HideMainWindow: return QLatin1String("hide");
+    default:
+    case Settings::SS_Previous: return QLatin1String("prev");
+    }
+}
+
+static Settings::StartupState getStartupState(const QString &str)
+{
+    for (int i=0; i<=Settings::SS_Previous; ++i) {
+        if (getStartupStateStr((Settings::StartupState)i)==str) {
+            return (Settings::StartupState)i;
+        }
+    }
+    return Settings::SS_Previous;
+}
+
 Settings::Settings()
     : isFirstRun(false)
     , modified(false)
@@ -312,12 +334,12 @@ bool Settings::showFullScreen()
     return GET_BOOL("showFullScreen", false);
 }
 
-QByteArray Settings::playQueueHeaderState()
+QByteArray Settings::headerState(const QString &key)
 {
-    if (version()<CANTATA_MAKE_VERSION(1, 0, 53)) {
+    if (version()<CANTATA_MAKE_VERSION(1, 2, 54)) {
         return QByteArray();
     }
-    return GET_BYTE_ARRAY("playQueueHeaderState");
+    return GET_BYTE_ARRAY(key+"HeaderState");
 }
 
 QByteArray Settings::splitterState()
@@ -434,7 +456,11 @@ int Settings::onlineView()
 
 bool Settings::libraryArtistImage()
 {
-    return GET_BOOL("libraryArtistImage", false);
+    if (GET_BOOL("libraryArtistImage", false)) {
+        int view=libraryView();
+        return ItemView::Mode_SimpleTree!=view && ItemView::Mode_BasicTree!=view;
+    }
+    return false;
 }
 
 int Settings::libraryCoverSize()
@@ -456,7 +482,31 @@ int Settings::albumSort()
 
 int Settings::sidebar()
 {
-    return GET_INT("sidebar", (int)(FancyTabWidget::Mode_LargeSidebar));
+    if (version()<CANTATA_MAKE_VERSION(1, 2, 52)) {
+        switch (GET_INT("sidebar", 1)) {
+        default:
+        case 1: return FancyTabWidget::Side|FancyTabWidget::Large;
+        case 2: return FancyTabWidget::Side|FancyTabWidget::Small;
+        case 3: return FancyTabWidget::Side|FancyTabWidget::Tab;
+        case 4: return FancyTabWidget::Top|FancyTabWidget::Tab;
+        case 5: return FancyTabWidget::Top|FancyTabWidget::Tab|FancyTabWidget::IconOnly;
+        case 6: return FancyTabWidget::Bot|FancyTabWidget::Tab;
+        case 7: return FancyTabWidget::Bot|FancyTabWidget::Tab|FancyTabWidget::IconOnly;
+        case 8: return FancyTabWidget::Side|FancyTabWidget::Large|FancyTabWidget::IconOnly;
+        case 9: return FancyTabWidget::Side|FancyTabWidget::Small|FancyTabWidget::IconOnly;
+        case 10: return FancyTabWidget::Side|FancyTabWidget::Tab|FancyTabWidget::IconOnly;
+        case 11: return FancyTabWidget::Bot|FancyTabWidget::Large;
+        case 12: return FancyTabWidget::Bot|FancyTabWidget::Large|FancyTabWidget::IconOnly;
+        case 13: return FancyTabWidget::Top|FancyTabWidget::Large;
+        case 14: return FancyTabWidget::Top|FancyTabWidget::Large|FancyTabWidget::IconOnly;
+        case 15: return FancyTabWidget::Bot|FancyTabWidget::Small;
+        case 16: return FancyTabWidget::Bot|FancyTabWidget::Small|FancyTabWidget::IconOnly;
+        case 17: return FancyTabWidget::Top|FancyTabWidget::Small;
+        case 18: return FancyTabWidget::Top|FancyTabWidget::Small|FancyTabWidget::IconOnly;
+        }
+    } else {
+        return GET_INT("sidebar", (int)(FancyTabWidget::Side|FancyTabWidget::Large))&FancyTabWidget::All_Mask;
+    }
 }
 
 bool Settings::libraryYear()
@@ -513,9 +563,29 @@ bool Settings::wikipediaIntroOnly()
     return GET_BOOL("wikipediaIntroOnly", true);
 }
 
-bool Settings::contextBackdrop()
+int Settings::contextBackdrop()
 {
-    return GET_BOOL("contextBackdrop", true);
+    if (version()<CANTATA_MAKE_VERSION(1, 0, 53)) {
+        return GET_BOOL("contextBackdrop", true) ? 1 : 1;
+    }
+    return  GET_INT("contextBackdrop", 1);
+}
+
+int Settings::contextBackdropOpacity()
+{
+    int v=GET_INT("contextBackdropOpacity", 15);
+    return RESTRICT(v, 0, 100);
+}
+
+int Settings::contextBackdropBlur()
+{
+    int v=GET_INT("contextBackdropBlur", 0);
+    return RESTRICT(v, 0, 20);
+}
+
+QString Settings::contextBackdropFile()
+{
+    return GET_STRING("contextBackdropFile", QString());
 }
 
 bool Settings::contextDarkBackground()
@@ -538,6 +608,11 @@ QByteArray Settings::contextSplitterState()
     return GET_BYTE_ARRAY("contextSplitterState");
 }
 
+bool Settings::contextAlwaysCollapsed()
+{
+    return GET_BOOL("contextAlwaysCollapsed", false);
+}
+
 QString Settings::page()
 {
     return GET_STRING("page", QString());
@@ -545,8 +620,16 @@ QString Settings::page()
 
 QStringList Settings::hiddenPages()
 {
-    QStringList def=QStringList() << "PlayQueuePage" << "FolderPage" << "ContextPage";
-    return GET_STRINGLIST("hiddenPages", def);
+    QStringList def=QStringList() << "PlayQueuePage" << "FolderPage" << "SearchPage" << "ContextPage";
+    QStringList config=GET_STRINGLIST("hiddenPages", def);
+    if (version()<CANTATA_MAKE_VERSION(1, 2, 51) && !config.contains("SearchPage")) {
+        config.append("SearchPage");
+    }
+    // If splitter auto-hide is enabled, then playqueue cannot be in sidebar!
+    if (splitterAutoHide() && !config.contains("PlayQueuePage")) {
+        config << "PlayQueuePage";
+    }
+    return config;
 }
 
 #ifndef ENABLE_KDE_SUPPORT
@@ -584,6 +667,11 @@ int Settings::devicesView()
 }
 #endif
 
+int Settings::searchView()
+{
+    return ItemView::toMode(GET_STRING("searchView", ItemView::modeStr(ItemView::Mode_List)));
+}
+
 int Settings::version()
 {
     if (-1==ver) {
@@ -618,6 +706,15 @@ QString Settings::httpInterface()
     return GET_STRING("httpInterface", QString());
 }
 
+bool Settings::alwaysUseHttp()
+{
+    #ifdef ENABLE_HTTP_SERVER
+    return GET_BOOL("alwaysUseHttp", false);
+    #else
+    return false;
+    #endif
+}
+
 bool Settings::playQueueGrouped()
 {
     return GET_BOOL("playQueueGrouped", true);
@@ -638,9 +735,29 @@ bool Settings::playQueueScroll()
     return GET_BOOL("playQueueScroll", true);
 }
 
-bool Settings::playQueueBackground()
+int Settings::playQueueBackground()
+{
+    if (version()<CANTATA_MAKE_VERSION(1, 0, 53)) {
+        return GET_BOOL("playQueueBackground", false) ? 1 : 1;
+    }
+    return  GET_INT("playQueueBackground", 0);
+}
+
+int Settings::playQueueBackgroundOpacity()
 {
-    return GET_BOOL("playQueueBackground", false);
+    int v=GET_INT("playQueueBackgroundOpacity", 15);
+    return RESTRICT(v, 0, 100);
+}
+
+int Settings::playQueueBackgroundBlur()
+{
+    int v=GET_INT("playQueueBackgroundBlur", 0);
+    return RESTRICT(v, 0, 20);
+}
+
+QString Settings::playQueueBackgroundFile()
+{
+    return GET_STRING("playQueueBackgroundFile", QString());
 }
 
 bool Settings::playQueueConfirmClear()
@@ -737,8 +854,6 @@ bool Settings::inhibitSuspend()
 }
 #endif
 
-#define RESTRICT(VAL, MIN_VAL, MAX_VAL) (VAL<MIN_VAL ? MIN_VAL : (VAL>MAX_VAL ? MAX_VAL : VAL))
-
 int Settings::rssUpdate()
 {
     static int constMax=7*24*60;
@@ -783,17 +898,68 @@ bool Settings::networkAccessEnabled()
     return GET_BOOL("networkAccessEnabled", true);
 }
 
-bool Settings::albumViewLoadAll()
-{
-    return GET_BOOL("albumViewLoadAll", false);
-}
-
 int Settings::volumeStep()
 {
     int v=GET_INT("volumeStep", 5);
     return RESTRICT(v, 1, 20);
 }
 
+Settings::StartupState Settings::startupState()
+{
+    return getStartupState(GET_STRING("startupState", getStartupStateStr(SS_Previous)));
+}
+
+int Settings::undoSteps()
+{
+    int v=GET_INT("undoSteps", 10);
+    return RESTRICT(v, 0, 20);
+}
+
+QString Settings::searchCategory()
+{
+    return GET_STRING("searchCategory", QString());
+}
+
+bool Settings::cacheScaledCovers()
+{
+    return GET_BOOL("cacheScaledCovers", true);
+}
+
+bool Settings::fetchCovers()
+{
+    return GET_BOOL("fetchCovers", true);
+}
+
+int Settings::mpdPoll()
+{
+    int v=GET_INT("mpdPoll", 0);
+    return RESTRICT(v, 0, 60);
+}
+
+int Settings::mpdListSize()
+{
+    int v=GET_INT("mpdListSize", 10000);
+    return RESTRICT(v, 100, 65535);
+}
+
+#ifndef ENABLE_KDE_SUPPORT
+QString Settings::lang()
+{
+    return GET_STRING("lang", QString());
+}
+#endif
+
+bool Settings::alwaysUseLsInfo()
+{
+    return GET_BOOL("alwaysUseLsInfo", false);
+}
+
+int Settings::contextSwitchTime()
+{
+    int v=GET_INT("contextSwitchTime", 0);
+    return RESTRICT(v, 0, 5000);
+}
+
 void Settings::removeConnectionDetails(const QString &v)
 {
     if (v==currentConnection()) {
@@ -861,6 +1027,7 @@ void Settings::saveConnectionDetails(const MPDConnectionDetails &v)
 
 #define SET_VALUE_MOD(KEY) if (v!=KEY()) { modified=true; SET_VALUE(#KEY, v); }
 #define SET_ITEMVIEW_MODE_VALUE_MOD(KEY) if (v!=KEY()) { modified=true; SET_VALUE(#KEY, ItemView::modeStr((ItemView::Mode)v)); }
+#define SET_STARTUPSTATE_VALUE_MOD(KEY) if (v!=KEY()) { modified=true; SET_VALUE(#KEY, getStartupStateStr((StartupState)v)); }
 
 void Settings::saveCurrentConnection(const QString &v)
 {
@@ -877,9 +1044,13 @@ void Settings::saveShowFullScreen(bool v)
     SET_VALUE_MOD(showFullScreen)
 }
 
-void Settings::savePlayQueueHeaderState(const QByteArray &v)
+void Settings::saveHeaderState(const QString &key, const QByteArray &v)
 {
-    SET_VALUE_MOD(playQueueHeaderState)
+    QByteArray current=headerState(key);
+    if (current!=v) {
+        modified=true;
+        SET_VALUE(key+"HeaderState", v);
+    }
 }
 
 void Settings::saveSplitterState(const QByteArray &v)
@@ -1038,11 +1209,26 @@ void Settings::saveWikipediaIntroOnly(bool v)
     SET_VALUE_MOD(wikipediaIntroOnly)
 }
 
-void Settings::saveContextBackdrop(bool v)
+void Settings::saveContextBackdrop(int v)
 {
     SET_VALUE_MOD(contextBackdrop)
 }
 
+void Settings::saveContextBackdropOpacity(int v)
+{
+    SET_VALUE_MOD(contextBackdropOpacity)
+}
+
+void Settings::saveContextBackdropBlur(int v)
+{
+    SET_VALUE_MOD(contextBackdropBlur)
+}
+
+void Settings::saveContextBackdropFile(const QString &v)
+{
+    SET_VALUE_MOD(contextBackdropFile)
+}
+
 void Settings::saveContextDarkBackground(bool v)
 {
     SET_VALUE_MOD(contextDarkBackground)
@@ -1063,6 +1249,11 @@ void Settings::saveContextSplitterState(const QByteArray &v)
     SET_VALUE_MOD(contextSplitterState)
 }
 
+void Settings::saveContextAlwaysCollapsed(bool v)
+{
+    SET_VALUE_MOD(contextAlwaysCollapsed)
+}
+
 void Settings::savePage(const QString &v)
 {
     SET_VALUE_MOD(page)
@@ -1097,6 +1288,11 @@ void Settings::saveDevicesView(int v)
 }
 #endif
 
+void Settings::saveSearchView(int v)
+{
+    SET_ITEMVIEW_MODE_VALUE_MOD(searchView)
+}
+
 void Settings::saveStopFadeDuration(int v)
 {
     if (v<=MinFade) {
@@ -1137,11 +1333,26 @@ void Settings::savePlayQueueScroll(bool v)
     SET_VALUE_MOD(playQueueScroll)
 }
 
-void Settings::savePlayQueueBackground(bool v)
+void Settings::savePlayQueueBackground(int v)
 {
     SET_VALUE_MOD(playQueueBackground)
 }
 
+void Settings::savePlayQueueBackgroundOpacity(int v)
+{
+    SET_VALUE_MOD(playQueueBackgroundOpacity)
+}
+
+void Settings::savePlayQueueBackgroundBlur(int v)
+{
+    SET_VALUE_MOD(playQueueBackgroundBlur)
+}
+
+void Settings::savePlayQueueBackgroundFile(const QString &v)
+{
+    SET_VALUE_MOD(playQueueBackgroundFile)
+}
+
 void Settings::savePlayQueueConfirmClear(bool v)
 {
     SET_VALUE_MOD(playQueueConfirmClear);
@@ -1252,6 +1463,38 @@ void Settings::savePodcastAutoDownload(bool v)
     SET_VALUE_MOD(podcastAutoDownload);
 }
 
+void Settings::saveStartupState(int v)
+{
+    SET_STARTUPSTATE_VALUE_MOD(startupState);
+}
+
+void Settings::saveSearchCategory(const QString &v)
+{
+    SET_VALUE_MOD(searchCategory);
+}
+
+void Settings::saveCacheScaledCovers(bool v)
+{
+    SET_VALUE_MOD(cacheScaledCovers);
+}
+
+void Settings::saveFetchCovers(bool v)
+{
+    SET_VALUE_MOD(fetchCovers);
+}
+
+#ifndef ENABLE_KDE_SUPPORT
+void Settings::saveLang(const QString &v)
+{
+    SET_VALUE_MOD(lang);
+}
+#endif
+
+void Settings::saveContextSwitchTime(int v)
+{
+    SET_VALUE_MOD(contextSwitchTime);
+}
+
 void Settings::save(bool force)
 {
     if (force) {
diff --git a/gui/settings.h b/gui/settings.h
index ebb0add..ac3f2b8 100644
--- a/gui/settings.h
+++ b/gui/settings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -90,6 +90,13 @@ public:
         DefaultFade = 2000
     };
 
+    enum StartupState
+    {
+        SS_ShowMainWindow,
+        SS_HideMainWindow,
+        SS_Previous
+    };
+
     static Settings *self();
 
     Settings();
@@ -100,7 +107,7 @@ public:
     QList<MPDConnectionDetails> allConnections();
     bool showPlaylist();
     bool showFullScreen();
-    QByteArray playQueueHeaderState();
+    QByteArray headerState(const QString &key);
     QByteArray splitterState();
     bool splitterAutoHide();
     QSize mainWindowSize();
@@ -132,11 +139,15 @@ public:
     QStringList lyricProviders();
     QStringList wikipediaLangs();
     bool wikipediaIntroOnly();
-    bool contextBackdrop();
+    int contextBackdrop();
+    int contextBackdropOpacity();
+    int contextBackdropBlur();
+    QString contextBackdropFile();
     bool contextDarkBackground();
     int contextZoom();
     QString contextSlimPage();
     QByteArray contextSplitterState();
+    bool contextAlwaysCollapsed();
     QString page();
     QStringList hiddenPages();
     #ifndef ENABLE_KDE_SUPPORT
@@ -147,15 +158,20 @@ public:
     bool showDeleteAction();
     int devicesView();
     #endif
+    int searchView();
     int version();
     int stopFadeDuration();
     int httpAllocatedPort();
     QString httpInterface();
+    bool alwaysUseHttp();
     bool playQueueGrouped();
     bool playQueueAutoExpand();
     bool playQueueStartClosed();
     bool playQueueScroll();
-    bool playQueueBackground();
+    int playQueueBackground();
+    int playQueueBackgroundOpacity();
+    int playQueueBackgroundBlur();
+    QString playQueueBackgroundFile();
     bool playQueueConfirmClear();
     bool playListsStartClosed();
     #ifdef ENABLE_HTTP_STREAM_PLAYBACK
@@ -190,8 +206,19 @@ public:
     int maxCoverUpdatePerIteration();
     QStringList cueFileCodecs();
     bool networkAccessEnabled();
-    bool albumViewLoadAll();
     int volumeStep();
+    StartupState startupState();
+    int undoSteps();
+    QString searchCategory();
+    bool cacheScaledCovers();
+    bool fetchCovers();
+    int mpdPoll();
+    int mpdListSize();
+    #ifndef ENABLE_KDE_SUPPORT
+    QString lang();
+    #endif
+    bool alwaysUseLsInfo();
+    int contextSwitchTime();
 
     void removeConnectionDetails(const QString &v);
     void saveConnectionDetails(const MPDConnectionDetails &v);
@@ -200,7 +227,7 @@ public:
     void saveShowFullScreen(bool v);
     void saveStopOnExit(bool v);
     void saveStopDynamizerOnExit(bool v);
-    void savePlayQueueHeaderState(const QByteArray &v);
+    void saveHeaderState(const QString &key, const QByteArray &v);
     void saveSplitterState(const QByteArray &v);
     void saveSplitterAutoHide(bool v);
     void saveMainWindowSize(const QSize &v);
@@ -230,11 +257,15 @@ public:
     void saveLyricProviders(const QStringList &v);
     void saveWikipediaLangs(const QStringList &v);
     void saveWikipediaIntroOnly(bool v);
-    void saveContextBackdrop(bool v);
+    void saveContextBackdrop(int v);
+    void saveContextBackdropOpacity(int v);
+    void saveContextBackdropBlur(int v);
+    void saveContextBackdropFile(const QString &v);
     void saveContextDarkBackground(bool v);
     void saveContextZoom(int v);
     void saveContextSlimPage(const QString &v);
     void saveContextSplitterState(const QByteArray &v);
+    void saveContextAlwaysCollapsed(bool v);
     void savePage(const QString &v);
     void saveHiddenPages(const QStringList &v);
     #ifndef ENABLE_KDE_SUPPORT
@@ -245,6 +276,7 @@ public:
     void saveShowDeleteAction(bool v);
     void saveDevicesView(int v);
     #endif
+    void saveSearchView(int v);
     void saveStopFadeDuration(int v);
     void saveHttpAllocatedPort(int v);
     void saveHttpInterface(const QString &v);
@@ -252,7 +284,10 @@ public:
     void savePlayQueueAutoExpand(bool v);
     void savePlayQueueStartClosed(bool v);
     void savePlayQueueScroll(bool v);
-    void savePlayQueueBackground(bool v);
+    void savePlayQueueBackground(int v);
+    void savePlayQueueBackgroundOpacity(int v);
+    void savePlayQueueBackgroundBlur(int v);
+    void savePlayQueueBackgroundFile(const QString &v);
     void savePlayQueueConfirmClear(bool v);
     void savePlayListsStartClosed(bool v);
     #ifdef ENABLE_HTTP_STREAM_PLAYBACK
@@ -283,6 +318,14 @@ public:
     void saveLastRssUpdate(const QDateTime &v);
     void savePodcastDownloadPath(const QString &v);
     void savePodcastAutoDownload(bool v);
+    void saveStartupState(int v);
+    void saveSearchCategory(const QString &v);
+    void saveCacheScaledCovers(bool v);
+    void saveFetchCovers(bool v);
+    #ifndef ENABLE_KDE_SUPPORT
+    void saveLang(const QString &v);
+    #endif
+    void saveContextSwitchTime(int v);
     void save(bool force=false);
     #if defined ENABLE_KDE_SUPPORT && defined ENABLE_KWALLET
     bool openWallet();
diff --git a/gui/shortcutssettingspage.cpp b/gui/shortcutssettingspage.cpp
index 2b023ad..3e18d92 100644
--- a/gui/shortcutssettingspage.cpp
+++ b/gui/shortcutssettingspage.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -36,6 +36,7 @@
 #include <QComboBox>
 #include <QGroupBox>
 #include <QFormLayout>
+#include <QCheckBox>
 #include <QProcess>
 
 static const char * constMkEnabledVal="mk-enabled-val";
@@ -89,35 +90,27 @@ ShortcutsSettingsPage::ShortcutsSettingsPage(QWidget *p)
             settingsButton->setToolTip(i18n("Configure..."));
             settingsButton->setIcon(Icons::self()->configureIcon);
             boxLay->addWidget(settingsButton);
+            boxLay->addItem(new QSpacerItem(0, 1, QSizePolicy::MinimumExpanding, QSizePolicy::Fixed));
             connect(settingsButton, SIGNAL(clicked(bool)), SLOT(showGnomeSettings()));
             connect(mediaKeysIfaceCombo, SIGNAL(currentIndexChanged(int)), SLOT(mediaKeysIfaceChanged()));
         } else if (useQxt) {
-            QFormLayout *boxLay=new QFormLayout(box);
-            BuddyLabel *label=new BuddyLabel(i18n("Use media keys to control Cantata:"), box);
-            mediaKeysEnabled = new OnOffButton(box);
-            label->setBuddy(mediaKeysEnabled);
-            boxLay->setWidget(0, QFormLayout::LabelRole, label);
-            boxLay->setWidget(0, QFormLayout::FieldRole, mediaKeysEnabled);
+            QBoxLayout *boxLay=new QBoxLayout(QBoxLayout::LeftToRight, box);
+            mediaKeysEnabled = new QCheckBox(i18n("Use media keys to control Cantata"), box);
+            boxLay->addWidget(mediaKeysEnabled);
+            boxLay->addItem(new QSpacerItem(0, 1, QSizePolicy::MinimumExpanding, QSizePolicy::Fixed));
             mediaKeysEnabled->setProperty(constMkEnabledVal, (unsigned int)MediaKeys::QxtInterface);
         } else if (useDesktop) {
-            QFormLayout *boxLay=new QFormLayout(box);
+            QBoxLayout *boxLay=new QBoxLayout(QBoxLayout::LeftToRight, box);
             QWidget *controlWidget = new QWidget(box);
-            QBoxLayout *controlLay=new QBoxLayout(QBoxLayout::LeftToRight, controlWidget);
-            BuddyLabel *label=new BuddyLabel(isGnome
-                                                ? i18n("Use media keys, as configured in desktop settings, to control Cantata:")
-                                                : i18n("Use media keys, as configured in GNOME/Unity settings, to control Cantata:"), box);
-            mediaKeysEnabled = new OnOffButton(controlWidget);
+            mediaKeysEnabled = new QCheckBox(isGnome
+                                             ? i18n("Use media keys, as configured in desktop settings, to control Cantata")
+                                             : i18n("Use media keys, as configured in GNOME/Unity settings, to control Cantata"), controlWidget);
             settingsButton=new ToolButton(controlWidget);
             settingsButton->setToolTip(i18n("Configure..."));
             settingsButton->setIcon(Icons::self()->configureIcon);
-            label->setBuddy(mediaKeysEnabled);
-            label->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
-            controlWidget->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
-            controlLay->setMargin(0);
-            controlLay->addWidget(mediaKeysEnabled);
-            controlLay->addWidget(settingsButton);
-            boxLay->setWidget(0, QFormLayout::LabelRole, label);
-            boxLay->setWidget(0, QFormLayout::FieldRole, controlWidget);
+            boxLay->addWidget(mediaKeysEnabled);
+            boxLay->addWidget(settingsButton);
+            boxLay->addItem(new QSpacerItem(0, 1, QSizePolicy::MinimumExpanding, QSizePolicy::Fixed));
             mediaKeysEnabled->setProperty(constMkEnabledVal, (unsigned int)MediaKeys::GnomeInteface);
             connect(mediaKeysEnabled, SIGNAL(toggled(bool)), settingsButton, SLOT(setEnabled(bool)));
             connect(settingsButton, SIGNAL(clicked(bool)), SLOT(showGnomeSettings()));
diff --git a/gui/shortcutssettingspage.h b/gui/shortcutssettingspage.h
index 4296c78..f2a7363 100644
--- a/gui/shortcutssettingspage.h
+++ b/gui/shortcutssettingspage.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -25,11 +25,11 @@
 #define SHORTCUT_SETTINGS_PAGE_H
 
 #include <QWidget>
-#include "onoffbutton.h"
 
 class ShortcutsSettingsWidget;
 class QComboBox;
 class ToolButton;
+class QCheckBox;
 
 class ShortcutsSettingsPage : public QWidget
 {
@@ -49,7 +49,7 @@ private:
     ShortcutsSettingsWidget *shortcuts;
     QComboBox *mediaKeysIfaceCombo;
     ToolButton *settingsButton;
-    OnOffButton *mediaKeysEnabled;
+    QCheckBox *mediaKeysEnabled;
 };
 
 #endif
diff --git a/gui/stdactions.cpp b/gui/stdactions.cpp
index 6cc9007..b8952f4 100644
--- a/gui/stdactions.cpp
+++ b/gui/stdactions.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -85,11 +85,8 @@ StdActions::StdActions()
     deleteSongsAction = ActionCollection::get()->createAction("deletesongs", i18n("Delete Songs"), "edit-delete");
     #endif
     setCoverAction = ActionCollection::get()->createAction("setcover", i18n("Set Image"));
-    refreshAction = ActionCollection::get()->createAction("refresh", i18n("Refresh Database"), "view-refresh");
-    backAction = ActionCollection::get()->createAction("back", i18n("Back"), "go-previous");
-    backAction->setShortcut(QKeySequence::Back);
     removeAction = ActionCollection::get()->createAction("removeitems", i18n("Remove"), "list-remove");
-    searchAction = ActionCollection::get()->createAction("search", i18n("Search"), "edit-find");
+    searchAction = ActionCollection::get()->createAction("search", i18n("Find"), "edit-find");
     searchAction->setShortcut(Qt::ControlModifier+Qt::Key_F);
 
     addToStoredPlaylistAction->setMenu(PlaylistsModel::self()->menu());
diff --git a/gui/stdactions.h b/gui/stdactions.h
index 2649e65..451bdb8 100644
--- a/gui/stdactions.h
+++ b/gui/stdactions.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -30,7 +30,6 @@
 class StdActions
 {
 public:
-
     static StdActions *self();
 
     StdActions();
@@ -63,14 +62,15 @@ public:
     Action *replaygainAction;
     #endif
     #ifdef ENABLE_DEVICES_SUPPORT
-    Action *devicesTabAction;
     Action *copyToDeviceAction;
     Action *deleteSongsAction;
     #endif
     Action *setCoverAction;
-    Action *refreshAction;
     Action *removeAction;
-    Action *backAction;
     Action *searchAction;
+
+private:
+    StdActions(const StdActions &o);
+    StdActions & operator=(const StdActions &o);
 };
 #endif
diff --git a/gui/trayitem.cpp b/gui/trayitem.cpp
index dc326a8..50bf2cc 100644
--- a/gui/trayitem.cpp
+++ b/gui/trayitem.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -36,6 +36,7 @@
 #include "icons.h"
 #include "song.h"
 #include "stdactions.h"
+#include "utils.h"
 
 class VolumeSliderEventHandler : public QObject
 {
@@ -92,11 +93,17 @@ void TrayItem::setup()
     if (trayItem) {
         return;
     }
+
+    #if !defined Q_OS_WIN32 && !defined Q_OS_MAC
+    QString iconFile=QLatin1String(INSTALL_PREFIX"/share/")+QCoreApplication::applicationName()+QLatin1String("/icons/")+QIcon::themeName()+
+                     QLatin1String("/systray.svg");
+    #endif
+
     #ifdef ENABLE_KDE_SUPPORT
     trayItem = new KStatusNotifierItem(this);
     trayItem->setCategory(KStatusNotifierItem::ApplicationStatus);
     trayItem->setTitle(i18n("Cantata"));
-    trayItem->setIconByName("cantata");
+    trayItem->setIconByName(!iconFile.isEmpty() && QFile::exists(iconFile) ? iconFile : QLatin1String("cantata"));
     trayItem->setToolTip("cantata", i18n("Cantata"), QString());
 
     trayItemMenu = new KMenu(0);
@@ -131,7 +138,13 @@ void TrayItem::setup()
     trayItemMenu->addSeparator();
     trayItemMenu->addAction(mw->quitAction);
     trayItem->setContextMenu(trayItemMenu);
-    trayItem->setIcon(Icons::self()->appIcon);
+    Icon icon;
+    #if !defined Q_OS_WIN32 && !defined Q_OS_MAC
+    if (QFile::exists(iconFile)) {
+        icon.addFile(iconFile);
+    }
+    #endif
+    trayItem->setIcon(icon.isNull() ? Icons::self()->appIcon : icon);
     trayItem->setToolTip(i18n("Cantata"));
     trayItem->show();
     connect(trayItem, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayItemClicked(QSystemTrayIcon::ActivationReason)));
diff --git a/gui/trayitem.h b/gui/trayitem.h
index d0a4aa1..7620611 100644
--- a/gui/trayitem.h
+++ b/gui/trayitem.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/http/httpserver.cpp b/http/httpserver.cpp
index 569153e..c4a0cf2 100644
--- a/http/httpserver.cpp
+++ b/http/httpserver.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -30,6 +30,7 @@
 #include "thread.h"
 #include <QFile>
 #include <QUrl>
+#include <QTimer>
 #if QT_VERSION >= 0x050000
 #include <QUrlQuery>
 #endif
@@ -72,51 +73,74 @@ HttpServer * HttpServer::self()
     #endif
 }
 
-void HttpServer::stop()
+#ifdef ENABLE_HTTP_SERVER
+HttpServer::HttpServer()
+    : QObject(0)
+    , thread(0)
+    , socket(0)
+    , closeTimer(0)
 {
-    if (socket) {
-        socket->terminate();
-        socket=0;
-    }
-
-    if (thread) {
-        thread->stop();
-        thread=0;
-    }
+    force=Settings::self()->alwaysUseHttp();
+    connect(MPDConnection::self(), SIGNAL(socketAddress(QString)), this, SLOT(mpdAddress(QString)));
+    connect(MPDConnection::self(), SIGNAL(cantataStreams(QList<Song>,bool)), this, SLOT(cantataStreams(QList<Song>,bool)));
+    connect(MPDConnection::self(), SIGNAL(cantataStreams(QStringList)), this, SLOT(cantataStreams(QStringList)));
+    connect(MPDConnection::self(), SIGNAL(removedIds(QSet<qint32>)), this, SLOT(removedIds(QSet<qint32>)));
 }
 
-bool HttpServer::readConfig()
+bool HttpServer::start()
 {
-    QString iface=Settings::self()->httpInterface();
-
-    if (socket && socket->isListening() && iface==socket->configuredInterface()) {
-        return true;
+    if (closeTimer) {
+        DBUG << "stop close timer";
+        closeTimer->stop();
     }
 
     if (socket) {
-        socket->terminate();
-        socket=0;
-    }
-
-    if (thread) {
-        thread->stop();
-        thread=0;
+        DBUG << "already open";
+        return true;
     }
 
+    DBUG << "open new socket";
     quint16 prevPort=Settings::self()->httpAllocatedPort();
-    thread=new Thread("HttpServer");
-    socket=new HttpSocket(iface, prevPort);
+    bool newThread=0==thread;
+    if (newThread) {
+        thread=new Thread("HttpServer");
+    }
+    socket=new HttpSocket(Settings::self()->httpInterface(), prevPort);
+    socket->mpdAddress(mpdAddr);
+    connect(this, SIGNAL(terminateSocket()), socket, SLOT(terminate()), Qt::QueuedConnection);
     if (socket->serverPort()!=prevPort) {
         Settings::self()->saveHttpAllocatedPort(socket->serverPort());
     }
     socket->moveToThread(thread);
-    thread->start();
-    return socket->isListening();
+    bool started=socket->isListening();
+    if (newThread) {
+        thread->start();
+    }
+    return started;
 }
 
-bool HttpServer::isAlive() const
+void HttpServer::stop()
 {
-    return socket && socket->isListening();
+    if (socket) {
+        DBUG;
+        emit terminateSocket();
+        socket=0;
+    }
+}
+
+void HttpServer::readConfig()
+{
+    QString iface=Settings::self()->httpInterface();
+
+    if (socket && socket->isListening() && iface==socket->configuredInterface()) {
+        return;
+    }
+
+    bool wasStarted=0!=socket;
+    stop();
+    if (wasStarted) {
+        start();
+    }
 }
 
 QString HttpServer::address() const
@@ -127,13 +151,13 @@ QString HttpServer::address() const
 
 bool HttpServer::isOurs(const QString &url) const
 {
-    return isAlive() ? url.startsWith(address()+"/") : false;
+    return 0!=socket ? url.startsWith(address()+"/") : false;
 }
 
-QByteArray HttpServer::encodeUrl(const Song &s) const
+QByteArray HttpServer::encodeUrl(const Song &s)
 {
     DBUG << "song" << s.file << isAlive();
-    if (!isAlive()) {
+    if (!start()) {
         return QByteArray();
     }
     #if QT_VERSION < 0x050000
@@ -186,7 +210,7 @@ QByteArray HttpServer::encodeUrl(const Song &s) const
     return url.toEncoded();
 }
 
-QByteArray HttpServer::encodeUrl(const QString &file) const
+QByteArray HttpServer::encodeUrl(const QString &file)
 {
     Song s;
     #ifdef Q_OS_WIN
@@ -284,3 +308,59 @@ Song HttpServer::decodeUrl(const QUrl &url) const
 
     return s;
 }
+
+void HttpServer::startCloseTimer()
+{
+    if (!closeTimer) {
+        closeTimer=new QTimer(this);
+        closeTimer->setSingleShot(true);
+        connect(closeTimer, SIGNAL(timeout()), this, SLOT(stop()));
+    }
+    DBUG;
+    closeTimer->start(1000);
+}
+
+void HttpServer::mpdAddress(const QString &a)
+{
+    mpdAddr=a;
+}
+
+void HttpServer::cantataStreams(const QStringList &files)
+{
+    DBUG << files;
+    foreach (const QString &f, files) {
+        Song s=HttpServer::self()->decodeUrl(f);
+        if (s.isCantataStream() || s.isCdda()) {
+            start();
+            break;
+        }
+    }
+}
+
+void HttpServer::cantataStreams(const QList<Song> &songs, bool isUpdate)
+{
+    DBUG << isUpdate << songs.count();
+    if (!isUpdate) {
+        streamIds.clear();
+    }
+
+    foreach (const Song &s, songs) {
+        streamIds.insert(s.id);
+    }
+
+    if (streamIds.isEmpty()) {
+        startCloseTimer();
+    } else {
+        start();
+    }
+}
+
+void HttpServer::removedIds(const QSet<qint32> &ids)
+{
+    streamIds+=ids;
+    if (streamIds.isEmpty()) {
+        startCloseTimer();
+    }
+}
+
+#endif
diff --git a/http/httpserver.h b/http/httpserver.h
index 231898e..5326088 100644
--- a/http/httpserver.h
+++ b/http/httpserver.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -24,39 +24,79 @@
 #ifndef _HTTP_SERVER_H
 #define _HTTP_SERVER_H
 
-#include <qglobal.h>
+#include <QObject>
 #include <QByteArray>
+#include <QSet>
 #include "song.h"
 #include "config.h"
 
 class HttpSocket;
 class Thread;
 class QUrl;
+class QTimer;
 
-class HttpServer
+class HttpServer : public QObject
 {
+    #ifdef ENABLE_HTTP_SERVER
+    Q_OBJECT
+    #endif
+
 public:
     static void enableDebug();
     static bool debugEnabled();
 
     static HttpServer * self();
 
-    HttpServer() : thread(0), socket(0) { }
     virtual ~HttpServer() { }
 
-    void stop();
-    bool isAlive() const;
-    bool readConfig();
+    #ifdef ENABLE_HTTP_SERVER
+    HttpServer();
+    bool isAlive() const { return true; } // Started on-demamnd!
+    bool forceUsage() const { return force; }
+    void readConfig();
     QString address() const;
     bool isOurs(const QString &url) const;
-    QByteArray encodeUrl(const Song &s) const;
-    QByteArray encodeUrl(const QString &file) const;
+    QByteArray encodeUrl(const Song &s);
+    QByteArray encodeUrl(const QString &file);
     Song decodeUrl(const QUrl &url) const;
     Song decodeUrl(const QString &file) const;
+    #else
+    HttpServer() { }
+    bool isAlive() const { return false; } // Not used!
+    bool forceUsage() const { return false; }
+    void readConfig() { }
+    QString address() const { return QString(); }
+    bool isOurs(const QString &) const { return false; }
+    QByteArray encodeUrl(const Song &) { return QByteArray(); }
+    QByteArray encodeUrl(const QString &) { return QByteArray(); }
+    Song decodeUrl(const QUrl &) const { return Song(); }
+    Song decodeUrl(const QString &) const { return Song(); }
+    #endif
+
+private:
+    #ifdef ENABLE_HTTP_SERVER
+    bool start();
+
+private Q_SLOTS:
+    void stop();
+    void startCloseTimer();
+    void mpdAddress(const QString &a);
+    void cantataStreams(const QStringList &files);
+    void cantataStreams(const QList<Song> &songs, bool isUpdate);
+    void removedIds(const QSet<qint32> &ids);
+
+Q_SIGNALS:
+    void terminateSocket();
 
 private:
+    bool force;
     Thread *thread;
     HttpSocket *socket;
+
+    QString mpdAddr;
+    QSet<qint32> streamIds; // Currently playing MPD stream IDs
+    QTimer *closeTimer;
+    #endif
 };
 
 #endif
diff --git a/http/httpserversettings.cpp b/http/httpserversettings.cpp
index dc24e5d..74fd364 100644
--- a/http/httpserversettings.cpp
+++ b/http/httpserversettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,7 +26,6 @@
 #include "localize.h"
 #include "httpserver.h"
 #include <QComboBox>
-#include <QTimer>
 #include <QNetworkInterface>
 
 static int isIfaceType(const QNetworkInterface &iface, const QString &prefix)
@@ -64,7 +63,6 @@ HttpServerSettings::HttpServerSettings(QWidget *p)
 {
     setupUi(this);
     initInterfaces(httpInterface);
-    updateStatus();
 }
 
 void HttpServerSettings::load()
@@ -87,14 +85,4 @@ void HttpServerSettings::save()
 {
     Settings::self()->saveHttpInterface(httpInterface->itemData(httpInterface->currentIndex()).toString());
     HttpServer::self()->readConfig();
-    QTimer::singleShot(250, this, SLOT(updateStatus()));
-}
-
-void HttpServerSettings::updateStatus()
-{
-    if (HttpServer::self()->isAlive()) {
-        status->setText(HttpServer::self()->address());
-    } else {
-        status->setText(i18n("Inactive"));
-    }
 }
diff --git a/http/httpserversettings.h b/http/httpserversettings.h
index 240fa48..87f6152 100644
--- a/http/httpserversettings.h
+++ b/http/httpserversettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -28,7 +28,6 @@
 
 class HttpServerSettings : public QWidget, private Ui::HttpServerSettings
 {
-    Q_OBJECT
 public:
     HttpServerSettings(QWidget *p);
     virtual ~HttpServerSettings() { }
@@ -36,9 +35,6 @@ public:
     void load();
     void save();
     bool haveMultipleInterfaces() const;
-
-private Q_SLOTS:
-    void updateStatus();
 };
 
 #endif
diff --git a/http/httpserversettings.ui b/http/httpserversettings.ui
index 0e6d372..8388de1 100644
--- a/http/httpserversettings.ui
+++ b/http/httpserversettings.ui
@@ -32,22 +32,6 @@
      <item row="1" column="1">
       <widget class="QComboBox" name="httpInterface"/>
      </item>
-     <item row="2" column="0">
-      <widget class="QLabel" name="label_3b">
-       <property name="text">
-        <string>Current URL:</string>
-       </property>
-      </widget>
-     </item>
-     <item row="2" column="1">
-      <widget class="QLabel" name="status">
-       <property name="font">
-        <font>
-         <italic>true</italic>
-        </font>
-       </property>
-      </widget>
-     </item>
     </layout>
    </item>
    <item>
diff --git a/http/httpsocket.cpp b/http/httpsocket.cpp
index 8705921..8612419 100644
--- a/http/httpsocket.cpp
+++ b/http/httpsocket.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -259,6 +259,8 @@ HttpSocket::HttpSocket(const QString &iface, quint16 port)
         ifaceAddress=QLatin1String("127.0.0.1");
     }
 
+    DBUG << isListening() << ifaceAddress << serverPort();
+
     connect(MPDConnection::self(), SIGNAL(socketAddress(QString)), this, SLOT(mpdAddress(QString)));
     connect(MPDConnection::self(), SIGNAL(cantataStreams(QList<Song>,bool)), this, SLOT(cantataStreams(QList<Song>,bool)));
     connect(MPDConnection::self(), SIGNAL(cantataStreams(QStringList)), this, SLOT(cantataStreams(QStringList)));
@@ -293,7 +295,12 @@ bool HttpSocket::openPort(const QHostAddress &a, quint16 p)
 
 void HttpSocket::terminate()
 {
+    if (terminated) {
+        return;
+    }
+    DBUG;
     terminated=true;
+    close();
     deleteLater();
 }
 
@@ -311,7 +318,7 @@ void HttpSocket::readClient()
         return;
     }
 
-    QTcpSocket *socket = (QTcpSocket*)sender();
+    QTcpSocket *socket = static_cast<QTcpSocket *>(sender());
     if (socket->canReadLine()) {
         QList<QByteArray> tokens = split(socket->readLine()); // QRegExp("[ \r\n][ \r\n]*"));
         if (tokens.length()>=2 && "GET"==tokens[0]) {
@@ -336,11 +343,10 @@ void HttpSocket::readClient()
                 return;
             }
 
-            #if QT_VERSION < 0x050000
             QUrl url(QUrl::fromEncoded(tokens[1]));
+            #if QT_VERSION < 0x050000
             QUrl &q=url;
             #else
-            QUrl url(QUrl::fromEncoded(tokens[1]));
             QUrlQuery q(url);
             #endif
             bool ok=false;
@@ -371,8 +377,8 @@ void HttpSocket::readClient()
                             int lastSector = cdparanoia.lastSectorOfTrack(song.id);
                             qint32 totalSize = ((lastSector-firstSector)+1)*CD_FRAMESIZE_RAW;
                             int count = 0;
+                            bool writeHeader=0==readBytesFrom; // Only write header if we are not seeking...
 //                            int bytesToDiscard = 0; // Number of bytes to discard in first read sector due to range request in HTTP header
-
 //                            if (readBytesFrom>=ExtractJob::constWavHeaderSize) {
 //                                readBytesFrom-=ExtractJob::constWavHeaderSize;
 //                            }
@@ -385,7 +391,7 @@ void HttpSocket::readClient()
                             cdparanoia.seek(firstSector, SEEK_SET);
                             ok=true;
                             writeMimeType(QLatin1String("audio/x-wav"), socket, readBytesFrom, totalSize+ExtractJob::constWavHeaderSize, false);
-                            if (0==readBytesFrom) { // Only write header if we are not seeking...
+                            if (writeHeader) {
                                 ExtractJob::writeWavHeader(*socket, totalSize);
                             }
                             bool stop=false;
@@ -426,16 +432,13 @@ void HttpSocket::readClient()
 
                     QFile f(song.file);
 
-                    if (f.open(QIODevice::ReadOnly)) {                        
+                    if (f.open(QIODevice::ReadOnly)) {
                         qint32 totalBytes = f.size();
 
                         writeMimeType(detectMimeType(song.file), socket, readBytesFrom, totalBytes, true);
                         ok=true;
-                        static const int constChunkSize=32768;
-                        char buffer[constChunkSize];
                         qint32 readPos = 0;
                         qint32 bytesRead = 0;
-                        bool stop=false;
 
                         if (0!=readBytesFrom) {
                             if (!f.seek(readBytesFrom)) {
@@ -449,6 +452,9 @@ void HttpSocket::readClient()
                         }
 
                         if (ok) {
+                            static const int constChunkSize=32768;
+                            char buffer[constChunkSize];
+                            bool stop=false;
                             do {
                                 bytesRead = f.read(buffer, constChunkSize);
                                 readPos+=bytesRead;
@@ -457,6 +463,8 @@ void HttpSocket::readClient()
                                 }
                             } while (readPos<totalBytes && !stop && !terminated);
                         }
+                    } else {
+                        DBUG << "Filed to open" << song.file;
                     }
                 }
             }
@@ -476,11 +484,9 @@ void HttpSocket::readClient()
 
 void HttpSocket::discardClient()
 {
-    QTcpSocket *socket = (QTcpSocket*)sender();
-    socket->deleteLater();
+    static_cast<QTcpSocket *>(sender())->deleteLater();
 }
 
-
 void HttpSocket::mpdAddress(const QString &a)
 {
     mpdAddr=a;
diff --git a/http/httpsocket.h b/http/httpsocket.h
index 2ac951b..3b5fc8c 100644
--- a/http/httpsocket.h
+++ b/http/httpsocket.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -41,11 +41,14 @@ public:
     HttpSocket(const QString &iface, quint16 port);
     virtual ~HttpSocket() { }
 
-    void terminate();
     void incomingConnection(int socket);
     QString address() const { return ifaceAddress; }
     QString configuredInterface() { return cfgInterface; }
 
+public Q_SLOTS:
+    void terminate();
+    void mpdAddress(const QString &a);
+
 private:
     bool openPort(const QHostAddress &a, quint16 p);
     bool isCantataStream(const QString &file) const;
@@ -54,7 +57,6 @@ private:
 private Q_SLOTS:
     void readClient();
     void discardClient();
-    void mpdAddress(const QString &a);
     void cantataStreams(const QStringList &files);
     void cantataStreams(const QList<Song> &songs, bool isUpdate);
     void removedIds(const QSet<qint32> &ids);
diff --git a/icons/CMakeLists.txt b/icons/CMakeLists.txt
index 21a022b..b98a2a7 100644
--- a/icons/CMakeLists.txt
+++ b/icons/CMakeLists.txt
@@ -22,6 +22,10 @@
         install(FILES cantata32.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/32x32/apps RENAME cantata.png)
         install(FILES cantata48.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps RENAME cantata.png)
         install(FILES cantata64.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/64x64/apps RENAME cantata.png)
+
+        install(FILES trayicon-mono-dark.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/${CMAKE_PROJECT_NAME}/icons/ubuntu-mono-light RENAME systray.svg)
+        install(FILES trayicon-mono-light.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/${CMAKE_PROJECT_NAME}/icons/ubuntu-mono-dark RENAME systray.svg)
+
         update_iconcache()
     endif (UNIX AND NOT APPLE)
 #endif (ENABLE_KDE_SUPPORT)
diff --git a/icons/media-next-dark.svg b/icons/media-next-dark.svg
new file mode 100644
index 0000000..8839aac
--- /dev/null
+++ b/icons/media-next-dark.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1" fill="#404040">
+<path d="m8 32c1.418 0.062 2.809 0.473 4 1.25l40 24c2.258 1.438 3.5 4.094 3.5 6.75s-1.242 5.312-3.5 6.75l-40 24c-1.191 0.777-2.582 1.188-4 1.25h-8v-64z"/>
+<path d="m112 32v64h16v-64z"/>
+<path d="m64 32c1.418 0.062 2.809 0.473 4 1.25l40 24c2.26 1.438 3.5 4.094 3.5 6.75s-1.24 5.312-3.5 6.75l-40 24c-1.191 0.777-2.582 1.188-4 1.25h-8v-64z"/>
+</g>
+</svg>
diff --git a/icons/media-next-light.svg b/icons/media-next-light.svg
new file mode 100644
index 0000000..9795e1b
--- /dev/null
+++ b/icons/media-next-light.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1" fill="#f0f0f0">
+<path d="m8 32c1.418 0.062 2.809 0.473 4 1.25l40 24c2.258 1.438 3.5 4.094 3.5 6.75s-1.242 5.312-3.5 6.75l-40 24c-1.191 0.777-2.582 1.188-4 1.25h-8v-64z"/>
+<path d="m112 32v64h16v-64z"/>
+<path d="m64 32c1.418 0.062 2.809 0.473 4 1.25l40 24c2.26 1.438 3.5 4.094 3.5 6.75s-1.24 5.312-3.5 6.75l-40 24c-1.191 0.777-2.582 1.188-4 1.25h-8v-64z"/>
+</g>
+</svg>
diff --git a/icons/media-next-rtl-dark.svg b/icons/media-next-rtl-dark.svg
new file mode 100644
index 0000000..02fb388
--- /dev/null
+++ b/icons/media-next-rtl-dark.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1" fill="#404040">
+<path d="m120 32c-1.42 0.062-2.81 0.473-4 1.25l-40 24c-2.258 1.438-3.5 4.094-3.5 6.75s1.242 5.312 3.5 6.75l40 24c1.19 0.777 2.58 1.188 4 1.25h8v-64z"/>
+<path d="m16 32v64h-16v-64z"/>
+<path d="m64 32c-1.418 0.062-2.809 0.473-4 1.25l-40 24c-2.258 1.438-3.5 4.094-3.5 6.75s1.242 5.312 3.5 6.75l40 24c1.191 0.777 2.582 1.188 4 1.25h8v-64z"/>
+</g>
+</svg>
diff --git a/icons/media-next-rtl-light.svg b/icons/media-next-rtl-light.svg
new file mode 100644
index 0000000..386c313
--- /dev/null
+++ b/icons/media-next-rtl-light.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1" fill="#f0f0f0">
+<path d="m120 32c-1.42 0.062-2.81 0.473-4 1.25l-40 24c-2.258 1.438-3.5 4.094-3.5 6.75s1.242 5.312 3.5 6.75l40 24c1.19 0.777 2.58 1.188 4 1.25h8v-64z"/>
+<path d="m16 32v64h-16v-64z"/>
+<path d="m64 32c-1.418 0.062-2.809 0.473-4 1.25l-40 24c-2.258 1.438-3.5 4.094-3.5 6.75s1.242 5.312 3.5 6.75l40 24c1.191 0.777 2.582 1.188 4 1.25h8v-64z"/>
+</g>
+</svg>
diff --git a/icons/media-pause-dark.svg b/icons/media-pause-dark.svg
new file mode 100644
index 0000000..e57c130
--- /dev/null
+++ b/icons/media-pause-dark.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1" fill="#404040">
+<path d="m32 32v64h24v-64z"/>
+<path d="m72 32v64h24v-64z"/>
+</g>
+</svg>
diff --git a/icons/media-pause-light.svg b/icons/media-pause-light.svg
new file mode 100644
index 0000000..8ff1bf1
--- /dev/null
+++ b/icons/media-pause-light.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1" fill="#f0f0f0">
+<path d="m32 32v64h24v-64z"/>
+<path d="m72 32v64h24v-64z"/>
+</g>
+</svg>
diff --git a/icons/media-play-dark.svg b/icons/media-play-dark.svg
new file mode 100644
index 0000000..07266d5
--- /dev/null
+++ b/icons/media-play-dark.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1">
+<path fill="#404040" d="m32 24v80h8c1.402 0.01 2.785-0.31 4-1l56-32c2.49-1.375 3.75-4.188 3.75-7s-1.26-5.625-3.75-7l-56-32c-1.215-0.719-2.598-1.039-4-1.039h-0.75z"/>
+</g>
+</svg>
diff --git a/icons/media-play-light.svg b/icons/media-play-light.svg
new file mode 100644
index 0000000..453f692
--- /dev/null
+++ b/icons/media-play-light.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1">
+<path fill="#f0f0f0" d="m32 24v80h8c1.402 0.01 2.785-0.31 4-1l56-32c2.49-1.375 3.75-4.188 3.75-7s-1.26-5.625-3.75-7l-56-32c-1.215-0.719-2.598-1.039-4-1.039h-0.75z"/>
+</g>
+</svg>
diff --git a/icons/media-play-rtl-dark.svg b/icons/media-play-rtl-dark.svg
new file mode 100644
index 0000000..bbc6d20
--- /dev/null
+++ b/icons/media-play-rtl-dark.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1">
+<path fill="#404040" d="m96 24v80h-8c-1.402 0.01-2.785-0.31-4-1l-56-32c-2.488-1.375-3.75-4.188-3.75-7s1.262-5.625 3.75-7l56-32c1.215-0.719 2.598-1.039 4-1.039h0.75z"/>
+</g>
+</svg>
diff --git a/icons/media-play-rtl-light.svg b/icons/media-play-rtl-light.svg
new file mode 100644
index 0000000..eba0289
--- /dev/null
+++ b/icons/media-play-rtl-light.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1">
+<path fill="#f0f0f0" d="m96 24v80h-8c-1.402 0.01-2.785-0.31-4-1l-56-32c-2.488-1.375-3.75-4.188-3.75-7s1.262-5.625 3.75-7l56-32c1.215-0.719 2.598-1.039 4-1.039h0.75z"/>
+</g>
+</svg>
diff --git a/icons/media-prev-dark.svg b/icons/media-prev-dark.svg
new file mode 100644
index 0000000..02fb388
--- /dev/null
+++ b/icons/media-prev-dark.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1" fill="#404040">
+<path d="m120 32c-1.42 0.062-2.81 0.473-4 1.25l-40 24c-2.258 1.438-3.5 4.094-3.5 6.75s1.242 5.312 3.5 6.75l40 24c1.19 0.777 2.58 1.188 4 1.25h8v-64z"/>
+<path d="m16 32v64h-16v-64z"/>
+<path d="m64 32c-1.418 0.062-2.809 0.473-4 1.25l-40 24c-2.258 1.438-3.5 4.094-3.5 6.75s1.242 5.312 3.5 6.75l40 24c1.191 0.777 2.582 1.188 4 1.25h8v-64z"/>
+</g>
+</svg>
diff --git a/icons/media-prev-light.svg b/icons/media-prev-light.svg
new file mode 100644
index 0000000..386c313
--- /dev/null
+++ b/icons/media-prev-light.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1" fill="#f0f0f0">
+<path d="m120 32c-1.42 0.062-2.81 0.473-4 1.25l-40 24c-2.258 1.438-3.5 4.094-3.5 6.75s1.242 5.312 3.5 6.75l40 24c1.19 0.777 2.58 1.188 4 1.25h8v-64z"/>
+<path d="m16 32v64h-16v-64z"/>
+<path d="m64 32c-1.418 0.062-2.809 0.473-4 1.25l-40 24c-2.258 1.438-3.5 4.094-3.5 6.75s1.242 5.312 3.5 6.75l40 24c1.191 0.777 2.582 1.188 4 1.25h8v-64z"/>
+</g>
+</svg>
diff --git a/icons/media-prev-rtl-dark.svg b/icons/media-prev-rtl-dark.svg
new file mode 100644
index 0000000..8839aac
--- /dev/null
+++ b/icons/media-prev-rtl-dark.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1" fill="#404040">
+<path d="m8 32c1.418 0.062 2.809 0.473 4 1.25l40 24c2.258 1.438 3.5 4.094 3.5 6.75s-1.242 5.312-3.5 6.75l-40 24c-1.191 0.777-2.582 1.188-4 1.25h-8v-64z"/>
+<path d="m112 32v64h16v-64z"/>
+<path d="m64 32c1.418 0.062 2.809 0.473 4 1.25l40 24c2.26 1.438 3.5 4.094 3.5 6.75s-1.24 5.312-3.5 6.75l-40 24c-1.191 0.777-2.582 1.188-4 1.25h-8v-64z"/>
+</g>
+</svg>
diff --git a/icons/media-prev-rtl-light.svg b/icons/media-prev-rtl-light.svg
new file mode 100644
index 0000000..9795e1b
--- /dev/null
+++ b/icons/media-prev-rtl-light.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1" fill="#f0f0f0">
+<path d="m8 32c1.418 0.062 2.809 0.473 4 1.25l40 24c2.258 1.438 3.5 4.094 3.5 6.75s-1.242 5.312-3.5 6.75l-40 24c-1.191 0.777-2.582 1.188-4 1.25h-8v-64z"/>
+<path d="m112 32v64h16v-64z"/>
+<path d="m64 32c1.418 0.062 2.809 0.473 4 1.25l40 24c2.26 1.438 3.5 4.094 3.5 6.75s-1.24 5.312-3.5 6.75l-40 24c-1.191 0.777-2.582 1.188-4 1.25h-8v-64z"/>
+</g>
+</svg>
diff --git a/icons/media-stop-dark.svg b/icons/media-stop-dark.svg
new file mode 100644
index 0000000..12fe1e0
--- /dev/null
+++ b/icons/media-stop-dark.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1">
+<path fill="#404040" d="m32 32v64h64v-64z"/>
+</g>
+</svg>
diff --git a/icons/media-stop-light.svg b/icons/media-stop-light.svg
new file mode 100644
index 0000000..4980580
--- /dev/null
+++ b/icons/media-stop-light.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1">
+<path fill="#f0f0f0" d="m32 32v64h64v-64z"/>
+</g>
+</svg>
diff --git a/icons/menu-icon-dark.svg b/icons/menu-icon-dark.svg
new file mode 100644
index 0000000..c7564eb
--- /dev/null
+++ b/icons/menu-icon-dark.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1">
+<path fill="#404040" d="m64 8c-1.766 0-3.527 0.0898-5.25 0.25l-3.25 16.75c-2.676 0.586-5.305 1.406-7.75 2.5l-12.25-11.75c-3.109 1.84-5.816 4.113-8.5 6.5l7.25 15.25c-1.777 1.992-3.395 4.18-4.75 6.5l-16.75-2.25c-1.422 3.27-2.469 6.691-3.25 10.25l14.75 8c-0.137 1.344-0.25 2.617-0.25 4 0 1.379 0.113 2.652 0.25 4l-14.75 8c0.781 3.559 1.828 6.98 3.25 10.25l16.75-2.25c1.355 2.32 2.973 4.508 4.75 6.5l-7.25 15.25c2.684 2.39 5.391 4.66 8.5 6.5l12.25-11.75c2.445 1.09 5.074 1.91 7.75 2.5l3.25 16.75c1.723 0.16 3.484 0.25 5.25 0.25s3.527-0.09 5.25-0.25l3.25-16.75c2.676-0.59 5.305-1.41 7.75-2.5l12.25 11.75c3.109-1.84 5.816-4.11 8.5-6.5l-7.25-15.25c1.777-1.992 3.395-4.18 4.75-6.5l16.75 2.25c1.42-3.273 2.47-6.691 3.25-10.25l-14.75-8c0.14-1.348 0.25-2.621 0.25-4 0-1.383-0.11-2.656-0.25-4l14.75-8c-0.78-3.559-1.83-6.98-3.25-10.25l-16.75 2.25c-1.355-2.32-2.973-4.508-4.75-6.5l7.25-15.25c-2.684-2.387-5.391-4.66-8.5-6.5l-12.25 11.75c-2.445-1.094-5.074-1.914-7.75-2.5l-3.25-16.75c-1.723-0.1602-3.484-0.25-5.25-0.25zm0 32c13.254 0 24 10.746 24 24s-10.746 24-24 24-24-10.746-24-24 10.746-24 24-24z"/>
+</g>
+</svg>
diff --git a/icons/menu-icon-light.svg b/icons/menu-icon-light.svg
new file mode 100644
index 0000000..6d0b5a9
--- /dev/null
+++ b/icons/menu-icon-light.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128pt" width="128pt" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+<g id="surface1">
+<path fill="#f0f0f0" d="m64 8c-1.766 0-3.527 0.0898-5.25 0.25l-3.25 16.75c-2.676 0.586-5.305 1.406-7.75 2.5l-12.25-11.75c-3.109 1.84-5.816 4.113-8.5 6.5l7.25 15.25c-1.777 1.992-3.395 4.18-4.75 6.5l-16.75-2.25c-1.422 3.27-2.469 6.691-3.25 10.25l14.75 8c-0.137 1.344-0.25 2.617-0.25 4 0 1.379 0.113 2.652 0.25 4l-14.75 8c0.781 3.559 1.828 6.98 3.25 10.25l16.75-2.25c1.355 2.32 2.973 4.508 4.75 6.5l-7.25 15.25c2.684 2.39 5.391 4.66 8.5 6.5l12.25-11.75c2.445 1.09 5.074 1.91 7.75 2.5l3.25 16.75c1.723 0.16 3.484 0.25 5.25 0.25s3.527-0.09 5.25-0.25l3.25-16.75c2.676-0.59 5.305-1.41 7.75-2.5l12.25 11.75c3.109-1.84 5.816-4.11 8.5-6.5l-7.25-15.25c1.777-1.992 3.395-4.18 4.75-6.5l16.75 2.25c1.42-3.273 2.47-6.691 3.25-10.25l-14.75-8c0.14-1.348 0.25-2.621 0.25-4 0-1.383-0.11-2.656-0.25-4l14.75-8c-0.78-3.559-1.83-6.98-3.25-10.25l-16.75 2.25c-1.355-2.32-2.973-4.508-4.75-6.5l7.25-15.25c-2.684-2.387-5.391-4.66-8.5-6.5l-12.25 11.75c-2.445-1.094-5.074-1.914-7.75-2.5l-3.25-16.75c-1.723-0.1602-3.484-0.25-5.25-0.25zm0 32c13.254 0 24 10.746 24 24s-10.746 24-24 24-24-10.746-24-24 10.746-24 24-24z"/>
+</g>
+</svg>
diff --git a/icons/sidebar-search-dark.svg b/icons/sidebar-search-dark.svg
new file mode 100644
index 0000000..76b258b
--- /dev/null
+++ b/icons/sidebar-search-dark.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#404040">
+<path d="m496.13 435.7l-121.27-103.15c-12.537-11.283-25.945-16.463-36.776-15.963 28.63-33.54 45.92-77.04 45.92-124.59 0-106.04-85.96-192-192-192s-192 85.961-192 192 85.961 192 192 192c47.549 0 91.054-17.293 124.59-45.922-0.5 10.831 4.68 24.239 15.963 36.776l103.15 121.28c17.661 19.623 46.511 21.277 64.11 3.678s15.94-46.46-3.68-64.12zm-304.13-115.7c-70.692 0-128-57.308-128-128s57.31-128 128-128 128 57.308 128 128-57.31 128-128 128z"/>
+</svg>
diff --git a/icons/sidebar-search-light.svg b/icons/sidebar-search-light.svg
new file mode 100644
index 0000000..cbc4917
--- /dev/null
+++ b/icons/sidebar-search-light.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#f0f0f0">
+<path d="m496.13 435.7l-121.27-103.15c-12.537-11.283-25.945-16.463-36.776-15.963 28.63-33.54 45.92-77.04 45.92-124.59 0-106.04-85.96-192-192-192s-192 85.961-192 192 85.961 192 192 192c47.549 0 91.054-17.293 124.59-45.922-0.5 10.831 4.68 24.239 15.963 36.776l103.15 121.28c17.661 19.623 46.511 21.277 64.11 3.678s15.94-46.46-3.68-64.12zm-304.13-115.7c-70.692 0-128-57.308-128-128s57.31-128 128-128 128 57.308 128 128-57.31 128-128 128z"/>
+</svg>
diff --git a/icons/trayicon-mono-dark.svg b/icons/trayicon-mono-dark.svg
new file mode 100644
index 0000000..0c4d2e4
--- /dev/null
+++ b/icons/trayicon-mono-dark.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" fill="#3c3c3c">
+<g id="g2987" transform="matrix(.90823 0 0 .90823 7.2087 5.7018)">
+<path id="path58" d="m68.922 24c-2.3928 5.214-1.0894 11.253-2.1097 16.771l-2.0768 27.175c-14.023-6.2639-35.29 3.1797-32.358 14.489 1.1296 10.923 22.818 16.97 35.239 9.5647 11.614-7.2551 7.5155-18.867 9.0737-28.288l1.4472-25.436c6.0508 5.665 14.618 13.627 7.0845 20.535-5.211 2.9891-0.62147 10.073 6.177 7.1799 11.531-6.012 11.731-18.782 2.675-25.939-6.728-5.345-14.503-10.198-21.912-15.149-0.926-0.313-2.022-1.775-3.24-0.903z"/>
+<path id="path3090" d="m63.775 3.0296c-34.271 0-62.055 27.784-62.055 62.055s27.784 62.055 62.055 62.055 62.055-27.784 62.055-62.055-27.784-62.055-62.055-62.055zm0 108.6c-25.704 0-46.541-20.837-46.541-46.541s20.837-46.541 46.541-46.541 46.541 20.837 46.541 46.541-20.837 46.541-46.541 46.541z"/>
+</g>
+</svg>
diff --git a/icons/trayicon-mono-light.svg b/icons/trayicon-mono-light.svg
new file mode 100644
index 0000000..4e6e5c1
--- /dev/null
+++ b/icons/trayicon-mono-light.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" fill="#dfdbd2">
+<g id="g2987" transform="matrix(.90823 0 0 .90823 7.2087 5.7018)">
+<path id="path58" d="m68.922 24c-2.3928 5.214-1.0894 11.253-2.1097 16.771l-2.0768 27.175c-14.023-6.2639-35.29 3.1797-32.358 14.489 1.1296 10.923 22.818 16.97 35.239 9.5647 11.614-7.2551 7.5155-18.867 9.0737-28.288l1.4472-25.436c6.0508 5.665 14.618 13.627 7.0845 20.535-5.211 2.9891-0.62147 10.073 6.177 7.1799 11.531-6.012 11.731-18.782 2.675-25.939-6.728-5.345-14.503-10.198-21.912-15.149-0.926-0.313-2.022-1.775-3.24-0.903z"/>
+<path id="path3090" d="m63.775 3.0296c-34.271 0-62.055 27.784-62.055 62.055s27.784 62.055 62.055 62.055 62.055-27.784 62.055-62.055-27.784-62.055-62.055-62.055zm0 108.6c-25.704 0-46.541-20.837-46.541-46.541s20.837-46.541 46.541-46.541 46.541 20.837 46.541 46.541-20.837 46.541-46.541 46.541z"/>
+</g>
+</svg>
diff --git a/models/actionmodel.cpp b/models/actionmodel.cpp
index 7667599..b047722 100644
--- a/models/actionmodel.cpp
+++ b/models/actionmodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/models/actionmodel.h b/models/actionmodel.h
index d4c2ce7..91a26f8 100644
--- a/models/actionmodel.h
+++ b/models/actionmodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -37,6 +37,7 @@ public:
     virtual ~ActionModel() { }
     
     virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+    virtual void resetModel() { beginResetModel(); endResetModel(); }
 };
 
 Q_DECLARE_METATYPE(QList<Action *>)
diff --git a/models/albumsmodel.cpp b/models/albumsmodel.cpp
index 14d1d70..fd846f9 100644
--- a/models/albumsmodel.cpp
+++ b/models/albumsmodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -52,13 +52,6 @@
 #include "modeltest.h"
 #endif
 
-#ifdef CACHE_SCALED_COVERS
-static QString cacheCoverName(const QString &artist, const QString &album, int size, bool createDir=false)
-{
-    return Utils::cacheDir(Covers::constCoverDir+QString::number(size)+"/"+Covers::encodeName(artist), createDir)+Covers::encodeName(album)+".png";
-}
-#endif
-
 static int sortAlbums=AlbumsModel::Sort_AlbumArtist;
 
 #ifdef ENABLE_KDE_SUPPORT
@@ -84,33 +77,25 @@ AlbumsModel * AlbumsModel::self()
 static MusicLibraryItemAlbum::CoverSize coverSize=MusicLibraryItemAlbum::CoverMedium;
 static QPixmap *theDefaultIcon=0;
 static QSize itemSize;
-static bool useLibraryCoverSizes=false;
+static bool iconMode=true;
 
 int AlbumsModel::iconSize()
 {
-    return MusicLibraryItemAlbum::iconSize(coverSize, !useLibraryCoverSizes);
+    return MusicLibraryItemAlbum::iconSize(coverSize, iconMode);
 }
 
 static int stdIconSize()
 {
-    if (useLibraryCoverSizes) {
-        return MusicLibraryItemAlbum::iconSize(coverSize);
-    }
-    return 128;
+    return iconMode ? 128 : MusicLibraryItemAlbum::iconSize(coverSize);
 }
 
-void AlbumsModel::setUseLibrarySizes(bool u)
+void AlbumsModel::setIconMode(bool u)
 {
-    if (useLibraryCoverSizes!=u && theDefaultIcon) {
+    if (iconMode!=u && theDefaultIcon) {
         delete theDefaultIcon;
         theDefaultIcon=0;
     }
-    useLibraryCoverSizes=u;
-}
-
-bool AlbumsModel::useLibrarySizes()
-{
-    return useLibraryCoverSizes;
+    iconMode=u;
 }
 
 MusicLibraryItemAlbum::CoverSize AlbumsModel::currentCoverSize()
@@ -292,7 +277,7 @@ QVariant AlbumsModel::data(const QModelIndex &index, int role) const
                    si->parent->album+(year>0 ? (QLatin1String(" (")+QString::number(year)+QChar(')')) : QString())+QLatin1String("<br/>")+
                    data(index, Qt::DisplayRole).toString()+QLatin1String("<br/>")+
                    Song::formattedTime(si->time, true)+QLatin1String("<br/>")+
-                   QLatin1String("<small><i>")+si->file+QLatin1String("</i></small>");
+                   QLatin1String("<small><i>")+si->filePath()+QLatin1String("</i></small>");
         }
         case Qt::DisplayRole:
             if (Song::Playlist==si->type) {
@@ -470,7 +455,7 @@ void AlbumsModel::update(const MusicLibraryItemRoot *root)
 void AlbumsModel::setCover(const Song &song, const QImage &img, const QString &file, bool update)
 {
     Q_UNUSED(file)
-    if (img.isNull() || song.isArtistImageRequest()) {
+    if (img.isNull() || song.isArtistImageRequest() || song.isCdda()) {
         return;
     }
     QList<AlbumItem *>::Iterator it=items.begin();
@@ -545,23 +530,6 @@ void AlbumsModel::setAlbumSort(int s)
     }
 }
 
-void AlbumsModel::loadAllCovers()
-{
-    if (items.isEmpty()) {
-        return;
-    }
-    int iSize=iconSize();
-    if (!iSize) {
-        return;
-    }
-    foreach (AlbumItem *al, items) {
-        if (!al->coverRequested && Song::SingleTracks!=al->type) {
-            al->coverRequested=true;
-            al->getCover();
-        }
-    }
-}
-
 AlbumsModel::AlbumItem::AlbumItem(const QString &ar, const QString &al, quint16 y)
     : artist(ar)
     , album(al)
@@ -644,6 +612,11 @@ void AlbumsModel::AlbumItem::updateStats()
 void AlbumsModel::AlbumItem::getCover()
 {
     if (Song::SingleTracks!=type && songs.count()) {
+        cover=Covers::getScaledCover(artist, album, iconSize());
+        if (cover) {
+            return;
+        }
+
         SongItem *firstSong=songs.first();
         Song s;
         if (Song::MultipleArtists==type) {  // Then Cantata has placed this album under 'Various Artists' but the actual album as a different AlbumArtist tag
@@ -658,18 +631,6 @@ void AlbumsModel::AlbumItem::getCover()
         s.file=firstSong->file;
         s.type=type;
         s.composer=firstSong->composer;
-        #ifdef CACHE_SCALED_COVERS
-        int size=iconSize();
-        QString cache=cacheCoverName(s.artist, s.album, size);
-
-        if (QFile::exists(cache)) {
-            QImage img(cache);
-            if (!img.isNull()) {
-                cover=new QPixmap(QPixmap::fromImage(img));
-                return;
-            }
-        }
-        #endif
         Covers::Image img=Covers::self()->requestImage(s);
         if (!img.img.isNull()) {
             setCover(img.img);
@@ -683,25 +644,16 @@ void AlbumsModel::AlbumItem::setCover(const QImage &img)
         delete cover;
     }
 
-    #ifdef CACHE_SCALED_COVERS
     if (Song::SingleTracks!=type && songs.count() && !img.isNull()) {
-        SongItem *firstSong=songs.first();
-        Song s;
-        if (Song::MultipleArtists==type) {  // Then Cantata has placed this album under 'Various Artists' but the actual album as a different AlbumArtist tag
-            s.artist=firstSong->albumArtist();
-        } else {
-            s.artist=artist;
-        }
-        s.album=album;
         int size=iconSize();
         QImage scaled=img.scaled(QSize(size, size), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
-        scaled.save(cacheCoverName(s.artist, s.album, size, true));
+        Covers::saveScaledCover(scaled, artist, album, size);
         cover=new QPixmap(QPixmap::fromImage(scaled));
+        return;
     }
-    #else
+
     int size=iconSize();
     cover=new QPixmap(QPixmap::fromImage(img.scaled(QSize(size, size), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)));
-    #endif
 }
 
 const AlbumsModel::SongItem *AlbumsModel::AlbumItem::getCueFile() const
diff --git a/models/albumsmodel.h b/models/albumsmodel.h
index 96b61b3..94519d6 100644
--- a/models/albumsmodel.h
+++ b/models/albumsmodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -43,8 +43,7 @@ public:
     static void setCoverSize(MusicLibraryItemAlbum::CoverSize size);
     static int iconSize();
     static void setItemSize(const QSize &sz);
-    static void setUseLibrarySizes(bool u);
-    static bool useLibrarySizes();
+    static void setIconMode(bool u);
 
     enum Sort
     {
@@ -124,7 +123,6 @@ public:
     void setEnabled(bool e);
     int albumSort() const;
     void setAlbumSort(int s);
-    void loadAllCovers();
 
 Q_SIGNALS:
     void updated();
diff --git a/models/albumsproxymodel.cpp b/models/albumsproxymodel.cpp
index 9c980c7..d2f9aa1 100644
--- a/models/albumsproxymodel.cpp
+++ b/models/albumsproxymodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/models/albumsproxymodel.h b/models/albumsproxymodel.h
index 1fe94da..3b6a3a6 100644
--- a/models/albumsproxymodel.h
+++ b/models/albumsproxymodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/models/devicesmodel.cpp b/models/devicesmodel.cpp
index 09d80b1..5a93fa2 100644
--- a/models/devicesmodel.cpp
+++ b/models/devicesmodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -250,8 +250,10 @@ void DevicesModel::setEnabled(bool e)
     if (enabled) {
         connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(const QString &)), this, SLOT(deviceAdded(const QString &)));
         connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceRemoved(const QString &)), this, SLOT(deviceRemoved(const QString &)));
-//        connect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)),
-//                this, SLOT(setCover(const Song &, const QImage &, const QString &)));
+        #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
+        connect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)),
+                this, SLOT(setCover(const Song &, const QImage &, const QString &)));
+        #endif
         // Call loadLocal via a timer, so that upon Cantata start-up model is loaded into view before we try and expand items!
         QTimer::singleShot(0, this, SIGNAL(loadLocal()));
         connect(MountPoints::self(), SIGNAL(updated()), this, SLOT(mountsChanged()));
@@ -274,8 +276,10 @@ void DevicesModel::stop()
 
     disconnect(Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(const QString &)), this, SLOT(deviceAdded(const QString &)));
     disconnect(Solid::DeviceNotifier::instance(), SIGNAL(deviceRemoved(const QString &)), this, SLOT(deviceRemoved(const QString &)));
-//        disconnect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)),
-//                   this, SLOT(setCover(const Song &, const QImage &, const QString &)));
+    #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
+    disconnect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)),
+               this, SLOT(setCover(const Song &, const QImage &, const QString &)));
+    #endif
     disconnect(MountPoints::self(), SIGNAL(updated()), this, SLOT(mountsChanged()));
     #if defined ENABLE_REMOTE_DEVICES
     unmountRemote();
@@ -288,6 +292,25 @@ Device * DevicesModel::device(const QString &udi)
     return idx<0 ? 0 : static_cast<Device *>(collections.at(idx));
 }
 
+void DevicesModel::setCover(const Song &song, const QImage &img, const QString &file)
+{
+    #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
+    if (song.isCdda()) {
+        int idx=indexOf(song.title);
+        if (idx>=0) {
+            Device *dev=static_cast<Device *>(collections.at(idx));
+            if (Device::AudioCd==dev->devType()) {
+                static_cast<AudioCdDevice *>(dev)->setCover(song, img, file);
+            }
+        }
+    }
+    #else
+    Q_UNUSED(song)
+    Q_UNUSED(img)
+    Q_UNUSED(file)
+    #endif
+}
+
 void DevicesModel::setCover(const Song &song, const QImage &img)
 {
     if (MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize()) {
diff --git a/models/devicesmodel.h b/models/devicesmodel.h
index 4893f2e..5deff19 100644
--- a/models/devicesmodel.h
+++ b/models/devicesmodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -70,6 +70,7 @@ public:
     #endif
 
 public Q_SLOTS:
+    void setCover(const Song &song, const QImage &img, const QString &file);
     void setCover(const Song &song, const QImage &img);
     void deviceAdded(const QString &udi);
     void deviceRemoved(const QString &udi);
diff --git a/models/digitallyimported.cpp b/models/digitallyimported.cpp
index cb01647..4890be1 100644
--- a/models/digitallyimported.cpp
+++ b/models/digitallyimported.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/models/digitallyimported.h b/models/digitallyimported.h
index 086557e..ded116c 100644
--- a/models/digitallyimported.h
+++ b/models/digitallyimported.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/models/dirviewitem.cpp b/models/dirviewitem.cpp
index cd82ad9..7b00a9b 100644
--- a/models/dirviewitem.cpp
+++ b/models/dirviewitem.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -26,7 +26,7 @@
 
 #include "dirviewitem.h"
 
-QString DirViewItem::fullName()
+QString DirViewItem::fullName() const
 {
     QString fn = m_name;
     DirViewItem *item = parent();
diff --git a/models/dirviewitem.h b/models/dirviewitem.h
index a377902..bea28f2 100644
--- a/models/dirviewitem.h
+++ b/models/dirviewitem.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -48,7 +48,7 @@ public:
     DirViewItem * parent() const { return m_parentItem; }
     virtual int childCount() const { return 0; }
     virtual DirViewItem * child(int) const { return 0; }
-    QString fullName();
+    virtual QString fullName() const;
     const QString & data() const { return m_name; }
     const QString & name() const { return m_name; }
     virtual Type type() const=0;
diff --git a/models/dirviewitemdir.cpp b/models/dirviewitemdir.cpp
index 4fb22df..4e7fa2f 100644
--- a/models/dirviewitemdir.cpp
+++ b/models/dirviewitemdir.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -28,7 +28,16 @@
 #include "dirviewitemfile.h"
 #include <QStringList>
 
-DirViewItem * DirViewItemDir::createDirectory(const QString &dirName)
+DirViewItemDir * DirViewItemDir::getDirectory(const QString &dirName, bool create)
+{
+    DirViewItem *item=child(dirName);
+    if (item && Type_Dir==item->type()) {
+        return static_cast<DirViewItemDir *>(item);
+    }
+    return create ? createDirectory(dirName) : 0;
+}
+
+DirViewItemDir * DirViewItemDir::createDirectory(const QString &dirName)
 {
     DirViewItemDir *dir = new DirViewItemDir(dirName, this);
     m_indexes.insert(dirName, m_childItems.count());
@@ -36,23 +45,29 @@ DirViewItem * DirViewItemDir::createDirectory(const QString &dirName)
     return dir;
 }
 
-DirViewItem * DirViewItemDir::insertFile(const QString &fileName)
+DirViewItem * DirViewItemDir::insertFile(const QString &fileName, const QString &fullPath)
 {
-    DirViewItemFile *file = new DirViewItemFile(fileName, this);
+    DirViewItemFile *file = new DirViewItemFile(fileName, fullPath, this);
     m_indexes.insert(fileName, m_childItems.count());
     m_childItems.append(file);
     return file;
 }
 
-void DirViewItemDir::insertFile(const QStringList &path)
+void DirViewItemDir::insertFile(const QStringList &path, const QString &fullPath)
 {
     if (1==path.count()) {
-        insertFile(path[0]);
+        insertFile(path[0], fullPath);
     } else {
-        static_cast<DirViewItemDir *>(createDirectory(path[0]))->insertFile(path.mid(1));
+        static_cast<DirViewItemDir *>(createDirectory(path[0]))->insertFile(path.mid(1), fullPath);
     }
 }
 
+void DirViewItemDir::add(DirViewItem *i)
+{
+    m_indexes.insert(i->name(), m_childItems.count());
+    m_childItems.append(i);
+}
+
 void DirViewItemDir::remove(DirViewItem *dir)
 {
     int index=m_childItems.indexOf(dir);
diff --git a/models/dirviewitemdir.h b/models/dirviewitemdir.h
index 370ca73..393676b 100644
--- a/models/dirviewitemdir.h
+++ b/models/dirviewitemdir.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -38,9 +38,12 @@ public:
     int childCount() const { return m_childItems.count(); }
     DirViewItem * child(int row) const { return m_childItems.value(row); }
     DirViewItem * child(const QString &name) const { return m_indexes.contains(name) ? m_childItems.value(m_indexes[name]) : 0; }
-    DirViewItem * createDirectory(const QString &dirName);
-    DirViewItem * insertFile(const QString &fileName);
-    void insertFile(const QStringList &path);
+    const QList<DirViewItem *> & childItems() const { return m_childItems; }
+    DirViewItemDir * getDirectory(const QString &dirName, bool create);
+    DirViewItemDir * createDirectory(const QString &dirName);
+    DirViewItem * insertFile(const QString &fileName, const QString &fullPath);
+    void add(DirViewItem *i);
+    void insertFile(const QStringList &path, const QString &fullPath);
     void remove(DirViewItem *dir);
     bool hasChild(const QString &name) { return m_indexes.contains(name); }
     QSet<QString> allFiles() const;
diff --git a/models/dirviewitemfile.h b/models/dirviewitemfile.h
index ee0212e..ed8e35e 100644
--- a/models/dirviewitemfile.h
+++ b/models/dirviewitemfile.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -38,7 +38,7 @@ public:
         CueSheet
     };
 
-    DirViewItemFile(const QString &name, DirViewItem *parent) : DirViewItem(name, parent) {
+    DirViewItemFile(const QString &name, const QString &p, DirViewItem *parent) : DirViewItem(name, parent), path(p) {
         fType=MPDConnection::isPlaylist(name)
                 ? name.endsWith(QLatin1String(".cue"), Qt::CaseInsensitive)
                     ? CueSheet
@@ -48,8 +48,12 @@ public:
     virtual ~DirViewItemFile() { }
     Type type() const { return Type_File;  }
     FileType fileType() const { return fType; }
+    QString fullName() const { return path.isEmpty() ? DirViewItem::fullName() : path; }
+    const QString & filePath() const { return path; }
+
 private:
     FileType fType;
+    QString path;
 };
 
 #endif
diff --git a/models/dirviewitemroot.h b/models/dirviewitemroot.h
index 568a610..9339ca6 100644
--- a/models/dirviewitemroot.h
+++ b/models/dirviewitemroot.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/models/dirviewmodel.cpp b/models/dirviewmodel.cpp
index f068ef3..66986d4 100644
--- a/models/dirviewmodel.cpp
+++ b/models/dirviewmodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -28,18 +28,24 @@
 #include <QString>
 #include <QVariant>
 #include <QMimeData>
+#include <QFile>
+#include <QXmlStreamReader>
+#include <QXmlStreamWriter>
 #include "localize.h"
 #include "qtplural.h"
 #include "dirviewmodel.h"
 #include "dirviewitem.h"
 #include "dirviewitemfile.h"
 #include "playqueuemodel.h"
+#include "musiclibrarymodel.h"
 #include "itemview.h"
 #include "settings.h"
 #include "mpdconnection.h"
 #include "icon.h"
 #include "icons.h"
 #include "config.h"
+#include "utils.h"
+#include "qtiocompressor/qtiocompressor.h"
 
 #if defined ENABLE_MODEL_TEST
 #include "modeltest.h"
@@ -49,6 +55,18 @@
 K_GLOBAL_STATIC(DirViewModel, instance)
 #endif
 
+static const QLatin1String constCacheName("-folder-listing");
+
+static QString cacheFileName()
+{
+    MPDConnectionDetails details=MPDConnection::self()->getDetails();
+    QString fileName=(!details.isLocal() ? details.hostname+'_'+QString::number(details.port) : details.hostname)
+                     +constCacheName+MusicLibraryModel::constLibraryCompressedExt;
+    fileName.replace('/', '_');
+    fileName.replace('~', '_');
+    return Utils::cacheDir(MusicLibraryModel::constLibraryCache)+fileName;
+}
+
 DirViewModel * DirViewModel::self()
 {
     #ifdef ENABLE_KDE_SUPPORT
@@ -68,6 +86,7 @@ DirViewModel * DirViewModel::self()
 DirViewModel::DirViewModel(QObject *parent)
     : ActionModel(parent)
     , rootItem(new DirViewItemRoot)
+    , databaseTimeUnreliable(false)
     , enabled(false)
 {
 }
@@ -85,10 +104,13 @@ void DirViewModel::setEnabled(bool e)
     enabled=e;
 
     if (enabled) {
-        connect(MPDConnection::self(), SIGNAL(dirViewUpdated(DirViewItemRoot *)), this, SLOT(updateDirView(DirViewItemRoot *)));
+        connect(MPDConnection::self(), SIGNAL(updatingDatabase()), this, SLOT(updatingMpd()));
+        connect(MPDConnection::self(), SIGNAL(dirViewUpdated(DirViewItemRoot *, const QDateTime &)), this, SLOT(updateDirView(DirViewItemRoot *, const QDateTime &)));
     } else {
         clear();
-        disconnect(MPDConnection::self(), SIGNAL(dirViewUpdated(DirViewItemRoot *)), this, SLOT(updateDirView(DirViewItemRoot *)));
+        removeCache();
+        disconnect(MPDConnection::self(), SIGNAL(updatingDatabase()), this, SLOT(updatingMpd()));
+        disconnect(MPDConnection::self(), SIGNAL(dirViewUpdated(DirViewItemRoot *, const QDateTime &)), this, SLOT(updateDirView(DirViewItemRoot *, const QDateTime &)));
     }
 }
 
@@ -211,13 +233,179 @@ QVariant DirViewModel::data(const QModelIndex &index, int role) const
 
 void DirViewModel::clear()
 {
-    updateDirView(new DirViewItemRoot());
+    if (!rootItem || 0==rootItem->childCount()) {
+        return;
+    }
+    const DirViewItemRoot *oldRoot = rootItem;
+    beginResetModel();
+    databaseTime = QDateTime();
+    rootItem = new DirViewItemRoot;
+    delete oldRoot;
+    endResetModel();
+}
+
+static QLatin1String constTopTag("CantataFolders");
+static const QString constVersionAttribute=QLatin1String("version");
+static const QString constDateAttribute=QLatin1String("date");
+static const QString constDateUnreliableAttribute=QLatin1String("dateUnreliable");
+static const QString constNameAttribute=QLatin1String("name");
+static const QString constPathAttribute=QLatin1String("path");
+static const QString constDirTag=QLatin1String("dir");
+static const QString constFileTag=QLatin1String("file");
+static const QString constTrueValue=QLatin1String("true");
+
+static quint32 constVersion=2;
+
+void DirViewModel::toXML()
+{
+    QString filename=cacheFileName();
+    if ((!rootItem || 0==rootItem->childCount()) && databaseTime.date().year()<2000) {
+        if (QFile::exists(filename)) {
+            QFile::remove(filename);
+        }
+        return;
+    }
+
+    QFile file(filename);
+    QtIOCompressor compressor(&file);
+    compressor.setStreamFormat(QtIOCompressor::GzipFormat);
+    if (!compressor.open(QIODevice::WriteOnly)) {
+        return;
+    }
+
+    QXmlStreamWriter writer(&compressor);
+
+    writer.writeStartDocument();
+    writer.writeStartElement(constTopTag);
+    writer.writeAttribute(constVersionAttribute, QString::number(constVersion));
+    writer.writeAttribute(constDateAttribute, QString::number(databaseTime.toTime_t()));
+    if (databaseTimeUnreliable) {
+        writer.writeAttribute(constDateUnreliableAttribute, constTrueValue);
+    }
+
+    if (rootItem) {
+        foreach (const DirViewItem *i, rootItem->childItems()) {
+            toXML(i, writer);
+        }
+    }
+    writer.writeEndElement();
+    writer.writeEndDocument();
+    compressor.close();
+}
+
+void DirViewModel::removeCache()
+{
+    QString cacheFile(cacheFileName());
+    if (QFile::exists(cacheFile)) {
+        QFile::remove(cacheFile);
+    }
+
+    databaseTime = QDateTime();
+}
+
+void DirViewModel::toXML(const DirViewItem *item, QXmlStreamWriter &writer)
+{
+    writer.writeStartElement(DirViewItem::Type_File==item->type() ? constFileTag : constDirTag);
+    writer.writeAttribute(constNameAttribute, item->name());
+    if (DirViewItem::Type_Dir==item->type()) {
+        foreach (const DirViewItem *i, static_cast<const DirViewItemDir *>(item)->childItems()) {
+            toXML(i, writer);
+        }
+    } else {
+         const DirViewItemFile *f=static_cast<const DirViewItemFile *>(item);
+         if (!f->filePath().isEmpty()) {
+             writer.writeAttribute(constPathAttribute, f->filePath());
+         }
+    }
+    writer.writeEndElement();
 }
 
-void DirViewModel::updateDirView(DirViewItemRoot *newroot)
+bool DirViewModel::fromXML()
 {
+    clear();
+    QFile file(cacheFileName());
+    QtIOCompressor compressor(&file);
+    compressor.setStreamFormat(QtIOCompressor::GzipFormat);
+    if (!compressor.open(QIODevice::ReadOnly)) {
+        return false;
+    }
+
+    DirViewItemRoot *root=new DirViewItemRoot;
+    quint32 date=fromXML(&compressor, MPDStats::self()->dbUpdate(), root);
+    compressor.close();
+    if (!date) {
+        delete root;
+        return false;
+    }
+
+    QDateTime dt;
+    dt.setTime_t(date);
+    updateDirView(root, dt, true);
+    return true;
+}
+
+quint32 DirViewModel::fromXML(QIODevice *dev, const QDateTime &dt, DirViewItemRoot *root)
+{
+    QXmlStreamReader reader(dev);
+    quint32 xmlDate=0;
+    DirViewItemDir *currentDir=root;
+    QList<DirViewItemDir *> dirStack;
+
+    while (!reader.atEnd()) {
+        reader.readNext();
+        if (reader.error()) {
+            delete root;
+            return 0;
+        }
+        if (reader.isStartElement()) {
+            QString element = reader.name().toString();
+            QXmlStreamAttributes attributes=reader.attributes();
+
+            if (constTopTag == element) {
+                quint32 version = attributes.value(constVersionAttribute).toString().toUInt();
+                xmlDate = attributes.value(constDateAttribute).toString().toUInt();
+                if ( version < constVersion || (dt.isValid() && xmlDate < dt.toTime_t())) {
+                    return 0;
+                }
+                databaseTimeUnreliable=constTrueValue==attributes.value(constDateUnreliableAttribute).toString();
+            } else if (constDirTag==element) {
+                DirViewItemDir *dir=new DirViewItemDir(attributes.value(constNameAttribute).toString(), currentDir);
+                currentDir->add(dir);
+                dirStack.append(currentDir);
+                currentDir=dir;
+            } else if (constFileTag==element) {
+                currentDir->add(new DirViewItemFile(attributes.value(constNameAttribute).toString(),
+                                                    attributes.value(constPathAttribute).toString(), currentDir));
+            } else {
+                return 0;
+            }
+        } else if (reader.isEndElement()) {
+            if (constDirTag==reader.name().toString()) {
+                currentDir=dirStack.takeLast();
+            }
+        }
+    }
+
+    return xmlDate;
+}
+
+void DirViewModel::updateDirView(DirViewItemRoot *newroot, const QDateTime &dbUpdate, bool fromFile)
+{
+    if (databaseTime.isValid() && databaseTime >= dbUpdate) {
+        delete newroot;
+        return;
+    }
+
     bool incremental=enabled && rootItem->childCount() && newroot->childCount();
+    bool updatedListing=false;
+    bool needToUpdate=!databaseTime.isValid();
+    bool needToSave=dbUpdate>databaseTime;
 
+    if (incremental && !QFile::exists(cacheFileName())) {
+        incremental=false;
+    }
+
+    databaseTime=dbUpdate;
     if (incremental) {
         QSet<QString> currentFiles=rootItem->allFiles();
         QSet<QString> updateFiles=newroot->allFiles();
@@ -225,27 +413,61 @@ void DirViewModel::updateDirView(DirViewItemRoot *newroot)
         QSet<QString> added=updateFiles-currentFiles;
 
         foreach (const QString &s, added) {
-            addFileToList(s);
+            if (s.startsWith(Song::constMopidyLocal)) {
+                addFileToList(Song::decodePath(s), s);
+            } else {
+                addFileToList(s, QString());
+            }
         }
         foreach (const QString &s, removed) {
-            removeFileFromList(s);
+            removeFileFromList(Song::decodePath(s));
         }
+        updatedListing=!added.isEmpty() || !removed.isEmpty();
     } else {
         const DirViewItemRoot *oldRoot = rootItem;
-
         beginResetModel();
         rootItem = newroot;
         delete oldRoot;
         endResetModel();
+        updatedListing=true;
+    }
+
+    // MPD proxy DB plugin (MPD < 0.18.5) does not provide a datetime for the DB. Also, Mopidy
+    // returns 0 for the database time (which equates to 1am Jan 1st 1970!). Therefore, in these
+    // cases we just use current datetime so that we dont keep requesting DB listing each time
+    // Cantata starts...
+    //
+    // Mopidy users, and users of the proxy DB plugin, will have to force Cantata to refresh :-(
+    if (!fromFile) {
+        databaseTimeUnreliable=!dbUpdate.isValid() || dbUpdate.date().year()<2000; // See note in updatingMpd()
+    }
+    if ((!databaseTime.isValid() && !dbUpdate.isValid()) || (databaseTime.date().year()<2000 && dbUpdate.date().year()<2000)) {
+        databaseTime=QDateTime::currentDateTime();
+    }
+
+    if ((updatedListing || needToUpdate) && (!fromFile && (needToSave || needToUpdate))) {
+        toXML();
     }
 }
 
-void DirViewModel::addFileToList(const QString &file)
+void DirViewModel::updatingMpd()
+{
+    // MPD/Mopidy is being updated. If MPD's database-time is not reliable (as is the case for older proxy DBs, and Mopidy)
+    // then we set the databaseTime to NOW when updated. This means we will miss any updates. So, for these scenarios, when
+    // a users presses 'Refresh Database' in Cantata's main window, we need to reset our view of the databaseTime to null, s
+    // that we update. This does mean that we will ALWAYS fetch the whole listing - but we have n oway of knowing if it changed
+    // or not :-(
+    if (databaseTimeUnreliable) {
+        removeCache();
+    }
+}
+
+void DirViewModel::addFileToList(const QString &file, const QString &mopidyPath)
 {
     if (!enabled) {
         return;
     }
-    addFileToList(file.split('/'), QModelIndex(), rootItem);
+    addFileToList(file.split('/'), QModelIndex(), rootItem, mopidyPath);
 }
 
 void DirViewModel::removeFileFromList(const QString &file)
@@ -256,7 +478,7 @@ void DirViewModel::removeFileFromList(const QString &file)
     removeFileFromList(file.split('/'), QModelIndex(), rootItem);
 }
 
-void DirViewModel::addFileToList(const QStringList &parts, const QModelIndex &parent, DirViewItemDir *dir)
+void DirViewModel::addFileToList(const QStringList &parts, const QModelIndex &parent, DirViewItemDir *dir, const QString &mopidyPath)
 {
     if (0==parts.count()) {
         return;
@@ -267,11 +489,11 @@ void DirViewModel::addFileToList(const QStringList &parts, const QModelIndex &pa
     DirViewItem *child=dir->child(p);
     if (child) {
         if (DirViewItem::Type_Dir==child->type()) {
-            addFileToList(parts.mid(1), index(dir->indexOf(child), 0, parent), static_cast<DirViewItemDir *>(child));
+            addFileToList(parts.mid(1), index(dir->indexOf(child), 0, parent), static_cast<DirViewItemDir *>(child), mopidyPath);
         }
     } else {
         beginInsertRows(parent, dir->childCount(), dir->childCount());
-        dir->insertFile(parts);
+        dir->insertFile(parts, mopidyPath);
         endInsertRows();
     }
 }
@@ -348,6 +570,12 @@ static inline void addFile(DirViewItem *item, QStringList &insertInto, QStringLi
     }
 }
 
+
+static bool lessThan(const QString &left, const QString &right)
+{
+    return left.compare(right, Qt::CaseInsensitive) < 0;
+}
+
 void DirViewModel::getFiles(DirViewItem *item, QStringList &filenames, bool allowPlaylists) const
 {
     if (!item) {
@@ -369,7 +597,7 @@ void DirViewModel::getFiles(DirViewItem *item, QStringList &filenames, bool allo
                 }
             }
 
-            qSort(dirFiles);
+            qSort(dirFiles.begin(), dirFiles.end(), lessThan);
             filenames+=dirFiles;
         }
         default:
diff --git a/models/dirviewmodel.h b/models/dirviewmodel.h
index 62f1165..03ca195 100644
--- a/models/dirviewmodel.h
+++ b/models/dirviewmodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -28,9 +28,12 @@
 
 #include <QList>
 #include <QModelIndex>
+#include <QDateTime>
 #include "dirviewitemroot.h"
 #include "actionmodel.h"
 
+class QXmlStreamWriter;
+
 class DirViewModel : public ActionModel
 {
     Q_OBJECT
@@ -50,21 +53,29 @@ public:
     QStringList filenames(const QModelIndexList &indexes, bool allowPlaylists) const;
     QMimeData *mimeData(const QModelIndexList &indexes) const;
     void clear();
-    void addFileToList(const QString &file);
+    void addFileToList(const QString &file, const QString &mopidyPath);
     void removeFileFromList(const QString &file);
     bool isEnabled() const { return enabled; }
     void setEnabled(bool e);
+    void removeCache();
+    void toXML();
+    bool fromXML();
 
 public Q_SLOTS:
-    void updateDirView(DirViewItemRoot *newroot);
+    void updateDirView(DirViewItemRoot *newroot, const QDateTime &dbUpdate=QDateTime(), bool fromFile=false);
+    void updatingMpd();
 
 private:
-    void addFileToList(const QStringList &parts, const QModelIndex &parent, DirViewItemDir *dir);
+    void toXML(const DirViewItem *item, QXmlStreamWriter &writer);
+    quint32 fromXML(QIODevice *dev, const QDateTime &dt, DirViewItemRoot *root);
+    void addFileToList(const QStringList &parts, const QModelIndex &parent, DirViewItemDir *dir, const QString &mopidyPath);
     void removeFileFromList(const QStringList &parts, const QModelIndex &parent, DirViewItemDir *dir);
     void getFiles(DirViewItem *item, QStringList &filenames, bool allowPlaylists) const;
 
 private:
     DirViewItemRoot *rootItem;
+    QDateTime databaseTime;
+    bool databaseTimeUnreliable;
     bool enabled;
 };
 
diff --git a/models/dirviewproxymodel.cpp b/models/dirviewproxymodel.cpp
index 5d52898..8e1dd50 100644
--- a/models/dirviewproxymodel.cpp
+++ b/models/dirviewproxymodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/models/dirviewproxymodel.h b/models/dirviewproxymodel.h
index e95e5bb..0cb6214 100644
--- a/models/dirviewproxymodel.h
+++ b/models/dirviewproxymodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/models/multimusicmodel.cpp b/models/multimusicmodel.cpp
index 030e9c3..d85f51f 100644
--- a/models/multimusicmodel.cpp
+++ b/models/multimusicmodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/models/multimusicmodel.h b/models/multimusicmodel.h
index b2bb7d5..0a75fa4 100644
--- a/models/multimusicmodel.h
+++ b/models/multimusicmodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -46,7 +46,7 @@ public:
     QList<Song> songs(const QModelIndexList &indexes, bool playableOnly=false, bool fullPath=false) const;
     QStringList filenames(const QModelIndexList &indexes, bool playableOnly=false, bool fullPath=false) const;
     const QSet<QString> & genres() { return colGenres; }
-    int row(void *i) const { return collections.indexOf((MusicLibraryItemRoot *)i); }
+    int row(void *i) const { return collections.indexOf(static_cast<MusicLibraryItemRoot *>(i)); }
     void clearImages();
 
 Q_SIGNALS:
diff --git a/models/musiclibraryitem.cpp b/models/musiclibraryitem.cpp
index a1393b5..51d7b3e 100644
--- a/models/musiclibraryitem.cpp
+++ b/models/musiclibraryitem.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/models/musiclibraryitem.h b/models/musiclibraryitem.h
index 3a4ce45..4f26396 100644
--- a/models/musiclibraryitem.h
+++ b/models/musiclibraryitem.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -51,7 +51,7 @@ public:
     virtual MusicLibraryItem * childItem(int) const { return 0; }
     virtual int childCount() const { return 0; }
     int row() const;
-    void setRow(int r) { m_row=r+1; }
+    void setRow(int r) const { m_row=r+1; }
     int columnCount() const { return 1; }
     const QString & data() const { return m_itemData; }
     void setData(const QString &d) { m_itemData=d; }
diff --git a/models/musiclibraryitemalbum.cpp b/models/musiclibraryitemalbum.cpp
index 130d56f..23d477e 100644
--- a/models/musiclibraryitemalbum.cpp
+++ b/models/musiclibraryitemalbum.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -35,8 +35,10 @@
 #include "device.h"
 #include "utils.h"
 #endif
+#ifdef ENABLE_ONLINE_SERVICES
 #include "onlineservice.h"
 #include "onlineservicesmodel.h"
+#endif
 #include <QPixmap>
 #include <QApplication>
 #include <QFontMetrics>
@@ -59,13 +61,6 @@ static inline int adjust(int v)
 
 static int fontHeight=16;
 
-#ifdef CACHE_SCALED_COVERS
-static QString cacheCoverName(const QString &artist, const QString &album, int size, bool createDir=false)
-{
-    return Utils::cacheDir(Covers::constCoverDir+QString::number(size)+"/"+Covers::encodeName(artist), createDir)+Covers::encodeName(album)+".png";
-}
-#endif
-
 void MusicLibraryItemAlbum::setup()
 {
     fontHeight=QApplication::fontMetrics().height();
@@ -185,9 +180,7 @@ void MusicLibraryItemAlbum::setCoverImage(const QImage &img) const
     QImage scaled=img.scaled(QSize(size, size), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
     m_cover = new QPixmap(QPixmap::fromImage(scaled));
     m_coverIsDefault=false;
-    #ifdef CACHE_SCALED_COVERS
-    scaled.save(cacheCoverName(parentItem()->data(), data(), size, true));
-    #endif
+    Covers::saveScaledCover(scaled, parentItem()->data(), data(), size);
 }
 
 bool MusicLibraryItemAlbum::setCover(const QImage &img, bool update) const
@@ -200,7 +193,7 @@ bool MusicLibraryItemAlbum::setCover(const QImage &img, bool update) const
     return false;
 }
 
-const QPixmap & MusicLibraryItemAlbum::cover()
+const QPixmap & MusicLibraryItemAlbum::cover() const
 {
     if (m_coverIsDefault) {
         if (largeImages()) {
@@ -231,18 +224,11 @@ const QPixmap & MusicLibraryItemAlbum::cover()
         }
         m_coverIsDefault = true;
         if (Song::SingleTracks!=m_type && parentItem() && iSize && childCount()) {
-            #ifdef CACHE_SCALED_COVERS
-            QString cache=cacheCoverName(parentItem()->data(), data(), iSize);
-
-            if (QFile::exists(cache)) {
-                QImage img(cache);
-                if (!img.isNull()) {
-                    m_cover=new QPixmap(QPixmap::fromImage(img));
-                    m_coverIsDefault=false;
-                    return *m_cover;
-                }
+            m_cover=Covers::getScaledCover(parentItem()->data(), data(), iSize);
+            if (m_cover) {
+                m_coverIsDefault=false;
+                return *m_cover;
             }
-            #endif
 
             MusicLibraryItemSong *firstSong=static_cast<MusicLibraryItemSong*>(childItem(0));
             Song song;
@@ -265,13 +251,14 @@ const QPixmap & MusicLibraryItemAlbum::cover()
                 // Not showing album images in this model, so dont request any!
             }
             #ifdef ENABLE_DEVICES_SUPPORT
-            else if (root->isDevice()) {
+            else if (root && root->isDevice()) {
                 // This item is in the devices model, so get cover from device...
                 song.id=firstSong->song().id;
                 static_cast<Device *>(parentItem()->parentItem())->requestCover(song);
             }
             #endif
-            else if (root->isOnlineService()) {
+            #ifdef ENABLE_ONLINE_SERVICES
+            else if (root && root->isOnlineService()) {
                 img.img=OnlineServicesModel::self()->requestImage(static_cast<OnlineService *>(root)->id(), parentItem()->data(), data(), m_imageUrl);
                 // ONLINE: Image URL is encoded in song.name...
 //                if (!m_imageUrl.isEmpty()) {
@@ -280,7 +267,9 @@ const QPixmap & MusicLibraryItemAlbum::cover()
 //                    song.type=Song::OnlineSvrTrack;
 //                }
 //                img=Covers::self()->requestImage(song);
-            } else {
+            }
+            #endif
+            else {
                 img=Covers::self()->requestImage(song);
             }
 
@@ -428,17 +417,24 @@ bool MusicLibraryItemAlbum::detectIfIsMultipleArtists()
     }
 
     if (Song::Standard==m_type) {
-        QString artist;
         QString albumArtist;
+        QSet<QString> artists;
         foreach (MusicLibraryItem *track, m_childItems) {
-            if (artist.isEmpty()) {
-                artist=static_cast<MusicLibraryItemSong*>(track)->song().artist;
-                albumArtist=static_cast<MusicLibraryItemSong*>(track)->song().albumArtist();
-                if (artist==albumArtist) {
-                    albumArtist=QString();
+            if (albumArtist.isEmpty()) {
+                const QString &aa=static_cast<MusicLibraryItemSong*>(track)->song().albumartist;
+                if (!aa.isEmpty()) {
+                    albumArtist=aa;
                 }
-            } else if (static_cast<MusicLibraryItemSong*>(track)->song().artist!=artist &&
-                       (albumArtist.isEmpty() || !static_cast<MusicLibraryItemSong*>(track)->song().artist.startsWith(albumArtist))) {
+            }
+            artists.insert(static_cast<MusicLibraryItemSong*>(track)->song().artist);
+        }
+
+        if (1==artists.count()) {
+            return false;
+        }
+
+        foreach (MusicLibraryItem *track, m_childItems) {
+            if (!static_cast<MusicLibraryItemSong*>(track)->song().artist.startsWith(albumArtist)) {
                 m_type=Song::MultipleArtists;
                 break;
             }
@@ -462,9 +458,15 @@ bool MusicLibraryItemAlbum::updateYear()
 {
     quint32 currentYear=m_year;
     foreach (MusicLibraryItem *track, m_childItems) {
-        m_year=static_cast<MusicLibraryItemSong*>(track)->song().year;
-        if (m_year==currentYear) {
-            return false;
+        MusicLibraryItemSong *song=static_cast<MusicLibraryItemSong*>(track);
+        if (Song::Playlist!=song->song().type) {
+            m_year=song->song().year;
+            // Store which track/disc we obtained the year from!
+            m_yearOfTrack=song->track();
+            m_yearOfDisc=song->disc();
+            if (m_year==currentYear) {
+                return false;
+            }
         }
     }
     return true;
@@ -481,7 +483,7 @@ bool MusicLibraryItemAlbum::containsArtist(const QString &a)
     return m_artists.contains(a);
 }
 
-void MusicLibraryItemAlbum::clearImage()
+void MusicLibraryItemAlbum::clearImage() const
 {
     if (!m_coverIsDefault) {
         m_coverIsDefault=true;
@@ -495,7 +497,8 @@ void MusicLibraryItemAlbum::clearImage()
 
 void MusicLibraryItemAlbum::setYear(const MusicLibraryItemSong *song)
 {
-    if (m_childItems.isEmpty() || (m_yearOfDisc>song->disc() || (m_yearOfDisc==song->disc() && m_yearOfTrack>song->track()))) {
+    if (Song::Playlist!=song->song().type &&
+        (m_childItems.isEmpty() || (m_yearOfDisc>song->disc() || (m_yearOfDisc==song->disc() && m_yearOfTrack>song->track())))) {
         m_year=song->song().year;
         // Store which track/disc we obtained the year from!
         m_yearOfTrack=song->track();
diff --git a/models/musiclibraryitemalbum.h b/models/musiclibraryitemalbum.h
index 49b27da..3b54778 100644
--- a/models/musiclibraryitemalbum.h
+++ b/models/musiclibraryitemalbum.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -65,7 +65,7 @@ public:
     virtual ~MusicLibraryItemAlbum();
 
     bool setCover(const QImage &img, bool update=false) const;
-    const QPixmap & cover();
+    const QPixmap & cover() const;
     bool hasRealCover() const { return !m_coverIsDefault; }
     quint32 year() const { return m_year; }
     quint32 totalTime();
@@ -89,7 +89,7 @@ public:
     void setImageUrl(const QString &u) { m_imageUrl=u; }
     bool updateYear();
     bool containsArtist(const QString &a);
-    void clearImage();
+    void clearImage() const;
     // Return orignal album name. If we are grouping by composer, then album will appear as "Album (Artist)"
     const QString & originalName() const { return m_originalName; }
 
diff --git a/models/musiclibraryitemartist.cpp b/models/musiclibraryitemartist.cpp
index 74e3cfb..62cb89c 100644
--- a/models/musiclibraryitemartist.cpp
+++ b/models/musiclibraryitemartist.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -38,15 +38,9 @@
 #include "device.h"
 #include "utils.h"
 #endif
+#ifdef ENABLE_ONLINE_SERVICES
 #include "onlineservice.h"
 #include "onlineservicesmodel.h"
-#include <QFile>
-
-#ifdef CACHE_SCALED_COVERS
-static QString cacheCoverName(const QString &artist, int size, bool createDir=false)
-{
-    return Utils::cacheDir(Covers::constCoverDir+QString::number(size)+"/", createDir)+Covers::encodeName(artist)+".png";
-}
 #endif
 
 bool MusicLibraryItemArtist::lessThan(const MusicLibraryItem *a, const MusicLibraryItem *b)
@@ -102,16 +96,14 @@ bool MusicLibraryItemArtist::setCover(const QImage &img, bool update) const
         }
         m_cover = new QPixmap(QPixmap::fromImage(scaled));
         m_coverIsDefault=false;
-        #ifdef CACHE_SCALED_COVERS
-        scaled.save(cacheCoverName(data(), size, true));
-        #endif
+        Covers::saveScaledCover(scaled, data(), QString(), size);
         return true;
     }
 
     return false;
 }
 
-const QPixmap & MusicLibraryItemArtist::cover()
+const QPixmap & MusicLibraryItemArtist::cover() const
 {
     if (m_coverIsDefault) {
         if (largeImages()) {
@@ -135,18 +127,12 @@ const QPixmap & MusicLibraryItemArtist::cover()
             m_cover = new QPixmap(Icons::self()->variousArtistsIcon.pixmap(cSize, cSize).scaled(QSize(cSize, cSize), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
             m_coverIsDefault=false;
         } else {
-            #ifdef CACHE_SCALED_COVERS
-            QString cache=cacheCoverName(data(), iSize);
-
-            if (QFile::exists(cache)) {
-                QImage img(cache);
-                if (!img.isNull()) {
-                    m_cover=new QPixmap(QPixmap::fromImage(img));
-                    m_coverIsDefault=false;
-                    return *m_cover;
-                }
+            m_cover=Covers::getScaledCover(data(), QString(), iSize);
+            if (m_cover) {
+                m_coverIsDefault=false;
+                return *m_cover;
             }
-            #endif
+
             if (useLarge) {
                 theDefaultLargeIcon = new QPixmap(Icons::self()->artistIcon.pixmap(cSize, cSize)
                                                  .scaled(QSize(cSize, cSize), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
@@ -180,9 +166,13 @@ const QPixmap & MusicLibraryItemArtist::cover()
             //#endif
             if (root && !root->useArtistImages()) {
                 // Not showing artist images in this model, so dont request any!
-            } else if (root && root->isOnlineService()) {
+            }
+            #ifdef ENABLE_ONLINE_SERVICES
+            else if (root && root->isOnlineService()) {
                 img.img=OnlineServicesModel::self()->requestImage(static_cast<OnlineService *>(parentItem())->id(), data(), QString(), m_imageUrl);
-            } else {
+            }
+            #endif
+            else {
                 img=Covers::self()->requestImage(song);
             }
 
@@ -198,7 +188,7 @@ const QPixmap & MusicLibraryItemArtist::cover()
     return *m_cover;
 }
 
-void MusicLibraryItemArtist::clearImages()
+void MusicLibraryItemArtist::clearImages() const
 {
     if (!m_coverIsDefault) {
         m_coverIsDefault=true;
diff --git a/models/musiclibraryitemartist.h b/models/musiclibraryitemartist.h
index dbdb16f..f3eb244 100644
--- a/models/musiclibraryitemartist.h
+++ b/models/musiclibraryitemartist.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -58,11 +58,11 @@ public:
     Type itemType() const { return Type_Artist; }
     static void clearDefaultCover();
     bool setCover(const QImage &img, bool update=false) const;
-    const QPixmap & cover();
+    const QPixmap & cover() const;
     bool hasRealCover() const { return !m_coverIsDefault; }
     const QString & imageUrl() const { return m_imageUrl; }
     void setImageUrl(const QString &u) { m_imageUrl=u; }
-    void clearImages();
+    void clearImages() const;
     // 'data' could be 'Composer' if we are set to use that, but need to save real artist...
     const QString & actualArtist() const { return m_actualArtist; }
 
diff --git a/models/musiclibraryitempodcast.cpp b/models/musiclibraryitempodcast.cpp
index 3e955d5..d55948c 100644
--- a/models/musiclibraryitempodcast.cpp
+++ b/models/musiclibraryitempodcast.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -42,7 +42,6 @@
 #include <QNetworkReply>
 
 static QPixmap *theDefaultIcon=0;
-static QPixmap *theDefaultLargeIcon=0;
 
 static QLatin1String constTopTag("podcast");
 static QLatin1String constImageAttribute("img");
@@ -78,7 +77,7 @@ static QString generateFileName(const QUrl &url, bool creatingNew)
 
 MusicLibraryItemPodcast::MusicLibraryItemPodcast(const QString &fileName, MusicLibraryItemContainer *parent)
     : MusicLibraryItemContainer(QString(), parent)
-    , m_coverIsDefault(false)
+    , m_coverRequested(false)
     , m_cover(0)
     , m_fileName(fileName)
     , m_unplayedEpisodeCount(0)
@@ -239,12 +238,12 @@ void MusicLibraryItemPodcast::setCoverImage(const QImage &img) const
     int size=MusicLibraryItemAlbum::iconSize(largeImages());
     QImage scaled=img.scaled(QSize(size, size), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
     m_cover = new QPixmap(QPixmap::fromImage(scaled));
-    m_coverIsDefault=false;
+    m_coverRequested=false;
 }
 
 bool MusicLibraryItemPodcast::setCover(const QImage &img, bool update) const
 {
-    if ((update || m_coverIsDefault) && !img.isNull()) {
+    if ((update || m_coverRequested) && !img.isNull()) {
         setCoverImage(img);
         return true;
     }
@@ -252,36 +251,20 @@ bool MusicLibraryItemPodcast::setCover(const QImage &img, bool update) const
     return false;
 }
 
-const QPixmap & MusicLibraryItemPodcast::cover()
+const QPixmap & MusicLibraryItemPodcast::cover() const
 {
-    if (m_coverIsDefault) {
-        if (largeImages()) {
-            if (theDefaultLargeIcon) {
-                return *theDefaultLargeIcon;
-            }
-        } else if (theDefaultIcon) {
-            return *theDefaultIcon;
-        }
+    if (m_cover) {
+        return *m_cover;
     }
 
-    if (!m_cover) {
-        bool useLarge=largeImages();
-        int iSize=MusicLibraryItemAlbum::iconSize(useLarge);
+    int iSize=MusicLibraryItemAlbum::iconSize(largeImages());
+    int cSize=iSize;
+    if (0==cSize) {
+        cSize=22;
+    }
 
-        if ((useLarge && !theDefaultLargeIcon) || (!useLarge && !theDefaultIcon)) {
-            int cSize=iSize;
-            if (0==cSize) {
-                cSize=22;
-            }
-            if (useLarge) {
-                theDefaultLargeIcon = new QPixmap(Icons::self()->podcastIcon.pixmap(cSize, cSize)
-                                                 .scaled(QSize(cSize, cSize), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
-            } else {
-                theDefaultIcon = new QPixmap(Icons::self()->podcastIcon.pixmap(cSize, cSize)
-                                            .scaled(QSize(cSize, cSize), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
-            }
-        }
-        m_coverIsDefault = true;
+    if (!m_cover && !m_coverRequested) {
+        m_coverRequested = true;
         QImage img=OnlineServicesModel::self()->requestImage(static_cast<OnlineService *>(parentItem())->id(), data(), QString(), m_imageUrl.toString(), // ??
                                                              m_imageFile, 300);
 
@@ -289,10 +272,16 @@ const QPixmap & MusicLibraryItemPodcast::cover()
             setCoverImage(img);
             return *m_cover;
         }
-        return useLarge ? *theDefaultLargeIcon : *theDefaultIcon;
     }
 
-    return *m_cover;
+    if (!theDefaultIcon || theDefaultIcon->width()!=cSize) {
+        if (theDefaultIcon) {
+            delete theDefaultIcon;
+        }
+        theDefaultIcon = new QPixmap(Icons::self()->podcastIcon.pixmap(cSize, cSize)
+                                     .scaled(QSize(cSize, cSize), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
+    }
+    return *theDefaultIcon;
 }
 
 void MusicLibraryItemPodcast::remove(int row)
@@ -309,15 +298,11 @@ void MusicLibraryItemPodcast::remove(MusicLibraryItemSong *i)
     }
 }
 
-void MusicLibraryItemPodcast::clearImage()
+void MusicLibraryItemPodcast::clearImage() const
 {
-    if (!m_coverIsDefault) {
-        m_coverIsDefault=true;
+    if (m_cover) {
         delete m_cover;
         m_cover=0;
-        if (theDefaultIcon) {
-            m_cover=theDefaultIcon;
-        }
     }
 }
 
diff --git a/models/musiclibraryitempodcast.h b/models/musiclibraryitempodcast.h
index 02bb0d2..e229a52 100644
--- a/models/musiclibraryitempodcast.h
+++ b/models/musiclibraryitempodcast.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -59,14 +59,13 @@ public:
     RssStatus loadRss(QNetworkReply *dev);
     bool save();
     bool setCover(const QImage &img, bool update=false) const;
-    const QPixmap & cover();
-    bool hasRealCover() const { return !m_coverIsDefault; }
+    const QPixmap & cover() const;
     void remove(int row);
     void remove(MusicLibraryItemSong *i);
     Type itemType() const { return Type_Podcast; }
     const QUrl & imageUrl() const { return m_imageUrl; }
     void setImageUrl(const QString &u) { m_imageUrl=u; }
-    void clearImage();
+    void clearImage() const;
     const QUrl & rssUrl() const { return m_rssUrl; }
     void removeFiles();
     void setUnplayedCount();
@@ -81,7 +80,7 @@ private:
     void updateStats();
 
 private:
-    mutable bool m_coverIsDefault;
+    mutable bool m_coverRequested;
     mutable QPixmap *m_cover;
     QUrl m_imageUrl;
     QUrl m_rssUrl;
diff --git a/models/musiclibraryitemroot.cpp b/models/musiclibraryitemroot.cpp
index 2a1bad6..1378343 100644
--- a/models/musiclibraryitemroot.cpp
+++ b/models/musiclibraryitemroot.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -75,10 +75,9 @@ void MusicLibraryItemRoot::groupSingleTracks()
     for (; it!=m_childItems.end(); ) {
         if (various!=(*it) && static_cast<MusicLibraryItemArtist *>(*it)->allSingleTrack()) {
             if (!various) {
-                QString artist=i18n("Various Artists");
-                QHash<QString, int>::ConstIterator it=m_indexes.find(artist);
+                QHash<QString, int>::ConstIterator it=m_indexes.find(Song::variousArtists());
                 if (m_indexes.end()==it) {
-                    various=new MusicLibraryItemArtist(artist, QString(), this);
+                    various=new MusicLibraryItemArtist(Song::variousArtists(), QString(), this);
                     created=true;
                 } else {
                     various=static_cast<MusicLibraryItemArtist *>(m_childItems.at(*it));
@@ -114,20 +113,19 @@ void MusicLibraryItemRoot::groupMultipleArtists()
     QList<MusicLibraryItem *>::iterator it=m_childItems.begin();
     MusicLibraryItemArtist *various=0;
     bool created=false;
-    QString va=i18n("Various Artists");
-    bool checkDiffVaString=va!=QLatin1String("Various Artists");
+    bool checkDiffVaString=Song::variousArtists()!=QLatin1String("Various Artists");
 
     // When grouping multiple artists - if 'Various Artists' is spelt different in curernt language, then we also need to place
     // items by 'Various Artists' into i18n('Various Artists')
     for (; it!=m_childItems.end(); ) {
         if (various!=(*it) && (!static_cast<MusicLibraryItemArtist *>(*it)->isVarious() ||
-                               (checkDiffVaString && static_cast<MusicLibraryItemArtist *>(*it)->isVarious() && va!=(*it)->data())) ) {
+                               (checkDiffVaString && static_cast<MusicLibraryItemArtist *>(*it)->isVarious() && Song::variousArtists()!=(*it)->data())) ) {
             QList<MusicLibraryItem *> mutipleAlbums=static_cast<MusicLibraryItemArtist *>(*it)->mutipleArtistAlbums();
             if (mutipleAlbums.count()) {
                 if (!various) {
-                    QHash<QString, int>::ConstIterator it=m_indexes.find(va);
+                    QHash<QString, int>::ConstIterator it=m_indexes.find(Song::variousArtists());
                     if (m_indexes.end()==it) {
-                        various=new MusicLibraryItemArtist(va, QString(), this);
+                        various=new MusicLibraryItemArtist(Song::variousArtists(), QString(), this);
                         created=true;
                     } else {
                         various=static_cast<MusicLibraryItemArtist *>(m_childItems.at(*it));
@@ -168,7 +166,7 @@ void MusicLibraryItemRoot::groupMultipleArtists()
 bool MusicLibraryItemRoot::isFromSingleTracks(const Song &s) const
 {
     if (!isFlat && (supportsAlbumArtist && !s.file.isEmpty())) {
-        QHash<QString, int>::ConstIterator it=m_indexes.find(i18n("Various Artists"));
+        QHash<QString, int>::ConstIterator it=m_indexes.find(Song::variousArtists());
 
         if (m_indexes.end()!=it) {
             return static_cast<MusicLibraryItemArtist *>(m_childItems.at(*it))->isFromSingleTracks(s);
@@ -256,7 +254,7 @@ void MusicLibraryItemRoot::getDetails(QSet<QString> &artists, QSet<QString> &alb
             if (!s.genre.isEmpty()) {
                 genres.insert(s.genre);
             }
-        } else {
+        } else if (MusicLibraryItem::Type_Artist==child->itemType()) {
             foreach (const MusicLibraryItem *album, static_cast<const MusicLibraryItemContainer *>(child)->childItems()) {
                 foreach (const MusicLibraryItem *song, static_cast<const MusicLibraryItemContainer *>(album)->childItems()) {
                     const Song &s=static_cast<const MusicLibraryItemSong *>(song)->song();
@@ -296,14 +294,14 @@ void MusicLibraryItemRoot::updateSongFile(const Song &from, const Song &to)
 static quint32 constVersion=8;
 static QLatin1String constTopTag("CantataLibrary");
 
-void MusicLibraryItemRoot::toXML(const QString &filename, const QDateTime &date, MusicLibraryProgressMonitor *prog) const
+void MusicLibraryItemRoot::toXML(const QString &filename, const QDateTime &date, bool dateUnreliable, MusicLibraryProgressMonitor *prog) const
 {
     if (isFlat) {
         return;
     }
 
     // If saving device cache, and we have NO items, then remove cache file...
-    if (0==childCount() && date==QDateTime()) {
+    if (0==childCount() && date.date().year()<2000) {
         if (QFile::exists(filename)) {
             QFile::remove(filename);
         }
@@ -318,7 +316,7 @@ void MusicLibraryItemRoot::toXML(const QString &filename, const QDateTime &date,
     }
 
     QXmlStreamWriter writer(&compressor);
-    toXML(writer, date, prog);
+    toXML(writer, date, dateUnreliable, prog);
     compressor.close();
 }
 
@@ -340,6 +338,7 @@ static const QString constFileAttribute=QLatin1String("file");
 static const QString constPlaylistAttribute=QLatin1String("playlist");
 static const QString constGuessedAttribute=QLatin1String("guessed");
 static const QString constDateAttribute=QLatin1String("date");
+static const QString constDateUnreliableAttribute=QLatin1String("dateUnreliable");
 static const QString constVersionAttribute=QLatin1String("version");
 static const QString constGroupSingleAttribute=QLatin1String("groupSingle");
 static const QString constGroupMultipleAttribute=QLatin1String("groupMultiple");
@@ -350,7 +349,7 @@ static const QString constImageAttribute=QLatin1String("img");
 static const QString constnumTracksAttribute=QLatin1String("numTracks");
 static const QString constTrueValue=QLatin1String("true");
 
-void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date, MusicLibraryProgressMonitor *prog) const
+void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date, bool dateUnreliable, MusicLibraryProgressMonitor *prog) const
 {
     if (isFlat) {
         return;
@@ -359,12 +358,14 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
     quint64 total=0;
     quint64 count=0;
     writer.writeStartDocument();
-    QString unknown=i18n("Unknown");
 
     //Start with the document
     writer.writeStartElement(constTopTag);
     writer.writeAttribute(constVersionAttribute, QString::number(constVersion));
     writer.writeAttribute(constDateAttribute, QString::number(date.toTime_t()));
+    if (dateUnreliable) {
+        writer.writeAttribute(constDateUnreliableAttribute, constTrueValue);
+    }
     if (MPDParseUtils::groupSingle()) {
         writer.writeAttribute(constGroupSingleAttribute, constTrueValue);
     }
@@ -407,7 +408,7 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
             writer.writeStartElement(constAlbumElement);
             writer.writeAttribute(constNameAttribute, album->originalName().isEmpty() ? album->data() : album->originalName());
             writer.writeAttribute(constYearAttribute, QString::number(album->year()));
-            if (!albumGenre.isEmpty() && albumGenre!=unknown) {
+            if (!albumGenre.isEmpty() && albumGenre!=Song::unknown()) {
                 writer.writeAttribute(constGenreAttribute, albumGenre);
             }
             if (album->isSingleTracks()) {
@@ -449,7 +450,7 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
                     writer.writeAttribute(constComposerAttribute, track->song().composer);
                 }
 //                 writer.writeAttribute("id", QString::number(track->song().id));
-                if (!track->song().genre.isEmpty() && track->song().genre!=albumGenre && track->song().genre!=unknown) {
+                if (!track->song().genre.isEmpty() && track->song().genre!=albumGenre && track->song().genre!=Song::unknown()) {
                     writer.writeAttribute(constGenreAttribute, track->song().genre);
                 }
                 if (album->isSingleTracks()) {
@@ -480,7 +481,7 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
     writer.writeEndDocument();
 }
 
-quint32 MusicLibraryItemRoot::fromXML(const QString &filename, const QDateTime &date, const QString &baseFolder, MusicLibraryProgressMonitor *prog)
+quint32 MusicLibraryItemRoot::fromXML(const QString &filename, const QDateTime &date, bool *dateUnreliable, const QString &baseFolder, MusicLibraryProgressMonitor *prog)
 {
     if (isFlat) {
         return 0;
@@ -497,9 +498,8 @@ quint32 MusicLibraryItemRoot::fromXML(const QString &filename, const QDateTime &
     if (!compressor.open(QIODevice::ReadOnly)) {
         return 0;
     }
-
     QXmlStreamReader reader(&compressor);
-    quint32 rv=fromXML(reader, date, baseFolder, prog);
+    quint32 rv=fromXML(reader, date, dateUnreliable, baseFolder, prog);
     compressor.close();
     #ifdef TIME_XML_FILE_LOADING
     qWarning() << filename << timer.elapsed();
@@ -507,7 +507,7 @@ quint32 MusicLibraryItemRoot::fromXML(const QString &filename, const QDateTime &
     return rv;
 }
 
-quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime &date, const QString &baseFolder, MusicLibraryProgressMonitor *prog)
+quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime &date, bool *dateUnreliable, const QString &baseFolder, MusicLibraryProgressMonitor *prog)
 {
     if (isFlat) {
         return 0;
@@ -517,7 +517,6 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime
     MusicLibraryItemAlbum *albumItem = 0;
     Song song;
     quint32 xmlDate=0;
-    QString unknown=i18n("Unknown");
     quint64 total=0;
     quint64 count=0;
     bool gs=MPDParseUtils::groupSingle();
@@ -542,13 +541,15 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime
                 gs = constTrueValue==attributes.value(constGroupSingleAttribute).toString();
                 gm = constTrueValue==attributes.value(constGroupMultipleAttribute).toString();
                 bool uc = constTrueValue==attributes.value(constUseComposerAttribute).toString();
-
                 if ( version < constVersion || uc!=Song::useComposer() || (date.isValid() && xmlDate < date.toTime_t())) {
                     return 0;
                 }
                 if (prog) {
                     total=attributes.value(constnumTracksAttribute).toString().toUInt();
                 }
+                if (dateUnreliable) {
+                    *dateUnreliable=constTrueValue==attributes.value(constDateUnreliableAttribute).toString();
+                }
             } else if (constArtistElement==element) {
                 QString actual=attributes.value(constActualAttribute).toString();
                 song.type=Song::Standard;
@@ -601,7 +602,7 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime
                     QString genre=attributes.value(constGenreAttribute).toString();
                     if (genre.isEmpty() ) {
                         if (song.genre.isEmpty()) {
-                            song.genre=unknown;
+                            song.genre=Song::unknown();
                         }
                     } else {
                         song.genre=genre;
@@ -805,7 +806,7 @@ const MusicLibraryItem * MusicLibraryItemRoot::findSong(const Song &s) const
             }
         }
     } else {
-        MusicLibraryItemArtist *artistItem = ((MusicLibraryItemRoot *)this)->artist(s, false);
+        MusicLibraryItemArtist *artistItem = const_cast<MusicLibraryItemRoot *>(this)->artist(s, false);
         if (artistItem) {
             MusicLibraryItemAlbum *albumItem = artistItem->album(s, false);
             if (albumItem) {
@@ -830,7 +831,7 @@ bool MusicLibraryItemRoot::songExists(const Song &s) const
 
     if (!s.isVariousArtists()) {
         Song mod(s);
-        mod.albumartist=i18n("Various Artists");
+        mod.albumartist=Song::variousArtists();
         if (MPDParseUtils::groupMultiple()) {
             song=findSong(mod);
             if (song) {
@@ -1011,10 +1012,10 @@ void MusicLibraryItemRoot::clearImages()
 
 QString MusicLibraryItemRoot::artistName(const Song &s)
 {
-    if (Song::Standard==s.type || (Song::Playlist==s.type && !s.albumArtist().isEmpty())) {
+    if (Song::Standard==s.type || Song::Cdda==s.type || Song::OnlineSvrTrack==s.type || (Song::Playlist==s.type && !s.albumArtist().isEmpty())) {
         return s.artistOrComposer();
     }
-    return i18n("Various Artists");
+    return Song::variousArtists();
 }
 
 QString MusicLibraryItemRoot::songArtist(const Song &s) const
diff --git a/models/musiclibraryitemroot.h b/models/musiclibraryitemroot.h
index e20da9c..e24276d 100644
--- a/models/musiclibraryitemroot.h
+++ b/models/musiclibraryitemroot.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -84,13 +84,13 @@ public:
     QSet<Song> allSongs(bool revertVa=false) const;
     void getDetails(QSet<QString> &artists, QSet<QString> &albumArtists, QSet<QString> &composers, QSet<QString> &albums, QSet<QString> &genres);
     void updateSongFile(const Song &from, const Song &to);
-    void toXML(const QString &filename, const QDateTime &date=QDateTime(), MusicLibraryProgressMonitor *prog=0) const;
-    void toXML(QXmlStreamWriter &writer, const QDateTime &date=QDateTime(), MusicLibraryProgressMonitor *prog=0) const;
-    quint32 fromXML(const QString &filename, const QDateTime &date=QDateTime(), const QString &baseFolder=QString(), MusicLibraryProgressMonitor *prog=0);
-    quint32 fromXML(QXmlStreamReader &reader, const QDateTime &date=QDateTime(), const QString &baseFolder=QString(), MusicLibraryProgressMonitor *prog=0);
+    void toXML(const QString &filename, const QDateTime &date=QDateTime(), bool dateUnreliable=false, MusicLibraryProgressMonitor *prog=0) const;
+    void toXML(QXmlStreamWriter &writer, const QDateTime &date=QDateTime(), bool dateUnreliable=false, MusicLibraryProgressMonitor *prog=0) const;
+    quint32 fromXML(const QString &filename, const QDateTime &date=QDateTime(), bool *dateUnreliable=0, const QString &baseFolder=QString(), MusicLibraryProgressMonitor *prog=0);
+    quint32 fromXML(QXmlStreamReader &reader, const QDateTime &date=QDateTime(), bool *dateUnreliable=0, const QString &baseFolder=QString(), MusicLibraryProgressMonitor *prog=0);
     Type itemType() const { return Type_Root; }
     void add(const QSet<Song> &songs);
-    bool supportsAlbumArtistTag() { return supportsAlbumArtist; }
+    bool supportsAlbumArtistTag() const { return supportsAlbumArtist; }
     void setSupportsAlbumArtistTag(bool s) { supportsAlbumArtist=s; }
     bool useAlbumImages() const { return albumImages; }
     void setUseAlbumImages(bool a) { albumImages=a; }
diff --git a/models/musiclibraryitemsong.h b/models/musiclibraryitemsong.h
index 882f429..b758b63 100644
--- a/models/musiclibraryitemsong.h
+++ b/models/musiclibraryitemsong.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/models/musiclibrarymodel.cpp b/models/musiclibrarymodel.cpp
index 07feb0e..cd88176 100644
--- a/models/musiclibrarymodel.cpp
+++ b/models/musiclibrarymodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -119,32 +119,33 @@ void MusicLibraryModel::convertCache(const QString &compressedName)
     }
 }
 
-void MusicLibraryModel::cleanCache()
-{
-    QSet<QString> existing;
-    QList<MPDConnectionDetails> connections=Settings::self()->allConnections();
-    foreach (const MPDConnectionDetails &conn, connections) {
-        QString withPort=cacheFileName(conn);
-        QString withoutPort=cacheFileName(conn, false);
-        if (withPort!=withoutPort) {
-            existing.insert(withoutPort);
-        }
-        existing.insert(withPort);
-    }
-    QDir dir(Utils::cacheDir(constLibraryCache));
-    QFileInfoList files=dir.entryInfoList(QStringList() << "*"+constLibraryExt << "*"+constLibraryCompressedExt, QDir::Files);
-    foreach (const QFileInfo &file, files) {
-        if (!existing.contains(file.fileName())) {
-            QFile::remove(file.absoluteFilePath());
-        }
-    }
-}
+//void MusicLibraryModel::cleanCache()
+//{
+//    QSet<QString> existing;
+//    QList<MPDConnectionDetails> connections=Settings::self()->allConnections();
+//    foreach (const MPDConnectionDetails &conn, connections) {
+//        QString withPort=cacheFileName(conn);
+//        QString withoutPort=cacheFileName(conn, false);
+//        if (withPort!=withoutPort) {
+//            existing.insert(withoutPort);
+//        }
+//        existing.insert(withPort);
+//    }
+//    QDir dir(Utils::cacheDir(constLibraryCache));
+//    QFileInfoList files=dir.entryInfoList(QStringList() << "*"+constLibraryExt << "*"+constLibraryCompressedExt, QDir::Files);
+//    foreach (const QFileInfo &file, files) {
+//        if (!existing.contains(file.fileName())) {
+//            QFile::remove(file.absoluteFilePath());
+//        }
+//    }
+//}
 
 MusicLibraryModel::MusicLibraryModel(QObject *parent, bool isMpdModel, bool isCheckable)
     : MusicModel(parent)
     , mpdModel(isMpdModel)
     , checkable(isCheckable)
     , rootItem(new MusicLibraryItemRoot)
+    , databaseTimeUnreliable(false)
 {
     if (mpdModel)
     {
@@ -154,6 +155,7 @@ MusicLibraryModel::MusicLibraryModel(QObject *parent, bool isMpdModel, bool isCh
                 this, SLOT(setCover(const Song &, const QImage &, const QString &)));
         connect(Covers::self(), SIGNAL(coverUpdated(const Song &, const QImage &, const QString &)),
                 this, SLOT(updateCover(const Song &, const QImage &, const QString &)));
+        connect(MPDConnection::self(), SIGNAL(updatingDatabase()), this, SLOT(updatingMpd()));
         connect(MPDConnection::self(), SIGNAL(musicLibraryUpdated(MusicLibraryItemRoot *, QDateTime)),
                 this, SLOT(updateMusicLibrary(MusicLibraryItemRoot *, QDateTime)));
     }
@@ -439,14 +441,13 @@ void MusicLibraryModel::updateMusicLibrary(MusicLibraryItemRoot *newroot, QDateT
         incremental=false;
     }
 
+    databaseTime = dbUpdate;
     if (incremental) {
         updatedSongs=update(newroot->allSongs());
         delete newroot;
-        databaseTime = dbUpdate;
     } else {
         const MusicLibraryItemRoot *oldRoot = rootItem;
         beginResetModel();
-        databaseTime = dbUpdate;
         rootItem = newroot;
         rootItem->setModel(this);
         rootItem->setLargeImages(oldRoot->useLargeImages());
@@ -457,23 +458,39 @@ void MusicLibraryModel::updateMusicLibrary(MusicLibraryItemRoot *newroot, QDateT
         updatedSongs=true;
     }
 
-    // MPD proxy DB plugin does not provide a datetime for the DB. Therefore, just use current datetime
-    // so that we dont keep requesting DB listing each time Cantata starts...
-    //
-    // Users of this plugin will have to force Cantata to refresh :-(
+    // MPD proxy DB plugin (MPD < 0.18.5) does not provide a datetime for the DB. Also, Mopidy
+    // returns 0 for the database time (which equates to 1am Jan 1st 1970!). Therefore, in these
+    // cases we just use current datetime so that we dont keep requesting DB listing each time
+    // Cantata starts...
     //
-    if (!databaseTime.isValid() && !dbUpdate.isValid()) {
+    // Mopidy users, and users of the proxy DB plugin, will have to force Cantata to refresh :-(
+    if (!fromFile) {
+        databaseTimeUnreliable=!dbUpdate.isValid() || dbUpdate.date().year()<2000; // See note in updatingMpd()
+    }
+    if ((!databaseTime.isValid() && !dbUpdate.isValid()) || (databaseTime.date().year()<2000 && dbUpdate.date().year()<2000)) {
         databaseTime=QDateTime::currentDateTime();
     }
 
     if ((updatedSongs || needToUpdate) && (!fromFile && (needToSave || needToUpdate))) {
-        rootItem->toXML(cacheFileName(), databaseTime);
+        rootItem->toXML(cacheFileName(), databaseTime, databaseTimeUnreliable);
     }
 
     AlbumsModel::self()->update(rootItem);
     emit updateGenres(rootItem->genres());
 }
 
+void MusicLibraryModel::updatingMpd()
+{
+    // MPD/Mopidy is being updated. If MPD's database-time is not reliable (as is the case for older proxy DBs, and Mopidy)
+    // then we set the databaseTime to NOW when updated. This means we will miss any updates. So, for these scenarios, when
+    // a users presses 'Refresh Database' in Cantata's main window, we need to reset our view of the databaseTime to null, s
+    // that we update. This does mean that we will ALWAYS fetch the whole listing - but we have n oway of knowing if it changed
+    // or not :-(
+    if (databaseTimeUnreliable) {
+        removeCache();
+    }
+}
+
 bool MusicLibraryModel::update(const QSet<Song> &songs)
 {
     bool updatedSongs=rootItem->update(songs);
@@ -531,45 +548,45 @@ bool MusicLibraryModel::update(const QSet<Song> &songs)
     return updatedSongs;
 }
 
-void MusicLibraryModel::uncheckAll()
-{
-    if (!checkable) {
-        return;
-    }
-
-    foreach (MusicLibraryItem *artist, rootItem->childItems()) {
-        MusicLibraryItemArtist *artistItem=static_cast<MusicLibraryItemArtist *>(artist);
-        QModelIndex artistIndex=index(artistItem->row(), 0, QModelIndex());
-
-        foreach (MusicLibraryItem *album, artistItem->childItems()) {
-            MusicLibraryItemAlbum *albumItem=static_cast<MusicLibraryItemAlbum *>(album);
-            QModelIndex albumIndex=index(albumItem->row(), 0, artistIndex);
-
-            foreach (MusicLibraryItem *song, albumItem->childItems()) {
-                if (Qt::Unchecked!=song->checkState()) {
-                    song->setCheckState(Qt::Unchecked);
-                    QModelIndex songIndex=index(song->row(), 0, albumIndex);
-                    emit dataChanged(songIndex, songIndex);
-                }
-            }
-            if (Qt::Unchecked!=albumItem->checkState()) {
-                albumItem->setCheckState(Qt::Unchecked);
-                emit dataChanged(albumIndex, albumIndex);
-            }
-        }
-        if (Qt::Unchecked!=artistItem->checkState()) {
-            artistItem->setCheckState(Qt::Unchecked);
-            emit dataChanged(artistIndex, artistIndex);
-        }
-    }
-    emit checkedSongs(QSet<Song>());
-}
+//void MusicLibraryModel::uncheckAll()
+//{
+//    if (!checkable) {
+//        return;
+//    }
+
+//    foreach (MusicLibraryItem *artist, rootItem->childItems()) {
+//        MusicLibraryItemArtist *artistItem=static_cast<MusicLibraryItemArtist *>(artist);
+//        QModelIndex artistIndex=index(artistItem->row(), 0, QModelIndex());
+
+//        foreach (MusicLibraryItem *album, artistItem->childItems()) {
+//            MusicLibraryItemAlbum *albumItem=static_cast<MusicLibraryItemAlbum *>(album);
+//            QModelIndex albumIndex=index(albumItem->row(), 0, artistIndex);
+
+//            foreach (MusicLibraryItem *song, albumItem->childItems()) {
+//                if (Qt::Unchecked!=song->checkState()) {
+//                    song->setCheckState(Qt::Unchecked);
+//                    QModelIndex songIndex=index(song->row(), 0, albumIndex);
+//                    emit dataChanged(songIndex, songIndex);
+//                }
+//            }
+//            if (Qt::Unchecked!=albumItem->checkState()) {
+//                albumItem->setCheckState(Qt::Unchecked);
+//                emit dataChanged(albumIndex, albumIndex);
+//            }
+//        }
+//        if (Qt::Unchecked!=artistItem->checkState()) {
+//            artistItem->setCheckState(Qt::Unchecked);
+//            emit dataChanged(artistIndex, artistIndex);
+//        }
+//    }
+//    emit checkedSongs(QSet<Song>());
+//}
 
 void MusicLibraryModel::toggleGrouping()
 {
     beginResetModel();
     rootItem->toggleGrouping();
-    rootItem->toXML(cacheFileName(), databaseTime);
+    rootItem->toXML(cacheFileName(), databaseTime, databaseTimeUnreliable);
     endResetModel();
     if (mpdModel) {
         AlbumsModel::self()->update(rootItem);
@@ -663,7 +680,7 @@ void MusicLibraryModel::setCover(const Song &song, const QImage &img, const QStr
 {
     Q_UNUSED(file)
     if (!rootItem->useAlbumImages() || img.isNull() || MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize() ||
-        song.file.startsWith("http:/") || song.name.startsWith("http:/")) {
+        song.isCdda() || song.file.startsWith("http:/") || song.name.startsWith("http:/")) {
         return;
     }
 
@@ -697,12 +714,11 @@ bool MusicLibraryModel::fromXML()
 
     convertCache(cacheFileName());
     MusicLibraryItemRoot *root=new MusicLibraryItemRoot;
-    quint32 date=root->fromXML(cacheFileName(), MPDStats::self()->dbUpdate());
+    quint32 date=root->fromXML(cacheFileName(), MPDStats::self()->dbUpdate(), &databaseTimeUnreliable);
     if (!date) {
         delete root;
         return false;
     }
-
     QDateTime dt;
     dt.setTime_t(date);
     updateMusicLibrary(root, dt, true);
diff --git a/models/musiclibrarymodel.h b/models/musiclibrarymodel.h
index 345adc3..b5a253c 100644
--- a/models/musiclibrarymodel.h
+++ b/models/musiclibrarymodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -50,7 +50,7 @@ public:
     static MusicLibraryModel * self();
 
     static void convertCache(const QString &compressedName);
-    static void cleanCache();
+//    static void cleanCache();
 
     MusicLibraryModel(QObject *parent=0, bool isMpdModel=true, bool isCheckable=false);
     ~MusicLibraryModel();
@@ -83,7 +83,7 @@ public:
         { rootItem->getDetails(artists, albumArtists, composers, albums, genres); }
     QSet<QString> getAlbumArtists();
     bool update(const QSet<Song> &songs);
-    void uncheckAll();
+//    void uncheckAll();
     bool useAlbumImages() const { return rootItem->useAlbumImages(); }
     void setUseAlbumImages(bool a) { rootItem->setUseAlbumImages(a); }
     bool useArtistImages() const { return rootItem->useArtistImages(); }
@@ -104,6 +104,7 @@ public Q_SLOTS:
     void setArtistImage(const Song &song, const QImage &img, bool update=false);
     void setCover(const Song &song, const QImage &img, const QString &file);
     void updateCover(const Song &song, const QImage &img, const QString &file);
+    void updatingMpd();
 
 Q_SIGNALS:
 //     void updated(const MusicLibraryItemRoot *root);
@@ -119,6 +120,7 @@ private:
     bool checkable;
     MusicLibraryItemRoot *rootItem;
     QDateTime databaseTime;
+    bool databaseTimeUnreliable;
 };
 
 #endif
diff --git a/models/musiclibraryproxymodel.cpp b/models/musiclibraryproxymodel.cpp
index ee3bf11..ad4e81f 100644
--- a/models/musiclibraryproxymodel.cpp
+++ b/models/musiclibraryproxymodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/models/musiclibraryproxymodel.h b/models/musiclibraryproxymodel.h
index b7aecbd..4e5870d 100644
--- a/models/musiclibraryproxymodel.h
+++ b/models/musiclibraryproxymodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/models/musicmodel.cpp b/models/musicmodel.cpp
index 3ebac49..e80e6b2 100644
--- a/models/musicmodel.cpp
+++ b/models/musicmodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -21,13 +21,16 @@
  * Boston, MA 02110-1301, USA.
  */
 
+#include "config.h"
 #include "musiclibraryitemalbum.h"
 #include "musiclibraryitemartist.h"
 #include "musiclibraryitemsong.h"
 #include "musiclibraryitemroot.h"
+#ifdef ENABLE_ONLINE_SERVICES
 #include "musiclibraryitempodcast.h"
-#include "musicmodel.h"
 #include "onlineservice.h"
+#endif
+#include "musicmodel.h"
 #include "itemview.h"
 #include "localize.h"
 #include "qtplural.h"
@@ -106,12 +109,14 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
             MusicLibraryItemArtist *artist = static_cast<MusicLibraryItemArtist *>(item);
             return artist->isVarious() ? Icons::self()->variousArtistsIcon : Icons::self()->artistIcon;
         }
+        #ifdef ENABLE_ONLINE_SERVICES
         case MusicLibraryItem::Type_Podcast:
             if (MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize()) {
                 return Icons::self()->podcastIcon;
             } else {
                 return static_cast<MusicLibraryItemPodcast *>(item)->cover();
             }
+        #endif
         case MusicLibraryItem::Type_Album:
             if (MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize() || !root(item)->useAlbumImages()) {
                 return Icons::self()->albumIcon;
@@ -133,9 +138,11 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
             if (static_cast<MusicLibraryItemAlbum *>(song->parentItem())->isSingleTracks()) {
                 return song->song().artistSong();
             }
+            #ifdef ENABLE_ONLINE_SERVICES
             if (MusicLibraryItem::Type_Podcast==song->parentItem()->itemType()) {
                 return item->data();
             }
+            #endif
             return song->song().trackAndTitleStr(static_cast<MusicLibraryItemArtist *>(song->parentItem()->parentItem())->isVarious() &&
                                                  !Song::isVariousArtists(song->song().artist));
         } else if (MusicLibraryItem::Type_Album==item->itemType() && MusicLibraryItemAlbum::showDate() &&
@@ -145,6 +152,7 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
         return item->data();
     case Qt::ToolTipRole:
         if (MusicLibraryItem::Type_Song==item->itemType()) {
+            #ifdef ENABLE_ONLINE_SERVICES
             if (MusicLibraryItem::Type_Podcast==item->parentItem()->itemType()) {
                 return parentData(item)+data(index, Qt::DisplayRole).toString()+QLatin1String("<br/>")+
                        Song::formattedTime(static_cast<MusicLibraryItemSong *>(item)->time(), true)+
@@ -154,9 +162,10 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
                 return parentData(item)+data(index, Qt::DisplayRole).toString()+QLatin1String("<br/>")+
                        Song::formattedTime(static_cast<MusicLibraryItemSong *>(item)->time(), true);
             }
+            #endif
             return parentData(item)+data(index, Qt::DisplayRole).toString()+QLatin1String("<br/>")+
                    Song::formattedTime(static_cast<MusicLibraryItemSong *>(item)->time(), true)+
-                   QLatin1String("<br/><small><i>")+static_cast<MusicLibraryItemSong *>(item)->song().file+QLatin1String("</i></small>");
+                   QLatin1String("<br/><small><i>")+static_cast<MusicLibraryItemSong *>(item)->song().filePath()+QLatin1String("</i></small>");
         }
         return parentData(item)+
                 (0==item->childCount()
@@ -217,15 +226,24 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
         QVariant v;
         switch (item->itemType()) {
         case MusicLibraryItem::Type_Album:
-            v.setValue<QPixmap>(static_cast<MusicLibraryItemAlbum *>(item)->cover());
-            break;
+            if (MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize()) {
+                return Icons::self()->albumIcon;
+            } else {
+                return static_cast<MusicLibraryItemAlbum *>(item)->cover();
+            }
         case MusicLibraryItem::Type_Artist:
             if (static_cast<MusicLibraryItemRoot *>(item->parentItem())->useArtistImages()) {
-                v.setValue<QPixmap>(static_cast<MusicLibraryItemArtist *>(item)->cover());
+                return static_cast<MusicLibraryItemArtist *>(item)->cover();
             }
             break;
+        #ifdef ENABLE_ONLINE_SERVICES
         case MusicLibraryItem::Type_Podcast:
-            v.setValue<QPixmap>(static_cast<MusicLibraryItemPodcast *>(item)->cover());
+            if (MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize()) {
+                return Icons::self()->podcastIcon;
+            } else {
+                return static_cast<MusicLibraryItemPodcast *>(item)->cover();
+            }
+        #endif
         default:
             break;
         }
diff --git a/models/musicmodel.h b/models/musicmodel.h
index 50a8996..7118077 100644
--- a/models/musicmodel.h
+++ b/models/musicmodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/models/onlineservicesmodel.cpp b/models/onlineservicesmodel.cpp
index 2a61a4a..3402bb3 100644
--- a/models/onlineservicesmodel.cpp
+++ b/models/onlineservicesmodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -447,6 +447,20 @@ void OnlineServicesModel::cancelAll()
     podcast->cancelAllJobs();
 }
 
+void OnlineServicesModel::resetModel()
+{
+    OnlineService *srv=service(PodcastService::constName);
+    if (srv) {
+        foreach (MusicLibraryItem *p, srv->childItems()) {
+            if (MusicLibraryItem::Type_Podcast==p->itemType()) {
+                MusicLibraryItemPodcast *pc=static_cast<MusicLibraryItemPodcast *>(p);
+                pc->clearImage();
+            }
+        }
+    }
+    ActionModel::resetModel();
+}
+
 static const char * constExtensions[]={".jpg", ".png", 0};
 static const char * constIdProperty="id";
 static const char * constArtistProperty="artist";
@@ -514,7 +528,7 @@ QImage OnlineServicesModel::requestImage(const QString &id, const QString &artis
     }
 
     QString imageUrl=url;
-    // Jamendo image URL is jsut the album ID!
+    // Jamendo image URL is just the album ID!
     if (!imageUrl.isEmpty() && !imageUrl.startsWith("http:/") && imageUrl.length()<15 && id==JamendoService::constName) {
         imageUrl=JamendoService::imageUrl(imageUrl);
         DBUG << "Built jamendo url" << imageUrl;
@@ -552,18 +566,18 @@ void OnlineServicesModel::imageDownloaded()
     }
 
     QString url=j->url().toString();
-    bool png=url.endsWith(".png", Qt::CaseInsensitive);
-    QImage img=QImage::fromData(data, png ? "PNG" : "JPG");
+    QImage img=QImage::fromData(data, Covers::imageFormat(data));
     if (img.isNull()) {
         DBUG << url << "null image";
         return;
     }
 
+    bool png=Covers::isPng(data);
     QString id=j->property(constIdProperty).toString();
     Song song;
     song.albumartist=song.artist=j->property(constArtistProperty).toString();
     song.album=j->property(constAlbumProperty).toString();
-    DBUG << "Got image" << id << song.artist << song.album;
+    DBUG << "Got image" << id << song.artist << song.album << png;
     OnlineService *srv=service(id);
     if (id==PodcastService::constName) {
         MusicLibraryItem *podcast=srv->childItem(song.artist);
@@ -599,21 +613,18 @@ void OnlineServicesModel::imageDownloaded()
                         ? Utils::cacheDir(id.toLower(), true)+Covers::encodeName(song.album.isEmpty() ? song.artist : (song.artist+" - "+song.album))+(png ? ".png" : ".jpg")
                         : cacheName);
 
-    if (maxSize>0 || !cacheName.isEmpty()) {
-        QImage img=QImage::fromData(data, png ? "PNG" : "JPG");
-        if (!img.isNull()) {
-            if (maxSize>32 && (img.width()>maxSize || img.height()>maxSize)) {
-                img=img.scaled(maxSize, maxSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-            }
-            DBUG << "Saved scaled image to" << fileName << maxSize;
-            img.save(fileName);
-            if (!song.album.isEmpty()) {
-                song.track=1;
-                song.setKey();
-                Covers::self()->emitCoverUpdated(song, img, fileName);
-            }
-            return;
+    if (!img.isNull() && (maxSize>0 || !cacheName.isEmpty())) {
+        if (maxSize>32 && (img.width()>maxSize || img.height()>maxSize)) {
+            img=img.scaled(maxSize, maxSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+        }
+        DBUG << "Saved scaled image to" << fileName << maxSize;
+        img.save(fileName);
+        if (!song.album.isEmpty()) {
+            song.track=1;
+            //song.setKey();
+            Covers::self()->emitCoverUpdated(song, img, fileName);
         }
+        return;
     }
     QFile f(fileName);
     if (f.open(QIODevice::WriteOnly)) {
@@ -621,7 +632,7 @@ void OnlineServicesModel::imageDownloaded()
         f.write(data);
         if (!song.album.isEmpty()) {
             song.track=1;
-            song.setKey();
+            //song.setKey();
             Covers::self()->emitCoverUpdated(song, img, fileName);
         }
     }
diff --git a/models/onlineservicesmodel.h b/models/onlineservicesmodel.h
index 713a81d..80e56ae 100644
--- a/models/onlineservicesmodel.h
+++ b/models/onlineservicesmodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -86,6 +86,7 @@ public:
     void deleteDownloadedPodcasts(MusicLibraryItemPodcast *pod, const QList<MusicLibraryItemPodcastEpisode *> &episodes);
     bool isDownloading() const;
     void cancelAll();
+    void resetModel();
     bool isHidden(OnlineService *srv) { return hiddenServices.contains(srv); }
 
     Covers::Image readImage(const Song &song);
diff --git a/models/playlistsmodel.cpp b/models/playlistsmodel.cpp
index eee4b18..64d687c 100644
--- a/models/playlistsmodel.cpp
+++ b/models/playlistsmodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -27,12 +27,15 @@
 #include <QModelIndex>
 #include <QMimeData>
 #include <QMenu>
+#include <QFont>
 #include "config.h"
 #include "playlistsmodel.h"
 #include "playlistsproxymodel.h"
+#include "playqueuemodel.h"
 #include "itemview.h"
 #include "qtplural.h"
 #include "groupedview.h"
+#include "tableview.h"
 #include "localize.h"
 #include "utils.h"
 #ifdef ENABLE_KDE_SUPPORT
@@ -44,11 +47,27 @@ K_GLOBAL_STATIC(PlaylistsModel, instance)
 #include "mpdconnection.h"
 #include "playqueuemodel.h"
 #include "icons.h"
+#ifdef ENABLE_HTTP_SERVER
+#include "httpserver.h"
+#endif
 
 #if defined ENABLE_MODEL_TEST
 #include "modeltest.h"
 #endif
 
+QString PlaylistsModel::headerText(int col)
+{
+    switch (col) {
+    case COL_TITLE:  return PlayQueueModel::headerText(PlayQueueModel::COL_TITLE);
+    case COL_ARTIST: return PlayQueueModel::headerText(PlayQueueModel::COL_ARTIST);
+    case COL_ALBUM:  return PlayQueueModel::headerText(PlayQueueModel::COL_ALBUM);
+    case COL_LENGTH: return PlayQueueModel::headerText(PlayQueueModel::COL_LENGTH);
+    case COL_YEAR:   return PlayQueueModel::headerText(PlayQueueModel::COL_YEAR);
+    case COL_GENRE:  return PlayQueueModel::headerText(PlayQueueModel::COL_GENRE);
+    default:         return QString();
+    }
+}
+
 PlaylistsModel * PlaylistsModel::self()
 {
     #ifdef ENABLE_KDE_SUPPORT
@@ -68,9 +87,11 @@ PlaylistsModel * PlaylistsModel::self()
 PlaylistsModel::PlaylistsModel(QObject *parent)
     : ActionModel(parent)
     , enabled(true)
+    , multiCol(false)
     , itemMenu(0)
     , dropAdjust(0)
 {
+    connect(MPDConnection::self(), SIGNAL(stateChanged(bool)), SLOT(mpdConnectionStateChanged(bool)));
     connect(MPDConnection::self(), SIGNAL(playlistsRetrieved(const QList<Playlist> &)), this, SLOT(setPlaylists(const QList<Playlist> &)));
     connect(MPDConnection::self(), SIGNAL(playlistInfoRetrieved(const QString &, const QList<Song> &)), this, SLOT(playlistInfoRetrieved(const QString &, const QList<Song> &)));
     connect(MPDConnection::self(), SIGNAL(removedFromPlaylist(const QString &, const QList<quint32> &)),
@@ -95,13 +116,12 @@ PlaylistsModel::~PlaylistsModel()
     itemMenu=0;
 }
 
-QVariant PlaylistsModel::headerData(int /*section*/, Qt::Orientation /*orientation*/, int /*role*/) const
-{
-    return QVariant();
-}
-
 int PlaylistsModel::rowCount(const QModelIndex &index) const
 {
+    if (index.column()>0) {
+        return 0;
+    }
+
     if (!index.isValid()) {
         return items.size();
     }
@@ -179,12 +199,63 @@ QModelIndex PlaylistsModel::index(int row, int col, const QModelIndex &parent) c
     return row<items.count() ? createIndex(row, col, items.at(row)) : QModelIndex();
 }
 
+QVariant PlaylistsModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+    if (Qt::Horizontal==orientation) {
+        switch (role) {
+        case Qt::DisplayRole:
+            return headerText(section);
+        case Qt::TextAlignmentRole:
+            switch (section) {
+            case COL_TITLE:
+            case COL_ARTIST:
+            case COL_ALBUM:
+            case COL_GENRE:
+            default:
+                return int(Qt::AlignVCenter|Qt::AlignLeft);
+            case COL_LENGTH:
+            case COL_YEAR:
+                return int(Qt::AlignVCenter|Qt::AlignRight);
+            }
+        case TableView::Role_Hideable:
+            return COL_YEAR==section || COL_GENRE==section ? true : false;
+        case TableView::Role_Width:
+            switch (section) {
+            case COL_TITLE:  return 0.4;
+            case COL_ARTIST: return 0.15;
+            case COL_ALBUM:  return 0.15;
+            case COL_YEAR:   return 0.05;
+            case COL_GENRE:  return 0.125;
+            case COL_LENGTH: return 0.125;
+            }
+        default:
+            break;
+        }
+    }
+
+    return QVariant();
+}
+
 QVariant PlaylistsModel::data(const QModelIndex &index, int role) const
 {
     if (!index.isValid()) {
         return QVariant();
     }
 
+    if (Qt::TextAlignmentRole==role) {
+        switch (index.column()) {
+        case COL_TITLE:
+        case COL_ARTIST:
+        case COL_ALBUM:
+        case COL_GENRE:
+        default:
+            return int(Qt::AlignVCenter|Qt::AlignLeft);
+        case COL_LENGTH:
+        case COL_YEAR:
+            return int(Qt::AlignVCenter|Qt::AlignRight);
+        }
+    }
+
     Item *item=static_cast<Item *>(index.internalPointer());
 
     if (item->isPlaylist()) {
@@ -213,28 +284,58 @@ QVariant PlaylistsModel::data(const QModelIndex &index, int role) const
         case GroupedView::Role_CurrentStatus:
         case GroupedView::Role_Status:
             return (int)GroupedView::State_Default;
+        case Qt::FontRole:
+            if (multiCol) {
+                QFont font;
+                font.setBold(true);
+                return font;
+            }
+            return QVariant();
         case Qt::DisplayRole:
-            return pl->name;
+            if (multiCol) {
+                switch (index.column()) {
+                case COL_TITLE:
+                    return pl->visibleName();
+                case COL_ARTIST:
+                case COL_ALBUM:
+                    return QVariant();
+                case COL_LENGTH:
+                    if (!pl->loaded) {
+                        pl->loaded=true;
+                        emit playlistInfo(pl->name);
+                    }
+                    return pl->loaded && !pl->isSmartPlaylist ? Song::formattedTime(pl->totalTime()) : QVariant();
+                case COL_YEAR:
+                case COL_GENRE:
+                    return QVariant();
+                default:
+                    break;
+                }
+            }
+            return pl->visibleName();
         case Qt::ToolTipRole:
             if (!pl->loaded) {
                 pl->loaded=true;
                 emit playlistInfo(pl->name);
             }
             return 0==pl->songs.count()
-                ? pl->name
-                : pl->name+"\n"+
+                ? pl->visibleName()
+                : pl->visibleName()+"\n"+
                     #ifdef ENABLE_KDE_SUPPORT
                     i18np("1 Track (%2)", "%1 Tracks (%2)", pl->songs.count(), Song::formattedTime(pl->totalTime()));
                     #else
                     QTP_TRACKS_DURATION_STR(pl->songs.count(), Song::formattedTime(pl->totalTime()));
                     #endif
         case Qt::DecorationRole:
-            return Icons::self()->playlistIcon;
+            return multiCol ? QVariant() : (pl->isSmartPlaylist ? Icons::self()->dynamicRuleIcon : Icons::self()->playlistIcon);
         case ItemView::Role_SubText:
             if (!pl->loaded) {
                 pl->loaded=true;
                 emit playlistInfo(pl->name);
             }
+            if (pl->isSmartPlaylist) {
+                return i18n("Smart Playlist");
+            }
             #ifdef ENABLE_KDE_SUPPORT
             return i18np("1 Track (%2)", "%1 Tracks (%2)", pl->songs.count(), Song::formattedTime(pl->totalTime()));
             #else
@@ -302,6 +403,27 @@ QVariant PlaylistsModel::data(const QModelIndex &index, int role) const
         case GroupedView::Role_Status:
             return (int)GroupedView::State_Default;
         case Qt::DisplayRole:
+            if (multiCol) {
+                switch (index.column()) {
+                case COL_TITLE:
+                    return s->trackAndTitleStr(Song::isVariousArtists(s->albumArtist()));
+                case COL_ARTIST:
+                    return s->artist.isEmpty() ? Song::unknown() : s->artist;
+                case COL_ALBUM:
+                    return s->album.isEmpty() && !s->name.isEmpty() && s->isStream() ? s->name : s->album;
+                case COL_LENGTH:
+                    return Song::formattedTime(s->time);
+                case COL_YEAR:
+                    if (s->year <= 0) {
+                        return QVariant();
+                    }
+                    return s->year;
+                case COL_GENRE:
+                    return s->genre;
+                default:
+                    break;
+                }
+            }
         case Qt::ToolTipRole: {
             QString text=s->entryName();
 
@@ -315,7 +437,7 @@ QVariant PlaylistsModel::data(const QModelIndex &index, int role) const
             return text;
         }
         case Qt::DecorationRole:
-            return s->title.isEmpty() ? Icons::self()->streamIcon : Icons::self()->audioFileIcon;
+            return multiCol ? QVariant() : (s->title.isEmpty() ? Icons::self()->streamIcon : Icons::self()->audioFileIcon);
         case ItemView::Role_MainText:
             return s->title.isEmpty() ? s->file : s->title;
         case ItemView::Role_SubText:
@@ -600,7 +722,7 @@ void PlaylistsModel::setPlaylists(const QList<Playlist> &playlists)
 
             if (pl && pl->lastModified<p.lastModified) {
                 pl->lastModified=p.lastModified;
-                if (pl->loaded) {
+                if (pl->loaded && !pl->isSmartPlaylist) {
                     emit playlistInfo(pl->name);
                 }
             }
@@ -785,6 +907,15 @@ void PlaylistsModel::playlistRenamed(const QString &from, const QString &to)
     }
 }
 
+void PlaylistsModel::mpdConnectionStateChanged(bool connected)
+{
+    if (!connected) {
+        clear();
+    } else {
+        getPlaylists();
+    }
+}
+
 void PlaylistsModel::updateItemMenu()
 {
     if (!itemMenu) {
@@ -795,7 +926,9 @@ void PlaylistsModel::updateItemMenu()
     itemMenu->addAction(newAction);
     QStringList names;
     foreach (const PlaylistItem *p, items) {
-        names << p->name;
+        if (!p->isSmartPlaylist) {
+            names << p->name;
+        }
     }
     qSort(names.begin(), names.end(), PlaylistsProxyModel::compareNames);
     foreach (const QString &n, names) {
@@ -851,6 +984,18 @@ quint32 PlaylistsModel::allocateKey()
     return 0xFFFFFFFF;
 }
 
+PlaylistsModel::PlaylistItem::PlaylistItem(const Playlist &pl, quint32 k)
+    : name(pl.name)
+    , time(0)
+    , key(k)
+    , lastModified(pl.lastModified)
+{
+    loaded=isSmartPlaylist=MPDConnection::self()->isMopdidy() && name.startsWith("Smart Playlist:");
+    if (isSmartPlaylist) {
+        shortName=name.mid(16);
+    }
+}
+
 PlaylistsModel::PlaylistItem::~PlaylistItem()
 {
     clearSongs();
diff --git a/models/playlistsmodel.h b/models/playlistsmodel.h
index 266eb5d..f3cd9ea 100644
--- a/models/playlistsmodel.h
+++ b/models/playlistsmodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -42,6 +42,18 @@ class PlaylistsModel : public ActionModel
     Q_OBJECT
 
 public:
+    enum Columns
+    {
+        COL_TITLE,
+        COL_ARTIST,
+        COL_ALBUM,
+        COL_YEAR,
+        COL_GENRE,
+        COL_LENGTH,
+
+        COL_COUNT
+    };
+
     struct Item
     {
         virtual bool isPlaylist() = 0;
@@ -59,16 +71,19 @@ public:
 
     struct PlaylistItem : public Item
     {
-        PlaylistItem(quint32 k) : loaded(false), time(0), key(k) { }
-        PlaylistItem(const Playlist &pl, quint32 k) : name(pl.name), loaded(false), time(0), key(k), lastModified(pl.lastModified) { }
+        PlaylistItem(quint32 k) : loaded(false), isSmartPlaylist(false), time(0), key(k) { }
+        PlaylistItem(const Playlist &pl, quint32 k);
         virtual ~PlaylistItem();
         bool isPlaylist() { return true; }
         void updateGenres();
         SongItem * getSong(const Song &song, int offset);
         void clearSongs();
         quint32 totalTime();
+        const QString & visibleName() const { return shortName.isEmpty() ? name : shortName; }
         QString name;
+        QString shortName;
         bool loaded;
+        bool isSmartPlaylist;
         QList<SongItem *> songs;
         QSet<QString> genres;
         quint32 time;
@@ -77,17 +92,18 @@ public:
     };
 
     static PlaylistsModel * self();
+    static QString headerText(int col);
 
     PlaylistsModel(QObject *parent = 0);
     ~PlaylistsModel();
-    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
     int rowCount(const QModelIndex &parent = QModelIndex()) const;
+    int columnCount(const QModelIndex &parent = QModelIndex()) const { Q_UNUSED(parent); return COL_COUNT; }
     bool canFetchMore(const QModelIndex &index) const;
     void fetchMore(const QModelIndex &index);
     bool hasChildren(const QModelIndex &parent = QModelIndex()) const;
-    int columnCount(const QModelIndex&) const { return 1; }
     QModelIndex parent(const QModelIndex &index) const;
     QModelIndex index(int row, int col, const QModelIndex &parent) const;
+    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
     QVariant data(const QModelIndex &, int) const;
     bool setData(const QModelIndex &index, const QVariant &value, int role);
     Qt::ItemFlags flags(const QModelIndex &index) const;
@@ -105,6 +121,7 @@ public:
     QMenu * menu() { return itemMenu; }
     const QSet<QString> & genres() { return plGenres; }
     static QString strippedText(QString s);
+    void setMultiColumn(bool m) { multiCol=m; }
 
 Q_SIGNALS:
     // These are for communicating with MPD object (which is in its own thread, so need to talk via signal/slots)
@@ -127,6 +144,7 @@ private Q_SLOTS:
     void movedInPlaylist(const QString &name, const QList<quint32> &idx, quint32 pos);
     void emitAddToExisting();
     void playlistRenamed(const QString &from, const QString &to);
+    void mpdConnectionStateChanged(bool connected);
 
 private:
     void updateGenreList();
@@ -137,6 +155,7 @@ private:
 
 private:
     bool enabled;
+    bool multiCol;
     QList<PlaylistItem *> items;
     QSet<quint32> usedKeys;
     QSet<QString> plGenres;
diff --git a/models/playlistsproxymodel.cpp b/models/playlistsproxymodel.cpp
index dbb1101..118b8fe 100644
--- a/models/playlistsproxymodel.cpp
+++ b/models/playlistsproxymodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/models/playlistsproxymodel.h b/models/playlistsproxymodel.h
index 4135dc7..2633b09 100644
--- a/models/playlistsproxymodel.h
+++ b/models/playlistsproxymodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/models/playqueuemodel.cpp b/models/playqueuemodel.cpp
index f875f1a..4d3900f 100644
--- a/models/playqueuemodel.cpp
+++ b/models/playqueuemodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -24,18 +24,10 @@
  * along with QtMPC.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <QPalette>
-#include <QFont>
-#include <QModelIndex>
-#include <QMimeData>
-#include <QTextStream>
-#include <QSet>
-#include <QUrl>
-#include <QTimer>
-#include <QApplication>
 #include "localize.h"
 #include "playqueuemodel.h"
 #include "groupedview.h"
+#include "playqueueview.h"
 #include "mpdconnection.h"
 #include "mpdparseutils.h"
 #include "mpdstats.h"
@@ -47,9 +39,20 @@
 #include "icon.h"
 #include "utils.h"
 #include "config.h"
+#include "action.h"
+#include "actioncollection.h"
 #ifdef ENABLE_DEVICES_SUPPORT
 #include "devicesmodel.h"
 #endif
+#include <QPalette>
+#include <QFont>
+#include <QModelIndex>
+#include <QMimeData>
+#include <QTextStream>
+#include <QSet>
+#include <QUrl>
+#include <QTimer>
+#include <QApplication>
 
 #if defined ENABLE_MODEL_TEST
 #include "modeltest.h"
@@ -99,11 +102,10 @@ QStringList PlayQueueModel::decode(const QMimeData &mimeData, const QString &mim
 QString PlayQueueModel::headerText(int col)
 {
     switch (col) {
-    case COL_STATUS: return QString();
     case COL_TITLE:  return i18n("Title");
     case COL_ARTIST: return i18n("Artist");
     case COL_ALBUM:  return i18n("Album");
-    case COL_TRACK:  return i18nc("Track Number (#)", "#");
+    case COL_TRACK:  return i18n("Track");
     case COL_LENGTH: return i18n("Length");
     case COL_DISC:   return i18n("Disc");
     case COL_YEAR:   return i18n("Year");
@@ -121,6 +123,9 @@ PlayQueueModel::PlayQueueModel(QObject *parent)
     , dropAdjust(0)
     , stopAfterCurrent(false)
     , stopAfterTrackId(-1)
+    , undoLimit(Settings::self()->undoSteps())
+    , undoEnabled(undoLimit>0)
+    , lastCommand(Cmd_Other)
 {
     fetcher=new StreamFetcher(this);
     connect(this, SIGNAL(modelReset()), this, SLOT(stats()));
@@ -129,6 +134,7 @@ PlayQueueModel::PlayQueueModel(QObject *parent)
     connect(fetcher, SIGNAL(status(QString)), SIGNAL(streamFetchStatus(QString)));
     connect(this, SIGNAL(filesAdded(const QStringList, quint32, quint32, int, quint8)),
             MPDConnection::self(), SLOT(add(const QStringList, quint32, quint32, int, quint8)));
+    connect(this, SIGNAL(populate(QStringList, QList<quint8>)), MPDConnection::self(), SLOT(populate(QStringList, QList<quint8>)));
     connect(this, SIGNAL(move(const QList<quint32> &, quint32, quint32)),
             MPDConnection::self(), SLOT(move(const QList<quint32> &, quint32, quint32)));
     connect(MPDConnection::self(), SIGNAL(prioritySet(const QList<qint32> &, quint8)), SLOT(prioritySet(const QList<qint32> &, quint8)));
@@ -136,6 +142,9 @@ PlayQueueModel::PlayQueueModel(QObject *parent)
     connect(this, SIGNAL(stop(bool)), MPDConnection::self(), SLOT(stopPlaying(bool)));
     connect(this, SIGNAL(clearStopAfter()), MPDConnection::self(), SLOT(clearStopAfter()));
     connect(this, SIGNAL(removeSongs(QList<qint32>)), MPDConnection::self(), SLOT(removeSongs(QList<qint32>)));
+    connect(this, SIGNAL(clearEntries()), MPDConnection::self(), SLOT(clear()));
+    connect(this, SIGNAL(addAndPlay(QString)), MPDConnection::self(), SLOT(addAndPlay(QString)));
+    connect(this, SIGNAL(startPlayingSongId(qint32)), MPDConnection::self(), SLOT(startPlayingSongId(qint32)));
     #ifdef ENABLE_DEVICES_SUPPORT
     connect(DevicesModel::self(), SIGNAL(invalid(QList<Song>)), SLOT(remove(QList<Song>)));
     connect(DevicesModel::self(), SIGNAL(updatedDetails(QList<Song>)), SLOT(updateDetails(QList<Song>)));
@@ -143,6 +152,18 @@ PlayQueueModel::PlayQueueModel(QObject *parent)
     #if defined ENABLE_MODEL_TEST
     new ModelTest(this, this);
     #endif
+
+    removeDuplicatesAction=new Action(i18n("Remove Duplicates"), this);
+    removeDuplicatesAction->setEnabled(false);
+    undoAction=ActionCollection::get()->createAction("playqueue-undo", i18n("Undo"), "edit-undo");
+    undoAction->setShortcut(Qt::ControlModifier+Qt::Key_Z);
+    redoAction=ActionCollection::get()->createAction("playqueue-redo", i18n("Redo"), "edit-redo");
+    redoAction->setShortcut(Qt::ControlModifier+Qt::ShiftModifier+Qt::Key_Z);
+    connect(undoAction, SIGNAL(triggered(bool)), this, SLOT(undo()));
+    connect(redoAction, SIGNAL(triggered(bool)), this, SLOT(redo()));
+    connect(removeDuplicatesAction, SIGNAL(triggered(bool)), this, SLOT(removeDuplicates()));
+
+    controlActions();
 }
 
 PlayQueueModel::~PlayQueueModel()
@@ -163,9 +184,10 @@ QModelIndex PlayQueueModel::parent(const QModelIndex &idx) const
 QVariant PlayQueueModel::headerData(int section, Qt::Orientation orientation, int role) const
 {
     if (Qt::Horizontal==orientation) {
-        if (Qt::DisplayRole==role) {
+        switch (role) {
+        case Qt::DisplayRole:
             return headerText(section);
-        } else if (Qt::TextAlignmentRole==role) {
+        case Qt::TextAlignmentRole:
             switch (section) {
             case COL_TITLE:
             case COL_ARTIST:
@@ -173,7 +195,6 @@ QVariant PlayQueueModel::headerData(int section, Qt::Orientation orientation, in
             case COL_GENRE:
             default:
                 return int(Qt::AlignVCenter|Qt::AlignLeft);
-            case COL_STATUS:
             case COL_TRACK:
             case COL_LENGTH:
             case COL_DISC:
@@ -181,6 +202,22 @@ QVariant PlayQueueModel::headerData(int section, Qt::Orientation orientation, in
             case COL_PRIO:
                 return int(Qt::AlignVCenter|Qt::AlignRight);
             }
+        case TableView::Role_Hideable:
+            return COL_YEAR==section || COL_DISC==section || COL_GENRE==section || COL_PRIO==section? true : false;
+        case TableView::Role_Width:
+            switch (section) {
+            case COL_TRACK:  return 0.075;
+            case COL_DISC:   return 0.03;
+            case COL_TITLE:  return 0.3;
+            case COL_ARTIST: return 0.27;
+            case COL_ALBUM:  return 0.27;
+            case COL_LENGTH: return 0.05;
+            case COL_YEAR:   return 0.05;
+            case COL_GENRE:  return 0.1;
+            case COL_PRIO:   return 0.015;
+            }
+        default:
+            break;
         }
     }
 
@@ -192,6 +229,21 @@ int PlayQueueModel::rowCount(const QModelIndex &idx) const
     return idx.isValid() ? 0 : songs.size();
 }
 
+static QString basicPath(const Song &song)
+{
+    #ifdef ENABLE_HTTP_SERVER
+    if (song.isCantataStream()) {
+        Song mod=HttpServer::self()->decodeUrl(song.file);
+        if (!mod.file.isEmpty()) {
+            return mod.file;
+        }
+    }
+    #endif
+    QString path=song.filePath();
+    int marker=path.indexOf(QLatin1Char('#'));
+    return -1==marker ? path : path.left(marker);
+}
+
 QVariant PlayQueueModel::data(const QModelIndex &index, int role) const
 {
     if (Qt::SizeHintRole!=role && (!index.isValid() || index.row() >= songs.size())) {
@@ -327,14 +379,15 @@ QVariant PlayQueueModel::data(const QModelIndex &index, int role) const
         const Song &song = songs.at(index.row());
         switch (index.column()) {
         case COL_TITLE:
-            return song.title.isEmpty() ? song.file : song.title;
+            return song.title.isEmpty() ? Utils::getFile(basicPath(song)) : song.title;
         case COL_ARTIST:
-            return song.artist.isEmpty() ? i18n("Unknown") : song.artist;
+            return song.artist.isEmpty() ? Song::unknown() : song.artist;
         case COL_ALBUM:
             return song.album.isEmpty() && !song.name.isEmpty() && song.isStream() ? song.name : song.album;
         case COL_TRACK:
-            if (song.track <= 0)
+            if (song.track <= 0) {
                 return QVariant();
+            }
             return song.track;
         case COL_LENGTH:
             return Song::formattedTime(song.time);
@@ -343,8 +396,9 @@ QVariant PlayQueueModel::data(const QModelIndex &index, int role) const
                 return QVariant();
             return song.disc;
         case COL_YEAR:
-            if (song.year <= 0)
+            if (song.year <= 0) {
                 return QVariant();
+            }
             return song.year;
         case COL_GENRE:
             return song.genre;
@@ -358,14 +412,14 @@ QVariant PlayQueueModel::data(const QModelIndex &index, int role) const
     case Qt::ToolTipRole: {
         Song s=songs.at(index.row());
         if (s.album.isEmpty() && s.isStream()) {
-            return s.file;
+            return basicPath(s);
         } else {
             return s.albumArtist()+QLatin1String("<br/>")+
                    s.album+(s.year>0 ? (QLatin1String(" (")+QString::number(s.year)+QChar(')')) : QString())+QLatin1String("<br/>")+
                    s.trackAndTitleStr(Song::isVariousArtists(s.albumArtist()))+QLatin1String("<br/>")+
                    Song::formattedTime(s.time)+QLatin1String("<br/>")+
                    (s.priority>0 ? i18n("<b>(Priority: %1)</b>", s.priority)+QLatin1String("<br/>") : QString())+
-                   QLatin1String("<small><i>")+s.file+QLatin1String("</i></small>");
+                   QLatin1String("<small><i>")+basicPath(s)+QLatin1String("</i></small>");
         }
     }
     case Qt::TextAlignmentRole:
@@ -376,7 +430,6 @@ QVariant PlayQueueModel::data(const QModelIndex &index, int role) const
         case COL_GENRE:
         default:
             return int(Qt::AlignVCenter|Qt::AlignLeft);
-        case COL_STATUS:
         case COL_TRACK:
         case COL_LENGTH:
         case COL_DISC:
@@ -384,27 +437,19 @@ QVariant PlayQueueModel::data(const QModelIndex &index, int role) const
         case COL_PRIO:
             return int(Qt::AlignVCenter|Qt::AlignRight);
         }
-    case Qt::DecorationRole:
-        if (COL_STATUS==index.column()) {
-            qint32 id=songs.at(index.row()).id;
-            if (id==currentSongId) {
-                switch (mpdState) {
-                case MPDState_Inactive:
-                case MPDState_Stopped: return Icon("media-playback-stop");
-                case MPDState_Playing: return Icon(stopAfterCurrent ? "media-playback-stop" : "media-playback-start");
-                case MPDState_Paused:  return Icon("media-playback-pause");
-                }
-            } else if (-1!=id && id==stopAfterTrackId) {
-                return Icon("media-playback-stop");
+    case PlayQueueView::Role_Decoration: {
+        qint32 id=songs.at(index.row()).id;
+        if (id==currentSongId) {
+            switch (mpdState) {
+            case MPDState_Inactive:
+            case MPDState_Stopped: return Icon("media-playback-stop");
+            case MPDState_Playing: return Icon(stopAfterCurrent ? "media-playback-stop" : "media-playback-start");
+            case MPDState_Paused:  return Icon("media-playback-pause");
             }
+        } else if (-1!=id && id==stopAfterTrackId) {
+            return Icon("media-playback-stop");
         }
         break;
-    case Qt::SizeHintRole: {
-        static int sz=-1;
-        if (-1==sz) {
-            sz=Icon::stdSize(QApplication::fontMetrics().height()*1.2)*1.125;
-        }
-        return QSize(sz, sz);
     }
     default:
         break;
@@ -441,13 +486,7 @@ Qt::ItemFlags PlayQueueModel::flags(const QModelIndex &index) const
  */
 QStringList PlayQueueModel::mimeTypes() const
 {
-    QStringList types;
-    types << constMoveMimeType;
-    types << constFileNameMimeType;
-    if (HttpServer::self()->isAlive()) {
-        types << constUriMimeType;
-    }
-    return types;
+    return QStringList() << constMoveMimeType << constFileNameMimeType << constUriMimeType;
 }
 
 /**
@@ -525,17 +564,20 @@ bool PlayQueueModel::dropMimeData(const QMimeData *data,
     } else if(data->hasFormat(constUriMimeType)/* && MPDConnection::self()->getDetails().isLocal()*/) {
         QStringList orig=decode(*data, constUriMimeType);
         QStringList useable;
-        bool haveHttp=HttpServer::self()->isAlive();
 
         foreach (QString u, orig) {
             if (u.startsWith(QLatin1String("http://"))) {
                 useable.append(u);
-            } else if (haveHttp && (u.startsWith('/') || u.startsWith(QLatin1String("file://")))) {
+            } else if (u.startsWith('/') || u.startsWith(QLatin1String("file://"))) {
                 if (u.startsWith(QLatin1String("file://"))) {
                     u=u.mid(7);
                 }
                 if (checkExtension(u)) {
-                    useable.append(HttpServer::self()->encodeUrl(QUrl::fromPercentEncoding(u.toUtf8())));
+                    if (!HttpServer::self()->forceUsage() && MPDConnection::self()->getDetails().isLocal() && !u.startsWith(QLatin1String("/media/"))) {
+                        useable.append(QLatin1String("file://")+QUrl::fromPercentEncoding(u.toUtf8()));
+                    } else if (HttpServer::self()->isAlive()) {
+                        useable.append(HttpServer::self()->encodeUrl(QUrl::fromPercentEncoding(u.toUtf8())));
+                    }
                 }
             }
         }
@@ -583,6 +625,12 @@ void PlayQueueModel::addFiles(const QStringList &filenames, int row, bool replac
 
 void PlayQueueModel::prioritySet(const QList<qint32> &ids, quint8 priority)
 {
+    QList<Song> prev;
+    if (undoEnabled) {
+        foreach (Song s, songs) {
+            prev.append(s);
+        }
+    }
     QSet<qint32> i=ids.toSet();
     int row=0;
 
@@ -593,11 +641,13 @@ void PlayQueueModel::prioritySet(const QList<qint32> &ids, quint8 priority)
             QModelIndex idx(index(row, 0));
             emit dataChanged(idx, idx);
             if (i.isEmpty()) {
-                return;
+                break;
             }
         }
         ++row;
     }
+
+    saveHistory(prev);
 }
 
 qint32 PlayQueueModel::getIdByRow(qint32 row) const
@@ -701,6 +751,16 @@ void PlayQueueModel::setState(MPDState st)
 // Update playqueue with contents returned from MPD.
 void PlayQueueModel::update(const QList<Song> &songList)
 {
+    if (songList.isEmpty()) {
+        Song::clearKeyStore(MPDParseUtils::PlayQueue);
+    }
+
+    removeDuplicatesAction->setEnabled(songList.count()>1);
+    QList<Song> prev;
+    if (undoEnabled) {
+        prev=songs;
+    }
+
     QSet<qint32> newIds;
     foreach (const Song &s, songList) {
         newIds.insert(s.id);
@@ -773,6 +833,8 @@ void PlayQueueModel::update(const QList<Song> &songList)
         }
         emit statsUpdated(songs.size(), time);
     }
+
+    saveHistory(prev);
 }
 
 void PlayQueueModel::setStopAfterTrack(qint32 track)
@@ -791,7 +853,7 @@ void PlayQueueModel::setStopAfterTrack(qint32 track)
     }
 }
 
-void PlayQueueModel::removeCantataStreams()
+bool PlayQueueModel::removeCantataStreams()
 {
     QList<qint32> ids;
     foreach (const Song &s, songs) {
@@ -802,7 +864,14 @@ void PlayQueueModel::removeCantataStreams()
 
     if (!ids.isEmpty()) {
         emit removeSongs(ids);
+        return true;
     }
+    return false;
+}
+
+void PlayQueueModel::removeAll()
+{
+    emit clearEntries();
 }
 
 void PlayQueueModel::remove(const QList<int> &rowsToRemove)
@@ -839,6 +908,159 @@ void PlayQueueModel::crop(const QList<int> &rowsToKeep)
     }
 }
 
+void PlayQueueModel::enableUndo(bool e)
+{
+    if (e==undoEnabled) {
+        return;
+    }
+    undoEnabled=e && undoLimit>0;
+    if (!e) {
+        undoStack.clear();
+        redoStack.clear();
+    }
+    controlActions();
+}
+
+static PlayQueueModel::UndoItem getState(const QList<Song> &songs)
+{
+    PlayQueueModel::UndoItem item;
+    foreach (const Song &s, songs) {
+        item.files.append(s.file);
+        item.priority.append(s.priority);
+    }
+    return item;
+}
+
+static bool equalSongList(const QList<Song> &a, const QList<Song> &b)
+{
+    if (a.count()!=b.count()) {
+        return false;
+    }
+
+    for (int i=0; i<a.count(); ++i) {
+        const Song &sa=a.at(i);
+        const Song &sb=b.at(i);
+        if (sa.priority!=sb.priority || sa.file!=sb.file) {
+            return false;
+        }
+    }
+    return true;
+}
+
+void PlayQueueModel::saveHistory(const QList<Song> &prevList)
+{
+    if (!undoEnabled) {
+        return;
+    }
+
+    if (equalSongList(prevList, songs)) {
+        lastCommand=Cmd_Other;
+        return;
+    }
+
+    switch (lastCommand) {
+    case Cmd_Redo: {
+        if (redoStack.isEmpty()) {
+            lastCommand=Cmd_Other;
+        } else {
+            UndoItem actioned=redoStack.pop();
+            if (actioned!=getState(songs)) {
+                lastCommand=Cmd_Other;
+            } else {
+                undoStack.push(getState(prevList));
+            }
+        }
+        break;
+    }
+    case Cmd_Undo: {
+        if (undoStack.isEmpty()) {
+            lastCommand=Cmd_Other;
+        } else {
+            UndoItem actioned=undoStack.pop();
+            if (actioned!=getState(songs)) {
+                lastCommand=Cmd_Other;
+            } else {
+                redoStack.push(getState(prevList));
+            }
+        }
+        break;
+    }
+    case Cmd_Other:
+        break;
+    }
+
+    if (Cmd_Other==lastCommand) {
+        redoStack.clear();
+        undoStack.push(getState(prevList));
+        if (undoStack.size()>undoLimit) {
+            undoStack.pop_back();
+        }
+    }
+
+    controlActions();
+    lastCommand=Cmd_Other;
+}
+
+void PlayQueueModel::controlActions()
+{
+    undoAction->setEnabled(!undoStack.isEmpty());
+    undoAction->setVisible(undoLimit>0);
+    redoAction->setEnabled(!redoStack.isEmpty());
+    redoAction->setVisible(undoLimit>0);
+}
+
+void PlayQueueModel::removeDuplicates()
+{
+    QMap<QString, QList<Song> > map;
+    foreach (const Song &song, songs) {
+        map[song.artistSong()].append(song);
+    }
+
+    QList<qint32> toRemove;
+    foreach (const QString &key, map.keys()) {
+        QList<Song> values=map.value(key);
+        if (values.size()>1) {
+            Song::sortViaType(values);
+            for (int i=1; i<values.count(); ++i) {
+                toRemove.append(values.at(i).id);
+            }
+        }
+    }
+    if (!toRemove.isEmpty()) {
+        emit removeSongs(toRemove);
+    }
+}
+
+void PlayQueueModel::undo()
+{
+    if (!undoEnabled || undoStack.isEmpty()) {
+        return;
+    }
+    UndoItem item=undoStack.top();
+    emit populate(item.files, item.priority);
+    lastCommand=Cmd_Undo;
+}
+
+void PlayQueueModel::redo()
+{
+    if (!undoEnabled || redoStack.isEmpty()) {
+        return;
+    }
+    UndoItem item=redoStack.top();
+    emit populate(item.files, item.priority);
+    lastCommand=Cmd_Redo;
+}
+
+void PlayQueueModel::playSong(const QString &file)
+{
+    qint32 id=getSongId(file);
+    if (-1==id) {
+        emit addAndPlay(file);
+    } else {
+        emit startPlayingSongId(id);
+    }
+}
+
 void PlayQueueModel::stats()
 {
     quint32 time = 0;
@@ -927,7 +1149,7 @@ void PlayQueueModel::updateDetails(const QList<Song> &updated)
         if (songMap.contains(current.file)) {
             Song updatedSong=songMap[current.file];
             updatedSong.id=current.id;
-            updatedSong.setKey();
+            updatedSong.setKey(MPDParseUtils::PlayQueue);
 
             if (updatedSong.name!=current.name || updatedSong.title!=current.title || updatedSong.artist!=current.artist) {
                 songs.replace(i, updatedSong);
diff --git a/models/playqueuemodel.h b/models/playqueuemodel.h
index ad3e11b..3158279 100644
--- a/models/playqueuemodel.h
+++ b/models/playqueuemodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -27,15 +27,17 @@
 #ifndef PLAYQUEUEMODEL_H
 #define PLAYQUEUEMODEL_H
 
-#include <QList>
-#include <QStringList>
-#include <QSet>
-#include <QAbstractItemModel>
 #include "song.h"
 #include "mpdstatus.h"
 #include "config.h"
+#include <QStringList>
+#include <QAbstractItemModel>
+#include <QList>
+#include <QSet>
+#include <QStack>
 
 class StreamFetcher;
+class Action;
 
 class PlayQueueModel : public QAbstractItemModel
 {
@@ -45,7 +47,6 @@ public:
 
     enum Columns
     {
-        COL_STATUS,
         COL_TRACK,
         COL_DISC,
         COL_TITLE,
@@ -59,6 +60,14 @@ public:
         COL_COUNT
     };
 
+    struct UndoItem
+    {
+        bool operator==(const UndoItem &o) const { return priority==o.priority && files==o.files; }
+        bool operator!=(const UndoItem &o) const { return !(*this==o); }
+        QStringList files;
+        QList<quint8> priority;
+    };
+
     static const QLatin1String constMoveMimeType;
     static const QLatin1String constFileNameMimeType;
     static const QLatin1String constUriMimeType;
@@ -96,10 +105,22 @@ public:
     void update(const QList<Song> &songList);
     void setStopAfterTrack(qint32 track);
     void clearStopAfterTrack() { setStopAfterTrack(-1); }
-    void removeCantataStreams();
+    bool removeCantataStreams();
+    void removeAll();
     void remove(const QList<int> &rowsToRemove);
     void crop(const QList<int> &rowsToKeep);
 
+    Action * removeDuplicatesAct() { return removeDuplicatesAction; }
+
+    void enableUndo(bool e);
+    Action * undoAct() { return undoAction; }
+    Action * redoAct() { return redoAction; }
+    bool lastCommandWasUnodOrRedo() const { return Cmd_Other!=lastCommand; }
+
+private:
+    void saveHistory(const QList<Song> &prevList);
+    void controlActions();
+
 public Q_SLOTS:
     void addItems(const QStringList &items, int row, bool replace, quint8 priority);
     void addItems(const QStringList &items, bool replace, quint8 priority) { addItems(items, -1, replace, priority); }
@@ -108,16 +129,21 @@ public Q_SLOTS:
     void stats();
     void cancelStreamFetch();
     void shuffleAlbums();
+    void playSong(const QString &file);
 
 private Q_SLOTS:
     void stopAfterCurrentChanged(bool afterCurrent);
     void remove(const QList<Song> &rem);
     void updateDetails(const QList<Song> &updated);
+    void undo();
+    void redo();
+    void removeDuplicates();
 
 Q_SIGNALS:
     void stop(bool afterCurrent);
     void clearStopAfter();
     void filesAdded(const QStringList filenames, const quint32 row, const quint32 size, int action, quint8 priority);
+    void populate(const QStringList &items, const QList<quint8> &priority);
     void move(const QList<quint32> &items, const quint32 row, const quint32 size);
     void statsUpdated(int songs, quint32 time);
     void fetchingStreams();
@@ -125,6 +151,9 @@ Q_SIGNALS:
     void removeSongs(const QList<qint32> &items);
     void updateCurrent(const Song &s);
     void streamFetchStatus(const QString &msg);
+    void clearEntries();
+    void addAndPlay(const QString &file);
+    void startPlayingSongId(qint32 id);
 
 private:
     QList<Song> songs;
@@ -136,6 +165,22 @@ private:
     quint32 dropAdjust;
     bool stopAfterCurrent;
     qint32 stopAfterTrackId;
+    Action *removeDuplicatesAction;
+
+    enum Command
+    {
+        Cmd_Other,
+        Cmd_Undo,
+        Cmd_Redo
+    };
+
+    int undoLimit;
+    bool undoEnabled;
+    Command lastCommand;
+    Action *undoAction;
+    Action *redoAction;
+    QStack<UndoItem> undoStack;
+    QStack<UndoItem> redoStack;
 };
 
 #endif
diff --git a/models/playqueueproxymodel.cpp b/models/playqueueproxymodel.cpp
index 7c2c982..8a4763a 100644
--- a/models/playqueueproxymodel.cpp
+++ b/models/playqueueproxymodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/models/playqueueproxymodel.h b/models/playqueueproxymodel.h
index 190994c..c998640 100644
--- a/models/playqueueproxymodel.h
+++ b/models/playqueueproxymodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/models/proxymodel.cpp b/models/proxymodel.cpp
index 5c047bb..b021dd5 100644
--- a/models/proxymodel.cpp
+++ b/models/proxymodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -28,9 +28,12 @@ bool ProxyModel::matchesFilter(const Song &s) const
     QStringList strings;
 
     strings << s.albumArtist();
-    if (s.albumartist!=s.artist) {
+    if (!s.albumartist.isEmpty() && s.albumartist!=s.artist) {
         strings << s.artist;
     }
+    if (!s.composer.isEmpty() && s.composer!=s.artist && s.composer!=s.albumartist) {
+        strings << s.composer;
+    }
     strings << s.title << s.album;
     return matchesFilter(strings);
 }
@@ -78,7 +81,7 @@ bool ProxyModel::update(const QString &txt, const QString &genre)
     bool wasEmpty=isEmpty();
     filterStrings = text.split(' ', QString::SkipEmptyParts, Qt::CaseInsensitive);
     unmatchedStrings = 0;
-    const int n = qMin(filterStrings.count(), (int)sizeof(uint));
+    const int n = qMin(filterStrings.count(), (int)(sizeof(uint)*8));
     for ( int i = 0; i < n; ++i ) {
         unmatchedStrings |= (1<<i);
     }
diff --git a/models/proxymodel.h b/models/proxymodel.h
index 52489f7..2bf331f 100644
--- a/models/proxymodel.h
+++ b/models/proxymodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/models/searchmodel.cpp b/models/searchmodel.cpp
new file mode 100644
index 0000000..05dd9cd
--- /dev/null
+++ b/models/searchmodel.cpp
@@ -0,0 +1,307 @@
+/*
+ * Cantata
+ *
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
+ *
+ * ----
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "searchmodel.h"
+#include "icons.h"
+#include "itemview.h"
+#include "tableview.h"
+#include "localize.h"
+#include "qtplural.h"
+#include "mpdconnection.h"
+#include "playqueuemodel.h"
+#include <QString>
+#include <QVariant>
+#include <QMimeData>
+#include <QLocale>
+#include <QUrl>
+#if QT_VERSION >= 0x050000
+#include <QUrlQuery>
+#endif
+#if defined ENABLE_MODEL_TEST
+#include "modeltest.h"
+#endif
+
+QString SearchModel::headerText(int col)
+{
+    switch (col) {
+    case COL_DISC:   return PlayQueueModel::headerText(PlayQueueModel::COL_DISC);
+    case COL_TITLE:  return PlayQueueModel::headerText(PlayQueueModel::COL_TITLE);
+    case COL_ARTIST: return PlayQueueModel::headerText(PlayQueueModel::COL_ARTIST);
+    case COL_ALBUM:  return PlayQueueModel::headerText(PlayQueueModel::COL_ALBUM);
+    case COL_LENGTH: return PlayQueueModel::headerText(PlayQueueModel::COL_LENGTH);
+    case COL_YEAR:   return PlayQueueModel::headerText(PlayQueueModel::COL_YEAR);
+    case COL_GENRE:  return PlayQueueModel::headerText(PlayQueueModel::COL_GENRE);
+    default:         return QString();
+    }
+}
+
+SearchModel::SearchModel(QObject *parent)
+    : ActionModel(parent)
+    , multiCol(false)
+    , currentId(0)
+{
+    connect(this, SIGNAL(search(QString,QString,int)), MPDConnection::self(), SLOT(search(QString,QString,int)));
+    connect(MPDConnection::self(), SIGNAL(searchResponse(int,QList<Song>)), this, SLOT(searchFinished(int,QList<Song>)));
+}
+
+SearchModel::~SearchModel()
+{
+    clear();
+}
+
+QModelIndex SearchModel::index(int row, int col, const QModelIndex &parent) const
+{
+    if (!hasIndex(row, col, parent)) {
+        return QModelIndex();
+    }
+
+    return row<songList.count() ? createIndex(row, col, (void *)(&songList.at(row))) : QModelIndex();
+}
+
+QModelIndex SearchModel::parent(const QModelIndex &index) const
+{
+    Q_UNUSED(index)
+    return QModelIndex();
+}
+
+QVariant SearchModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+    if (Qt::Horizontal==orientation) {
+        switch (role) {
+        case Qt::DisplayRole:
+            return headerText(section);
+        case Qt::TextAlignmentRole:
+            switch (section) {
+            case COL_TITLE:
+            case COL_ARTIST:
+            case COL_ALBUM:
+            case COL_GENRE:
+            default:
+                return int(Qt::AlignVCenter|Qt::AlignLeft);
+            case COL_LENGTH:
+            case COL_DISC:
+            case COL_YEAR:
+                return int(Qt::AlignVCenter|Qt::AlignRight);
+            }
+        case TableView::Role_Hideable:
+            return COL_YEAR==section || COL_DISC==section || COL_GENRE==section ? true : false;
+        case TableView::Role_Width:
+            switch (section) {
+            case COL_DISC:   return 0.03;
+            case COL_TITLE:  return 0.375;
+            case COL_ARTIST: return 0.27;
+            case COL_ALBUM:  return 0.27;
+            case COL_LENGTH: return 0.05;
+            case COL_YEAR:   return 0.05;
+            case COL_GENRE:  return 0.115;
+            }
+        default:
+            break;
+        }
+    }
+    return QVariant();
+}
+
+
+int SearchModel::rowCount(const QModelIndex &parent) const
+{
+    return parent.isValid() ? 0 : songList.count();
+}
+
+QVariant SearchModel::data(const QModelIndex &index, int role) const
+{
+    const Song *song = toSong(index);
+
+    if (!song) {
+        return QVariant();
+    }
+    
+    switch (role) {
+    case Qt::DecorationRole:
+        if (multiCol) {
+            return QVariant();
+        }
+        return Song::Playlist==song->type
+                ? Icons::self()->playlistIcon
+                : song->isStream()
+                  ? Icons::self()->streamIcon
+                  : Icons::self()->audioFileIcon;
+    case Qt::TextAlignmentRole:
+        switch (index.column()) {
+        case COL_TITLE:
+        case COL_ARTIST:
+        case COL_ALBUM:
+        case COL_GENRE:
+        default:
+            return int(Qt::AlignVCenter|Qt::AlignLeft);
+        case COL_LENGTH:
+        case COL_DISC:
+        case COL_YEAR:
+            return int(Qt::AlignVCenter|Qt::AlignRight);
+        }
+    case Qt::DisplayRole:
+        if (multiCol) {
+            switch (index.column()) {
+            case COL_TITLE:
+                return song->title.isEmpty() ? Utils::getFile(song->file) : song->trackAndTitleStr(Song::isVariousArtists(song->albumArtist()));;
+            case COL_ARTIST:
+                return song->artist.isEmpty() ? Song::unknown() : song->artist;
+            case COL_ALBUM:
+                return song->album.isEmpty() && !song->name.isEmpty() && song->isStream() ? song->name : song->album;
+            case COL_LENGTH:
+                return Song::formattedTime(song->time);
+            case COL_DISC:
+                if (song->disc <= 0) {
+                    return QVariant();
+                }
+                return song->disc;
+            case COL_YEAR:
+                if (song->year <= 0) {
+                    return QVariant();
+                }
+                return song->year;
+            case COL_GENRE:
+                return song->genre;
+            default:
+                break;
+            }
+            break;
+        }
+    case Qt::ToolTipRole: {
+        QString text=song->entryName();
+
+        if (Qt::ToolTipRole==role) {
+            text=text.replace("\n", "<br/>");
+            if (!song->title.isEmpty()) {
+                text+=QLatin1String("<br/>")+Song::formattedTime(song->time);
+                text+=QLatin1String("<br/><small><i>")+song->file+QLatin1String("</i></small>");
+            }
+        }
+        return text;
+    }
+    case ItemView::Role_MainText:
+        return song->title.isEmpty() ? song->file : song->trackAndTitleStr();
+    case ItemView::Role_SubText:
+        return song->artist+QLatin1String(" - ")+song->album;
+    default:
+        return ActionModel::data(index, role);
+    }
+    return QVariant();
+}
+
+Qt::ItemFlags SearchModel::flags(const QModelIndex &index) const
+{
+    if (index.isValid()) {
+        return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled;
+    } else {
+        return Qt::NoItemFlags;
+    }
+}
+
+QStringList SearchModel::filenames(const QModelIndexList &indexes, bool allowPlaylists) const
+{
+    QList<Song> list=songs(indexes, allowPlaylists);
+    QStringList fnames;
+    foreach (const Song &s, list) {
+        fnames.append(s.file);
+    }
+    return fnames;
+}
+
+QList<Song> SearchModel::songs(const QModelIndexList &indexes, bool allowPlaylists) const
+{
+    QList<Song> list;
+    foreach(QModelIndex index, indexes) {
+        Song *song=static_cast<Song *>(index.internalPointer());
+        if ((allowPlaylists || Song::Playlist!=song->type) && !list.contains(*song)) {
+            list << *song;
+        }
+    }
+    return list;
+}
+
+QMimeData * SearchModel::mimeData(const QModelIndexList &indexes) const
+{
+    QMimeData *mimeData = new QMimeData();
+    PlayQueueModel::encode(*mimeData, PlayQueueModel::constFileNameMimeType, filenames(indexes, true));
+    return mimeData;
+}
+
+QStringList SearchModel::mimeTypes() const
+{
+    QStringList types;
+    types << PlayQueueModel::constFileNameMimeType;
+    return types;
+}
+
+void SearchModel::refresh()
+{
+    QString k=currentKey;
+    QString v=currentValue;
+    clear();
+    search(k, v);
+}
+
+void SearchModel::clear()
+{
+    if (!songList.isEmpty()) {
+        beginRemoveRows(QModelIndex(), 0, songList.count()-1);
+        songList.clear();
+        endRemoveRows();
+    }
+    currentKey=currentValue=QString();
+    currentId++;
+    emit statsUpdated(0, 0);
+}
+
+void SearchModel::search(const QString &key, const QString &value)
+{
+    if (key==currentKey && value==currentValue) {
+        return;
+    }
+    emit searching();
+    clear();
+    currentKey=key;
+    currentValue=value;
+    currentId++;
+    emit search(key, value, currentId);
+}
+
+void SearchModel::searchFinished(int id, const QList<Song> &result)
+{
+    if (id!=currentId) {
+        return;
+    }
+
+    beginResetModel();
+    songList.clear();
+    songList=result;
+    endResetModel();
+    quint32 time=0;
+    foreach (const Song &s, songList) {
+        time+=s.time;
+    }
+
+    emit statsUpdated(songList.size(), time);
+    emit searched();
+}
diff --git a/models/searchmodel.h b/models/searchmodel.h
new file mode 100644
index 0000000..117762c
--- /dev/null
+++ b/models/searchmodel.h
@@ -0,0 +1,94 @@
+/*
+ * Cantata
+ *
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
+ *
+ * ----
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef SEARCH_MODEL_H
+#define SEARCH_MODEL_H
+
+#include "song.h"
+#include "actionmodel.h"
+#include <QList>
+
+class SearchModel : public ActionModel
+{
+    Q_OBJECT
+
+public:
+
+    enum Columns
+    {
+        COL_TITLE,
+        COL_ARTIST,
+        COL_ALBUM,
+        COL_DISC,
+        COL_LENGTH,
+        COL_YEAR,
+        COL_GENRE,
+
+        COL_COUNT
+    };
+
+    static QString headerText(int col);
+
+    SearchModel(QObject *parent = 0);
+    ~SearchModel();
+    QModelIndex index(int, int, const QModelIndex & = QModelIndex()) const;
+    QModelIndex parent(const QModelIndex &) const;
+    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
+    int rowCount(const QModelIndex &parent = QModelIndex()) const;
+    int columnCount(const QModelIndex &) const { return COL_COUNT; }
+    QVariant data(const QModelIndex &, int) const;
+    Qt::ItemFlags flags(const QModelIndex &index) const;
+
+    QStringList filenames(const QModelIndexList &indexes, bool allowPlaylists=false) const;
+    QList<Song> songs(const QModelIndexList &indexes, bool allowPlaylists=false) const;
+    QMimeData * mimeData(const QModelIndexList &indexes) const;
+    QStringList mimeTypes() const;
+
+    void refresh();
+    void clear();
+    void search(const QString &key, const QString &value);
+    void setMultiColumn(bool m) { multiCol=m; }
+
+Q_SIGNALS:
+    void searching();
+    void searched();
+    void statsUpdated(int songs, quint32 time);
+
+    void search(const QString &field, const QString &value, int id);
+
+private Q_SLOTS:
+    void searchFinished(int id, const QList<Song> &result);
+
+private:
+    void clearItems();
+    const Song * toSong(const QModelIndex &index) const { return index.isValid() ? static_cast<const Song *>(index.internalPointer()) : 0; }
+
+private:
+    bool multiCol;
+    QList<Song> songList;
+    int currentId;
+    QString currentKey;
+    QString currentValue;
+};
+
+#endif
diff --git a/widgets/toolbar.cpp b/models/searchproxymodel.cpp
similarity index 59%
rename from widgets/toolbar.cpp
rename to models/searchproxymodel.cpp
index 706711c..c1dc230 100644
--- a/widgets/toolbar.cpp
+++ b/models/searchproxymodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -20,25 +20,20 @@
  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301, USA.
  */
+#include "searchproxymodel.h"
 
-#include "toolbar.h"
-#include <QStyleOption>
-#include <QStyle>
-#include <QPainter>
-
-ToolBar::ToolBar(QWidget *parent)
-    : QWidget(parent)
+SearchProxyModel::SearchProxyModel(QObject *parent)
+    : ProxyModel(parent)
 {
-    //setStyleSheet("ToolBar{ background-color : qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #3c3b37, stop: 1 #474641); }");
+    setDynamicSortFilter(true);
+    setFilterCaseSensitivity(Qt::CaseInsensitive);
+    setSortCaseSensitivity(Qt::CaseInsensitive);
+    setSortLocaleAware(true);
+    sort(0);
 }
 
-void ToolBar::paintEvent(QPaintEvent *e)
+bool SearchProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
 {
-    QWidget::paintEvent(e);
-    QStyleOption opt;
-    opt.init(this);
-    QPainter p(this);
-    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
+    return *static_cast<const Song *>(left.internalPointer()) < *static_cast<const Song *>(right.internalPointer());
 }
 
-
diff --git a/dynamic/dynamicproxymodel.h b/models/searchproxymodel.h
similarity index 74%
copy from dynamic/dynamicproxymodel.h
copy to models/searchproxymodel.h
index a4a75e2..296aa5e 100644
--- a/dynamic/dynamicproxymodel.h
+++ b/models/searchproxymodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -21,16 +21,16 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef DYNAMICPROXYMODEL_H
-#define DYNAMICPROXYMODEL_H
+#ifndef SEARCHPROXYMODEL_H
+#define SEARCHPROXYMODEL_H
 
 #include "proxymodel.h"
 
-class DynamicProxyModel : public ProxyModel
+class SearchProxyModel : public ProxyModel
 {
 public:
-    DynamicProxyModel(QObject *parent = 0);
-    bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
+    SearchProxyModel(QObject *parent = 0);
+    bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
 };
 
 #endif
diff --git a/models/streamsearchmodel.cpp b/models/streamsearchmodel.cpp
index d0fab4e..f11f250 100644
--- a/models/streamsearchmodel.cpp
+++ b/models/streamsearchmodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -334,9 +334,7 @@ void StreamSearchModel::cancelAll()
     if (!jobs.isEmpty()) {
         QList<NetworkJob *> jobList=jobs.keys();
         foreach (NetworkJob *j, jobList) {
-            j->abort();
-            j->deleteLater();
-            disconnect(j, SIGNAL(finished()), this, SLOT(jobFinished()));
+            j->cancelAndDelete();
         }
         jobs.clear();
         emit loaded();
diff --git a/models/streamsearchmodel.h b/models/streamsearchmodel.h
index b445d97..275bc40 100644
--- a/models/streamsearchmodel.h
+++ b/models/streamsearchmodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/models/streamsmodel.cpp b/models/streamsmodel.cpp
index 26ecaac..2ff8562 100644
--- a/models/streamsmodel.cpp
+++ b/models/streamsmodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -22,13 +22,16 @@
  */
 
 #include "streamsmodel.h"
+#include "mpdconnection.h"
+#include "mpdparseutils.h"
+#include <QUrl>
+
+#ifdef ENABLE_STREAMS
 #include "icons.h"
 #include "networkaccessmanager.h"
 #include "localize.h"
 #include "qtplural.h"
 #include "utils.h"
-#include "mpdconnection.h"
-#include "mpdparseutils.h"
 #include "settings.h"
 #include "playqueuemodel.h"
 #include "itemview.h"
@@ -85,7 +88,6 @@ StreamsModel * StreamsModel::self()
     #endif
 }
 
-const QString StreamsModel::constPrefix=QLatin1String("cantata-");
 const QString StreamsModel::constSubDir=QLatin1String("streams");
 const QString StreamsModel::constCacheExt=QLatin1String(".xml.gz");
 
@@ -585,7 +587,7 @@ StreamsModel::StreamsModel(QObject *parent)
     root->children.append(new DiCategoryItem(constRockRadioUrl, i18n("RockRadio.com"), root, getIcon("rockradio"), "rockradio"));
     root->children.append(new DiCategoryItem(constSkyFmUrl, i18n("Sky.fm"), root, getIcon("skyfm"), "skyfm"));
     favourites=new FavouritesCategoryItem(constFavouritesUrl, i18n("Favorites"), root, getIcon("favourites"));
-    listenLive=new ListenLiveCategoryItem(i18n("Listen Live"), root, getIcon("listenlive"));
+    listenLive=new ListenLiveCategoryItem(i18n("Listen Live"), root, false, getIcon("listenlive"));
     listenLive->configName="listenlive";
     root->children.append(listenLive);
     root->children.append(favourites);
@@ -1027,17 +1029,6 @@ QModelIndex StreamsModel::favouritesIndex() const
     return createIndex(root->children.indexOf(favourites), 0, (void *)favourites);
 }
 
-bool StreamsModel::validProtocol(const QString &file)
-{
-    QString scheme=QUrl(file).scheme();
-    return scheme.isEmpty() || MPDConnection::self()->urlHandlers().contains(scheme);
-}
-
-QString StreamsModel::modifyUrl(const QString &u, bool addPrefix, const QString &name)
-{
-    return MPDParseUtils::addStreamName(!addPrefix || !u.startsWith("http:") ? u : (constPrefix+u), name);
-}
-
 static QString addDiHash(const StreamsModel::Item *item)
 {
     return item->parent && constDiUrls.contains(item->parent->url)
@@ -1177,6 +1168,9 @@ void StreamsModel::jobFinished()
 
     if (jobs.contains(job)) {
         CategoryItem *cat=jobs[job];
+        if (!cat) {
+            return;
+        }
         cat->state=CategoryItem::Fetched;
         jobs.remove(job);
 
@@ -1203,7 +1197,7 @@ void StreamsModel::jobFinished()
                 }
             }
 
-            if (cat && cat->parent==root && cat->supportsBookmarks) {
+            if (cat->parent==root && cat->supportsBookmarks) {
                 QList<Item *> bookmarks=cat->loadBookmarks();
                 if (bookmarks.count()) {
                     CategoryItem *bookmarksCat=cat->getBookmarksCategory();
@@ -1542,6 +1536,17 @@ struct ListenLiveStream {
         }
     }
 
+    const QString bitrateStr() const { return QString("%1kb/s").arg(bitrate); }
+    const QString formatStr() const {
+        switch (format) {
+        case MP3: return QLatin1String("MP3 ")+bitrateStr();
+        case AAC: return QLatin1String("AAC ")+bitrateStr();
+        case OGG: return QLatin1String("OGG ")+bitrateStr();
+        case WMA: return QLatin1String("WMA ")+bitrateStr();
+        default: return bitrateStr();
+        }
+    }
+
     QString url;
     Format format;
     unsigned int bitrate;
@@ -1578,7 +1583,7 @@ QList<StreamsModel::Item *> StreamsModel::parseListenLiveResponse(QIODevice *dev
         ListenLiveStationEntry entry;
 
         while (!dev->atEnd()) {
-            QString line=dev->readLine().trimmed().replace("> <", "><").replace("<td><b><a href", "<td><a href")
+            QString line=QString::fromUtf8(dev->readLine()).trimmed().replace("> <", "><").replace("<td><b><a href", "<td><a href")
                                                   .replace("</b></a></b>", "</b></a>").replace("<br />", "<br/>")
                                                   .replace("</a> ,", "</a>,");
             if ("<tr>"==line) {
@@ -1631,26 +1636,39 @@ QList<StreamsModel::Item *> StreamsModel::parseListenLiveResponse(QIODevice *dev
             } else if ("</tr>"==line) {
                 if (entry.streams.count()) {
                     qSort(entry.streams);
-                    QString name;
-                    QString url=entry.streams.at(0).url;
-
-                    if (QLatin1String("National")==entry.location || entry.name.endsWith("("+entry.location+")")) {
-                        name=entry.name;
-                    } else if (entry.name.endsWith(")")) {
-                        name=entry.name.left(entry.name.length()-1)+", "+entry.location+")";
-                    } else {
-                        name=entry.name+" ("+entry.location+")";
-                    }
+                    bool multiple=entry.streams.count()>1;
+                    foreach (const ListenLiveStream &stream, entry.streams) {
+                        if (!stream.url.contains("://")) {
+                            continue;
+                        }
+                        QString name;
+
+                        if (QLatin1String("National")==entry.location || entry.name.endsWith(QLatin1Char('(')+entry.location+QLatin1Char(')'))) {
+                            name=entry.name;
+                        } else if (entry.name.endsWith(QLatin1Char(')'))) {
+                            name=entry.name.left(entry.name.length()-1)+QLatin1String(", ")+entry.location+QLatin1Char(')');
+                        } else {
+                            name=entry.name+QLatin1String(" (")+entry.location+QLatin1Char(')');
+                        }
 
-                    if (!names.contains(name) && !name.isEmpty() && url.contains("://")) {
-                        QStringList stationGenres=fixGenres(entry.comment);
-                        if (stationGenres.isEmpty()) {
-                            stationGenres.append(i18n("Other"));
+                        if (!name.isEmpty() && multiple) {
+                            if (name.endsWith(QLatin1Char(')'))) {
+                                name=name.left(name.length()-1)+QLatin1String(", ");
+                            } else {
+                                name+=QLatin1String(" (");
+                            }
+                            name+=stream.formatStr()+QLatin1Char(')');
                         }
-                        foreach (const QString &g, stationGenres) {
-                            genres[g].append(new Item(url, name, cat));
+                        if (!names.contains(name) && !name.isEmpty()) {
+                            QStringList stationGenres=fixGenres(entry.comment);
+                            if (stationGenres.isEmpty()) {
+                                stationGenres.append(i18n("Other"));
+                            }
+                            foreach (const QString &g, stationGenres) {
+                                genres[g].append(new Item(stream.url, name, cat));
+                            }
+                            names.insert(name);
                         }
-                        names.insert(name);
                     }
                 }
             }
@@ -1887,7 +1905,7 @@ void StreamsModel::buildListenLive(const QModelIndex &index)
                                                              region, QIcon(), cache));
                 } else if (QLatin1String("region")==doc.name()) {
                     prevRegion=region;
-                    region=new ListenLiveCategoryItem(doc.attributes().value("name").toString(), prevRegion);
+                    region=new ListenLiveCategoryItem(doc.attributes().value("name").toString(), prevRegion, false);
                     region->state=CategoryItem::Fetched;
                     prevRegion->children.append(region);
                 }
@@ -1980,3 +1998,18 @@ QModelIndex StreamsModel::categoryIndex(const CategoryItem *cat) const
     int row=root->children.indexOf(const_cast<CategoryItem *>(cat));
     return -1==row ? QModelIndex() : createIndex(row, 0, (void *)cat);
 }
+
+#endif // ENABLE_STREAMS
+
+const QString StreamsModel::constPrefix=QLatin1String("cantata-stream-");
+
+//bool StreamsModel::validProtocol(const QString &file)
+//{
+//    QString scheme=QUrl(file).scheme();
+//    return scheme.isEmpty() || MPDConnection::self()->urlHandlers().contains(scheme);
+//}
+
+QString StreamsModel::modifyUrl(const QString &u, bool addPrefix, const QString &name)
+{
+    return MPDParseUtils::addStreamName(!addPrefix || !u.startsWith("http:") ? u : (constPrefix+u), name);
+}
diff --git a/models/streamsmodel.h b/models/streamsmodel.h
index 56fdda2..ae219e4 100644
--- a/models/streamsmodel.h
+++ b/models/streamsmodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -25,6 +25,9 @@
 #define STREAMSMODEL_H
 
 #include "actionmodel.h"
+#include "config.h"
+
+#ifdef ENABLE_STREAMS
 #include <QIcon>
 #include <QList>
 #include <QMap>
@@ -133,9 +136,12 @@ public:
 
     struct ListenLiveCategoryItem : public CategoryItem
     {
-        ListenLiveCategoryItem(const QString &n, CategoryItem *p, const QIcon &i=QIcon())
-            : CategoryItem(QLatin1String("-"), n, p, i) { }
+        ListenLiveCategoryItem(const QString &n, CategoryItem *p, bool r=true, const QIcon &i=QIcon())
+            : CategoryItem(QLatin1String("-"), n, p, i), reloadable(r) { }
         void removeCache();
+        bool canReload() const { return reloadable; }
+    private:
+        bool reloadable;
     };
 
     struct DiCategoryItem : public CategoryItem
@@ -183,7 +189,7 @@ public:
     static StreamsModel * self();
     static QString favouritesDir();
     static QString modifyUrl(const QString &u,  bool addPrefix=true, const QString &name=QString());
-    static bool validProtocol(const QString &file);
+//    static bool validProtocol(const QString &file);
 
     StreamsModel(QObject *parent = 0);
     ~StreamsModel();
@@ -286,4 +292,13 @@ private:
     QList<Item *> hiddenCategories;
 };
 
+#else
+namespace StreamsModel
+{
+    extern const QString constPrefix;
+    extern QString modifyUrl(const QString &u,  bool addPrefix=true, const QString &name=QString());
+    extern bool validProtocol(const QString &file);
+}
+
+#endif // ENABLE_STREAMS
 #endif
diff --git a/models/streamsproxymodel.cpp b/models/streamsproxymodel.cpp
index 464b849..9af654c 100644
--- a/models/streamsproxymodel.cpp
+++ b/models/streamsproxymodel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/models/streamsproxymodel.h b/models/streamsproxymodel.h
index 20f4441..9b020fd 100644
--- a/models/streamsproxymodel.h
+++ b/models/streamsproxymodel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/mpd/cuefile.cpp b/mpd/cuefile.cpp
index 8eb72db..cf0bc0b 100644
--- a/mpd/cuefile.cpp
+++ b/mpd/cuefile.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This file is part of Clementine.
@@ -69,12 +69,12 @@ QByteArray CueFile::getLoadLine(const QString &str)
     #endif
 
     if (q.hasQueryItem("pos")) {
-        QString pos=q.queryItemValue("pos");
+        int pos=q.queryItemValue("pos").toInt();
         QString path=u.path();
         if (path.startsWith("/")) {
             path=path.mid(1);
         }
-        return MPDConnection::encodeName(path)+" "+pos.toLatin1()+":"+QString::number(pos.toInt()+1).toLatin1();
+        return MPDConnection::encodeName(path)+" "+MPDConnection::quote(pos)+":"+MPDConnection::quote(pos+1);
     }
     return MPDConnection::encodeName(str);
 }
diff --git a/mpd/cuefile.h b/mpd/cuefile.h
index de1535a..5f3367c 100644
--- a/mpd/cuefile.h
+++ b/mpd/cuefile.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This file is part of Clementine.
diff --git a/mpd/httpstream.cpp b/mpd/httpstream.cpp
new file mode 100644
index 0000000..3afaf58
--- /dev/null
+++ b/mpd/httpstream.cpp
@@ -0,0 +1,125 @@
+/*
+ * Cantata
+ *
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
+ *
+ * ----
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "httpstream.h"
+#include "mpdconnection.h"
+#include "mpdstatus.h"
+#if QT_VERSION < 0x050000
+#include <phonon/audiooutput.h>
+#endif
+
+HttpStream::HttpStream(QObject *p)
+    : QObject(p)
+    , enabled(false)
+    , state(MPDState_Inactive)
+    , player(0)
+{
+}
+
+void HttpStream::setEnabled(bool e)
+{
+    if (e==enabled) {
+        return;
+    }
+   
+    enabled=e; 
+    if (enabled) {
+        connect(MPDConnection::self(), SIGNAL(streamUrl(QString)), this, SLOT(streamUrl(QString)));
+        connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(updateStatus()));
+        streamUrl(MPDConnection::self()->getDetails().streamUrl);
+    } else {
+        disconnect(MPDConnection::self(), SIGNAL(streamUrl(QString)), this, SLOT(streamUrl(QString)));
+        disconnect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(updateStatus()));
+        if (player) {
+            player->stop();
+        }
+    }
+}
+
+void HttpStream::streamUrl(const QString &url)
+{
+    MPDStatus * const status = MPDStatus::self();
+    static const char *constUrlProperty="url";
+    if (player && player->property(constUrlProperty).toString()!=url) {
+        player->stop();
+        player->deleteLater();
+        player=0;
+    }
+    if (!url.isEmpty() && !player) {
+        #if QT_VERSION < 0x050000
+        player=new Phonon::MediaObject(this);
+        Phonon::createPath(player, new Phonon::AudioOutput(Phonon::MusicCategory, this));
+        player->setCurrentSource(url);
+        #else
+        player=new QMediaPlayer(this);
+        player->setMedia(QUrl(url));
+        #endif
+        player->setProperty(constUrlProperty, url);
+    }
+
+    if (player) {
+        state=status->state();
+        switch (status->state()) {
+        case MPDState_Playing:
+            player->play();
+            break;
+        case MPDState_Inactive:
+        case MPDState_Stopped:
+            player->stop();
+        break;
+        case MPDState_Paused:
+            player->pause();
+        default:
+        break;
+        }
+    } else {
+        state=MPDState_Inactive;
+    }
+}
+
+void HttpStream::updateStatus()
+{
+    if (!player) {
+        return;
+    }
+
+    MPDStatus * const status = MPDStatus::self();
+    if (status->state()==state) {
+        return;
+    }
+
+    state=status->state();
+    switch (status->state()) {
+    case MPDState_Playing:
+        player->play();
+        break;
+    case MPDState_Inactive:
+    case MPDState_Stopped:
+        player->stop();
+        break;
+    case MPDState_Paused:
+        player->pause();
+    default:
+        break;
+    }
+}
diff --git a/gui/multimediakeysinterface.h b/mpd/httpstream.h
similarity index 59%
copy from gui/multimediakeysinterface.h
copy to mpd/httpstream.h
index 6ddbb8b..39fbeae 100644
--- a/gui/multimediakeysinterface.h
+++ b/mpd/httpstream.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -21,32 +21,41 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef MULTI_MEDIA_KEYS_INTERFACE_H
-#define MULTI_MEDIA_KEYS_INTERFACE_H
+#ifndef HTTP_STREAM_H
+#define HTTP_STREAM_H
 
 #include <QObject>
 
-class MultiMediaKeysInterface : public QObject
+#if QT_VERSION < 0x050000
+#include <phonon/mediaobject.h>
+#else
+#include <QtMultimedia/QMediaPlayer>
+#endif
+
+class HttpStream : public QObject
 {
     Q_OBJECT
+    
 public:
-    MultiMediaKeysInterface(QObject *p) : QObject(p), enabled(false) { }
-    ~MultiMediaKeysInterface() { }
-
-    void setEnabled(bool e) { activate(e); enabled=e; }
-    bool isEnabled() const { return enabled; }
-
+    HttpStream(QObject *p);
+    virtual ~HttpStream() { }
+    
+public Q_SLOTS:
+    void setEnabled(bool e);
+    
+private Q_SLOTS:
+    void updateStatus();
+    void streamUrl(const QString &url);
+    
 private:
-    virtual void activate(bool a)=0;
-
-Q_SIGNALS:
-    void playPause();
-    void stop();
-    void next();
-    void previous();
-
-protected:
     bool enabled;
+    int state;
+    #if QT_VERSION < 0x050000
+    Phonon::MediaObject *player;
+    #else
+    QMediaPlayer *player;
+    #endif    
 };
 
 #endif
+
diff --git a/mpd/mpdconnection.cpp b/mpd/mpdconnection.cpp
index 0d60907..9086ea5 100644
--- a/mpd/mpdconnection.cpp
+++ b/mpd/mpdconnection.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -26,6 +26,7 @@
 
 #include "mpdconnection.h"
 #include "mpdparseutils.h"
+#include "musiclibraryitemroot.h"
 #include "mpduser.h"
 #include "localize.h"
 #include "utils.h"
@@ -52,11 +53,28 @@ void MPDConnection::enableDebug()
 
 static const int constSocketCommsTimeout=2000;
 static const int constMaxReadAttempts=4;
+static int maxFilesPerAddCommand=10000;
+static bool alwaysUseLsInfo=false;
 
 #ifdef ENABLE_KDE_SUPPORT
 K_GLOBAL_STATIC(MPDConnection, conn)
 #endif
 
+static inline int socketTimeout(int dataSize)
+{
+    static const int constDataBlock=100000;
+    return ((dataSize/constDataBlock)+((dataSize%constDataBlock) ? 1 : 0))*constSocketCommsTimeout;
+}
+
+static QByteArray log(const QByteArray &data)
+{
+    if (data.length()<256) {
+        return data;
+    } else {
+        return data.left(96) + "... ..." + data.right(96) + " (" + QByteArray::number(data.length()) + " bytes)";
+    }
+}
+
 MPDConnection * MPDConnection::self()
 {
     #ifdef ENABLE_KDE_SUPPORT
@@ -70,6 +88,11 @@ MPDConnection * MPDConnection::self()
     #endif
 }
 
+QByteArray MPDConnection::quote(int val)
+{
+    return '\"'+QByteArray::number(val)+'\"';
+}
+
 QByteArray MPDConnection::encodeName(const QString &name)
 {
     return '\"'+name.toUtf8().replace("\\", "\\\\").replace("\"", "\\\"")+'\"';
@@ -78,12 +101,11 @@ QByteArray MPDConnection::encodeName(const QString &name)
 static QByteArray readFromSocket(MpdSocket &socket)
 {
     QByteArray data;
-
     while (QAbstractSocket::ConnectedState==socket.state()) {
         int attempt=0;
         while (0==socket.bytesAvailable() && QAbstractSocket::ConnectedState==socket.state()) {
             DBUG << (void *)(&socket) << "Waiting for read data." << attempt;
-            if (socket.waitForReadyRead(constSocketCommsTimeout)) {
+            if (socket.waitForReadyRead()) {
                 break;
             }
             if (++attempt>=constMaxReadAttempts) {
@@ -99,11 +121,7 @@ static QByteArray readFromSocket(MpdSocket &socket)
             break;
         }
     }
-    if (data.size()>256) {
-        DBUG << (void *)(&socket) << "Read (bytes):" << data.size();
-    } else {
-        DBUG << (void *)(&socket) << "Read:" << data;
-    }
+    DBUG << (void *)(&socket) << "Read:" << log(data);
 
     return data;
 }
@@ -183,6 +201,7 @@ MPDConnection::MPDConnection()
     , currentSongId(-1)
     , songPos(0)
     , unmuteVol(-1)
+    , mopidy(false)
 {
     qRegisterMetaType<Song>("Song");
     qRegisterMetaType<Output>("Output");
@@ -192,6 +211,7 @@ MPDConnection::MPDConnection()
     qRegisterMetaType<QList<Playlist> >("QList<Playlist>");
     qRegisterMetaType<QList<quint32> >("QList<quint32>");
     qRegisterMetaType<QList<qint32> >("QList<qint32>");
+    qRegisterMetaType<QList<quint8> >("QList<quint8>");
     qRegisterMetaType<QSet<qint32> >("QSet<qint32>");
     qRegisterMetaType<QAbstractSocket::SocketState >("QAbstractSocket::SocketState");
     qRegisterMetaType<MPDStatsValues>("MPDStatsValues");
@@ -200,6 +220,8 @@ MPDConnection::MPDConnection()
     #ifdef QT_QTDBUS_FOUND
     connect(PowerManagement::self(), SIGNAL(resuming()), this, SLOT(reconnect()));
     #endif
+    maxFilesPerAddCommand=Settings::self()->mpdListSize();
+    alwaysUseLsInfo=Settings::self()->alwaysUseLsInfo();
 }
 
 MPDConnection::~MPDConnection()
@@ -259,7 +281,7 @@ MPDConnection::ConnectionReturn MPDConnection::connectToMPD(MpdSocket &socket, b
             playQueueIds.clear();
             emit cantataStreams(QList<Song>(), false);
             int min, maj, patch;
-            if (3==sscanf(&(recvdata.constData()[7]), "%d.%d.%d", &maj, &min, &patch)) {
+            if (3==sscanf(&(recvdata.constData()[7]), "%3d.%3d.%3d", &maj, &min, &patch)) {
                 long v=((maj&0xFF)<<16)+((min&0xFF)<<8)+(patch&0xFF);
                 if (v!=ver) {
                     ver=v;
@@ -357,7 +379,7 @@ void MPDConnection::reconnect()
     switch (connectToMPD()) {
     case Success:
         getStatus();
-        getStats(false);
+        getStats();
         getUrlHandlers();
         getTagTypes();
         playListInfo();
@@ -412,13 +434,14 @@ void MPDConnection::setDetails(const MPDConnectionDetails &d)
         DBUG << "call connectToMPD";
         unmuteVol=-1;
         toggleStopAfterCurrent(false);
+        mopidy=false;
         if (isUser) {
             MPDUser::self()->start();
         }
         switch (connectToMPD()) {
         case Success:
             getStatus();
-            getStats(false);
+            getStats();
             getUrlHandlers();
             getTagTypes();
             emit stateChanged(true);
@@ -452,17 +475,17 @@ void MPDConnection::setDetails(const MPDConnectionDetails &d)
     }
 }
 
-void MPDConnection::disconnectMpd()
-{
-    if (State_Connected==state) {
-        disconnectFromMPD();
-        emit stateChanged(false);
-    }
-}
+//void MPDConnection::disconnectMpd()
+//{
+//    if (State_Connected==state) {
+//        disconnectFromMPD();
+//        emit stateChanged(false);
+//    }
+//}
 
 MPDConnection::Response MPDConnection::sendCommand(const QByteArray &command, bool emitErrors, bool retry)
 {
-    DBUG << (void *)(&sock) << "sendCommand:" << command << emitErrors << retry;
+    DBUG << (void *)(&sock) << "sendCommand:" << log(command) << emitErrors << retry;
 
     if (!isConnected()) {
         emit error(i18n("Failed to send command to %1 - not connected", details.description()), true);
@@ -482,16 +505,20 @@ MPDConnection::Response MPDConnection::sendCommand(const QByteArray &command, bo
 
     Response response;
     if (-1==sock.write(command+"\n")) {
+        DBUG << "Failed to write";
         // If we fail to write, dont wait for bytes to be written!!
         response=Response(false);
         sock.close();
     } else {
-        sock.waitForBytesWritten(constSocketCommsTimeout);
+        int timeout=socketTimeout(command.length());
+        DBUG << "Timeout (ms):" << timeout;
+        sock.waitForBytesWritten(timeout);
+        DBUG << "Socket state after write:" << (int)sock.state();
         response=readReply(sock);
     }
 
     if (!response.ok) {
-        DBUG << command << "failed";
+        DBUG << log(command) << "failed";
         if (response.data.isEmpty() && retry && QAbstractSocket::ConnectedState!=sock.state()) {
             // Try one more time...
             // This scenario, where socket seems to be closed during/after 'write' seems to occiu more often
@@ -499,24 +526,37 @@ MPDConnection::Response MPDConnection::sendCommand(const QByteArray &command, bo
             return sendCommand(command, emitErrors, false);
         }
         if (emitErrors) {
-            if ((command.startsWith("add ") || command.startsWith("command_list_begin\nadd ")) && -1!=command.indexOf("\"file:///")) {
-                if (details.isLocal() && -1!=response.data.indexOf("Permission denied")) {
-                    emit error(i18n("Failed to load. Please check user \"mpd\" has read permission."));
-                } else if (!details.isLocal() && -1!=response.data.indexOf("Access denied")) {
-                    emit error(i18n("Failed to load. MPD can only play local files if connected via a local socket."));
+            bool emitError=true;
+            // Mopidy returns "incorrect arguments" for commands it does not support. The docs state that crossfade and replaygain mode
+            // setting commands are not supported. So, if we get this error then just ignore it.
+            if ((command.startsWith("crossfade ") || command.startsWith("replay_gain_mode ")) &&
+                "incorrect arguments"==response.getError(command)) {
+                emitError=false;
+            }
+            if (emitError) {
+                if ((command.startsWith("add ") || command.startsWith("command_list_begin\nadd ")) && -1!=command.indexOf("\"file:///")) {
+                    if (details.isLocal() && -1!=response.data.indexOf("Permission denied")) {
+                        emit error(i18n("Failed to load. Please check user \"mpd\" has read permission."));
+                    } else if (!details.isLocal() && -1!=response.data.indexOf("Access denied")) {
+                        emit error(i18n("Failed to load. MPD can only play local files if connected via a local socket."));
+                    } else if (!response.getError(command).isEmpty()) {
+                        emit error(i18n("MPD reported the following error: %1", response.getError(command)));
+                    } else {
+                        disconnectFromMPD();
+                        emit stateChanged(false);
+                        emit error(i18n("Failed to send command. Disconnected from %1", details.description()), true);
+                    }
                 } else if (!response.getError(command).isEmpty()) {
                     emit error(i18n("MPD reported the following error: %1", response.getError(command)));
-                } else {
+                } /*else if ("listallinfo"==command && ver>=MPD_MAKE_VERSION(0,18,0)) {
+                    disconnectFromMPD();
+                    emit stateChanged(false);
+                    emit error(i18n("Failed to load library. Please increase \"max_output_buffer_size\" in MPD's config file."));
+                } */ else {
                     disconnectFromMPD();
                     emit stateChanged(false);
                     emit error(i18n("Failed to send command. Disconnected from %1", details.description()), true);
                 }
-            } else if (!response.getError(command).isEmpty()) {
-                emit error(i18n("MPD reported the following error: %1", response.getError(command)));
-            } else {
-                disconnectFromMPD();
-                emit stateChanged(false);
-                emit error(i18n("Failed to send command. Disconnected from %1", details.description()), true);
             }
         }
     }
@@ -541,64 +581,101 @@ void MPDConnection::add(const QStringList &files, bool replace, quint8 priority)
 
 void MPDConnection::add(const QStringList &files, quint32 pos, quint32 size, int action, quint8 priority)
 {
+    QList<quint8> prioList;
+    if (priority>0) {
+        prioList << priority;
+    }
+    add(files, pos, size, action, prioList);
+}
+
+void MPDConnection::add(const QStringList &origList, quint32 pos, quint32 size, int action, const QList<quint8> &priority)
+{
     toggleStopAfterCurrent(false);
     if (AddToEnd!=action) {
         clear();
         getStatus();
     }
 
-    QByteArray send = "command_list_begin\n";
+    QList<QStringList> fileLists;
+    if (priority.count()<=1 && origList.count()>maxFilesPerAddCommand) {
+        int numChunks=(origList.count()/maxFilesPerAddCommand)+(origList.count()%maxFilesPerAddCommand ? 1 : 0);
+        for (int i=0; i<numChunks; ++i) {
+            fileLists.append(origList.mid(i*maxFilesPerAddCommand, maxFilesPerAddCommand));
+        }
+    } else {
+        fileLists.append(origList);
+    }
+
     int curSize = size;
     int curPos = pos;
-//    bool addedFile=false;
+    //    bool addedFile=false;
     bool havePlaylist=false;
-    bool usePrio=priority>0 && canUsePriority();
+    bool usePrio=!priority.isEmpty() && canUsePriority() && (1==priority.count() || priority.count()==origList.count());
+    quint8 singlePrio=usePrio && 1==priority.count() ? priority.at(0) : 0;
     QStringList cStreamFiles;
+    bool sentOk=false;
 
-    for (int i = 0; i < files.size(); i++) {
-        QString fileName=files.at(i);
-        if (fileName.startsWith(QLatin1String("http://")) && fileName.contains(QLatin1String("cantata=song"))) {
-            cStreamFiles.append(fileName);
-        }
-        if (CueFile::isCue(fileName)) {
-            send += "load "+CueFile::getLoadLine(fileName)+"\n";
-        } else {
-            if (isPlaylist(fileName)) {
-                send+="load ";
-                havePlaylist=true;
-            } else {
-//                addedFile=true;
-                send += "add ";
+    if (usePrio && AddToEnd==action && 0==curPos) {
+        curPos=playQueueIds.size();
+    }
+
+    foreach (const QStringList &files, fileLists) {
+        QByteArray send = "command_list_begin\n";
+
+        for (int i = 0; i < files.size(); i++) {
+            QString fileName=files.at(i);
+            if (fileName.startsWith(QLatin1String("http://")) && fileName.contains(QLatin1String("cantata=song"))) {
+                cStreamFiles.append(fileName);
             }
-            send += encodeName(fileName)+"\n";
-        }
-        if (!havePlaylist) {
-            if (0!=size) {
-                send += "move "+QByteArray::number(curSize)+" "+QByteArray::number(curPos)+"\n";
+            if (CueFile::isCue(fileName)) {
+                send += "load "+CueFile::getLoadLine(fileName)+"\n";
+            } else {
+                if (isPlaylist(fileName)) {
+                    send+="load ";
+                    havePlaylist=true;
+                } else {
+                    //                addedFile=true;
+                    send += "add ";
+                }
+                send += encodeName(fileName)+"\n";
             }
-            if (usePrio && !havePlaylist) {
-                send += "prio "+QByteArray::number(priority)+" "+QByteArray::number(curPos)+" "+QByteArray::number(curPos)+"\n";
+            if (!havePlaylist) {
+                if (0!=size) {
+                    send += "move "+quote(curSize)+" "+quote(curPos)+"\n";
+                }
+                if (usePrio && !havePlaylist) {
+                    send += "prio "+quote(singlePrio || i>=priority.count() ? singlePrio : priority.at(i))+" "+quote(curPos)+" "+quote(curPos)+"\n";
+                }
             }
+            curSize++;
+            curPos++;
         }
-        curSize++;
-        curPos++;
-    }
 
-    send += "command_list_end";
+        send += "command_list_end";
+        sentOk=sendCommand(send).ok;
+        if (!sentOk) {
+            break;
+        }
+    }
 
-    if (sendCommand(send).ok) {
+    if (sentOk) {
         if (!cStreamFiles.isEmpty()) {
             emit cantataStreams(cStreamFiles);
         }
 
-        if (AddReplaceAndPlay==action /*&& addedFile */&& !files.isEmpty()) {
+        if (AddReplaceAndPlay==action /*&& addedFile */&& !origList.isEmpty()) {
             // Dont emit error if fail plays, might be that playlist was not loaded...
-            sendCommand("play "+QByteArray::number(0), false);
+            sendCommand("play "+quote(0), false);
         }
-        emit added(files);
+        emit added(origList);
     }
 }
 
+void MPDConnection::populate(const QStringList &files, const QList<quint8> &priority)
+{
+    add(files, 0, 0, AddAndReplace, priority);
+}
+
 void MPDConnection::addAndPlay(const QString &file)
 {
     toggleStopAfterCurrent(false);
@@ -607,7 +684,7 @@ void MPDConnection::addAndPlay(const QString &file)
         MPDStatusValues sv=MPDParseUtils::parseStatus(response.data);
         QByteArray send = "command_list_begin\n";
         send+="add "+encodeName(file)+"\n";
-        send+="play "+QByteArray::number(sv.playlistLength)+"\n";
+        send+="play "+quote(sv.playlistLength)+"\n";
         send+="command_list_end";
         sendCommand(send);
     }
@@ -628,9 +705,7 @@ void MPDConnection::removeSongs(const QList<qint32> &items)
     toggleStopAfterCurrent(false);
     QByteArray send = "command_list_begin\n";
     foreach (qint32 i, items) {
-        send += "deleteid ";
-        send += QByteArray::number(i);
-        send += "\n";
+        send += "deleteid "+quote(i)+"\n";
     }
 
     send += "command_list_end";
@@ -640,7 +715,7 @@ void MPDConnection::removeSongs(const QList<qint32> &items)
 void MPDConnection::move(quint32 from, quint32 to)
 {
     toggleStopAfterCurrent(false);
-    sendCommand("move "+QByteArray::number(from)+' '+QByteArray::number(to));
+    sendCommand("move "+quote(from)+' '+quote(to));
 }
 
 void MPDConnection::move(const QList<quint32> &items, quint32 pos, quint32 size)
@@ -662,17 +737,17 @@ void MPDConnection::move(const QList<quint32> &items, quint32 pos, quint32 size)
             posOffset++;
         }
         send += "move ";
-        send += QByteArray::number(moveItems.at(i));
+        send += quote(moveItems.at(i));
         send += " ";
-        send += QByteArray::number(size - 1);
+        send += quote(size - 1);
         send += "\n";
     }
     //now move all of them to the destination position
     for (int i = moveItems.size() - 1; i >= 0; i--) {
         send += "move ";
-        send += QByteArray::number(size - 1 - i);
+        send += quote(size - 1 - i);
         send += " ";
-        send += QByteArray::number(pos - posOffset);
+        send += quote(pos - posOffset);
         send += "\n";
     }
 
@@ -690,14 +765,14 @@ void MPDConnection::shuffle()
 void MPDConnection::shuffle(quint32 from, quint32 to)
 {
     toggleStopAfterCurrent(false);
-    sendCommand("shuffle "+QByteArray::number(from)+':'+QByteArray::number(to+1));
+    sendCommand("shuffle "+quote(from)+':'+quote(to+1));
 }
 
 void MPDConnection::currentSong()
 {
     Response response=sendCommand("currentsong");
     if (response.ok) {
-        emit currentSongUpdated(MPDParseUtils::parseSong(response.data, true));
+        emit currentSongUpdated(MPDParseUtils::parseSong(response.data, MPDParseUtils::PlayQueue));
     }
 }
 
@@ -716,10 +791,9 @@ void MPDConnection::playListChanges()
         return;
     }
 
-    QByteArray data = "plchangesposid ";
-    data += QByteArray::number(lastUpdatePlayQueueVersion);
+    QByteArray data = "plchangesposid "+quote(lastUpdatePlayQueueVersion);
     Response status=sendCommand("status"); // We need an updated status so as to detect deletes at end of list...
-    Response response=sendCommand(data);
+    Response response=sendCommand(data, false);
     if (response.ok && status.ok) {
         MPDStatusValues sv=MPDParseUtils::parseStatus(status.data);
         lastUpdatePlayQueueVersion=lastStatusPlayQueueVersion=sv.playlist;
@@ -759,17 +833,16 @@ void MPDConnection::playListChanges()
                 } else {
                     // New song!
                     data = "playlistinfo ";
-                    data += QByteArray::number(idp.pos);
+                    data += quote(idp.pos);
                     response=sendCommand(data);
                     if (!response.ok) {
                         playListInfo();
                         return;
                     }
-                    Song s=MPDParseUtils::parseSong(response.data, true);
+                    Song s=MPDParseUtils::parseSong(response.data, MPDParseUtils::PlayQueue);
                     s.id=idp.id;
 //                     s.pos=idp.pos;
                     songs.append(s);
-
                     if (s.isCdda()) {
                         newCantataStreams.append(s);
                     } else if (s.isStream()) {
@@ -819,7 +892,7 @@ void MPDConnection::playListInfo()
     Response response=sendCommand("playlistinfo");
     if (response.ok) {
         lastUpdatePlayQueueVersion=lastStatusPlayQueueVersion;
-        QList<Song> songs=MPDParseUtils::parseSongs(response.data);
+        QList<Song> songs=MPDParseUtils::parseSongs(response.data, MPDParseUtils::PlayQueue);
         playQueueIds.clear();
         streamIds.clear();
 
@@ -846,7 +919,7 @@ void MPDConnection::playListInfo()
  */
 void MPDConnection::setCrossFade(int secs)
 {
-    sendCommand("crossfade "+QByteArray::number(secs));
+    sendCommand("crossfade "+quote(secs));
 }
 
 void MPDConnection::setReplayGain(const QString &v)
@@ -873,7 +946,7 @@ void MPDConnection::goToNext()
 
 static inline QByteArray value(bool b)
 {
-    return b ? "1" : "0";
+    return MPDConnection::quote(b ? 1 : 0);
 }
 
 void MPDConnection::setPause(bool toggle)
@@ -888,16 +961,16 @@ void MPDConnection::play()
     sendCommand("play");
 }
 
-void MPDConnection::startPlayingSong(quint32 song)
-{
-    toggleStopAfterCurrent(false);
-    sendCommand("play "+QByteArray::number(song));
-}
+//void MPDConnection::startPlayingSong(quint32 song)
+//{
+//    toggleStopAfterCurrent(false);
+//    sendCommand("play "+quote(song));
+//}
 
 void MPDConnection::startPlayingSongId(qint32 songId)
 {
     toggleStopAfterCurrent(false);
-    sendCommand("playid "+QByteArray::number(songId));
+    sendCommand("playid "+quote(songId));
 }
 
 void MPDConnection::goToPrevious()
@@ -929,7 +1002,7 @@ void MPDConnection::setSingle(bool toggle)
 void MPDConnection::setSeek(quint32 song, quint32 time)
 {
     toggleStopAfterCurrent(false);
-    sendCommand("seek "+QByteArray::number(song)+' '+QByteArray::number(time));
+    sendCommand("seek "+quote(song)+' '+quote(time));
 }
 
 void MPDConnection::setSeekId(qint32 songId, quint32 time)
@@ -943,7 +1016,7 @@ void MPDConnection::setSeekId(qint32 songId, quint32 time)
     if (songId!=currentSongId || 0==time) {
         toggleStopAfterCurrent(false);
     }
-    if (sendCommand("seekid "+QByteArray::number(songId)+' '+QByteArray::number(time)).ok) {
+    if (sendCommand("seekid "+quote(songId)+' '+quote(time)).ok) {
         if (stopAfterCurrent && songId==currentSongId && songPos>time) {
             songPos=time;
         }
@@ -954,14 +1027,14 @@ void MPDConnection::setVolume(int vol)
 {
     if (vol>=0) {
         unmuteVol=-1;
-        sendCommand("setvol "+QByteArray::number(vol), false);
+        sendCommand("setvol "+quote(vol), false);
     }
 }
 
 void MPDConnection::toggleMute()
 {
     if (unmuteVol>0) {
-        sendCommand("setvol "+QByteArray::number(unmuteVol), false);
+        sendCommand("setvol "+quote(unmuteVol), false);
         unmuteVol=-1;
     } else {
         Response status=sendCommand("status");
@@ -969,7 +1042,7 @@ void MPDConnection::toggleMute()
             MPDStatusValues sv=MPDParseUtils::parseStatus(status.data);
             if (sv.volume>0) {
                 unmuteVol=sv.volume;
-                sendCommand("setvol "+QByteArray::number(0), false);
+                sendCommand("setvol "+quote(0), false);
             }
         }
     }
@@ -988,12 +1061,14 @@ void MPDConnection::clearStopAfter()
     toggleStopAfterCurrent(false);
 }
 
-void MPDConnection::getStats(bool andUpdate)
+void MPDConnection::getStats()
 {
-    Response response=sendCommand(andUpdate ? "command_list_begin\nupdate\nstats\ncommand_list_end" : "stats");
+    Response response=sendCommand("stats");
     if (response.ok) {
         MPDStatsValues stats=MPDParseUtils::parseStats(response.data);
         dbUpdate=stats.dbUpdate;
+        mopidy=0==stats.artists && 0==stats.albums && 0==stats.songs &&
+               0==stats.uptime && 0==stats.playtime && 0==stats.dbPlaytime && 0==dbUpdate.toTime_t();
         emit statsUpdated(stats);
     }
 }
@@ -1039,7 +1114,7 @@ void MPDConnection::getTagTypes()
 void MPDConnection::idleDataReady()
 {
     DBUG << "idleDataReady";
-    if (idleSocket.bytesAvailable() == 0) {
+    if (0==idleSocket.bytesAvailable()) {
         return;
     }
     parseIdleReturn(readFromSocket(idleSocket));
@@ -1104,11 +1179,11 @@ void MPDConnection::parseIdleReturn(const QByteArray &data)
     bool statusUpdated=false;
     foreach(const QByteArray &line, lines) {
         if (line == "changed: database") {
-            getStats(false);
+            getStats();
             playListInfo();
             playListUpdated=true;
         } else if (line == "changed: update") {
-            emit databaseUpdated();
+            emit updatedDatabase();
         } else if (line == "changed: stored_playlist") {
             emit storedPlayListUpdated();
         } else if (line == "changed: playlist") {
@@ -1139,7 +1214,7 @@ void MPDConnection::outputs()
 
 void MPDConnection::enableOutput(int id, bool enable)
 {
-    sendCommand((enable ? "enableoutput " : "disableoutput ")+QByteArray::number(id));
+    sendCommand((enable ? "enableoutput " : "disableoutput ")+quote(id));
 }
 
 /*
@@ -1147,37 +1222,52 @@ void MPDConnection::enableOutput(int id, bool enable)
  */
 void MPDConnection::update()
 {
-    sendCommand("update");
+    if (sendCommand("update").ok) {
+        emit updatingDatabase();
+
+        if (isMopdidy()) {
+            // Mopidy does not support MPD's update command. So, when user presses update DB, what we
+            // do instead is clear library/dir caches, then when response to getStats is received,
+            // library/dir should get refreshed...
+            emit updatedDatabase(); // Emit thi to stop any spinners...
+            getStats();
+        }
+    }
 }
 
 /*
  * Database commands
  */
 
-/**
- * Get all files in the playlist with detailed info (artist, album,
- * title, time etc).
- */
 void MPDConnection::loadLibrary()
 {
     emit updatingLibrary();
-    Response response=sendCommand("listallinfo");
+    Response response=alwaysUseLsInfo ? Response(false) : sendCommand("listallinfo", false);
+    MusicLibraryItemRoot *root=0;
     if (response.ok) {
-        emit musicLibraryUpdated(MPDParseUtils::parseLibraryItems(response.data, details.dir, ver), dbUpdate);
+        root = new MusicLibraryItemRoot;
+        MPDParseUtils::parseLibraryItems(response.data, details.dir, ver, mopidy, root);
+    } else { // MPD >=0.18 can fail listallinfo for large DBs, so get info dir by dir...
+        root = new MusicLibraryItemRoot;
+        if (!listDirInfo("/", root)) {
+            delete root;
+            root=0;
+        }
+    }
+
+    if (root) {
+        root->applyGrouping();
+        emit musicLibraryUpdated(root, dbUpdate);
     }
     emit updatedLibrary();
 }
 
-/**
-* Get all the files and dir in the mpdmusic dir.
-*
-*/
 void MPDConnection::loadFolders()
 {
     emit updatingFileList();
     Response response=sendCommand("listall");
     if (response.ok) {
-        emit dirViewUpdated(MPDParseUtils::parseDirViewItems(response.data));
+        emit dirViewUpdated(MPDParseUtils::parseDirViewItems(response.data, mopidy), dbUpdate);
     }
     emit updatedFileList();
 }
@@ -1204,7 +1294,7 @@ void MPDConnection::playlistInfo(const QString &name)
 {
     Response response=sendCommand("listplaylistinfo "+encodeName(name));
     if (response.ok) {
-        emit playlistInfoRetrieved(name, MPDParseUtils::parseSongs(response.data));
+        emit playlistInfoRetrieved(name, MPDParseUtils::parseSongs(response.data, MPDParseUtils::Platlist));
     }
 }
 
@@ -1296,7 +1386,7 @@ void MPDConnection::removeFromPlaylist(const QString &name, const QList<quint32>
         QByteArray data = "playlistdelete ";
         data += encodedName;
         data += " ";
-        data += QByteArray::number(idx);
+        data += quote(idx);
         if (sendCommand(data).ok) {
             removed.prepend(idx);
         } else {
@@ -1316,7 +1406,7 @@ void MPDConnection::setPriority(const QList<qint32> &ids, quint8 priority)
         QByteArray send = "command_list_begin\n";
 
         foreach (quint32 id, ids) {
-            send += "prioid "+QByteArray::number(priority)+" "+QByteArray::number(id)+"\n";
+            send += "prioid "+quote(priority)+" "+quote(id)+"\n";
         }
 
         send += "command_list_end";
@@ -1326,6 +1416,17 @@ void MPDConnection::setPriority(const QList<qint32> &ids, quint8 priority)
     }
 }
 
+void MPDConnection::search(const QString &field, const QString &value, int id)
+{
+    QList<Song> songs;
+    Response response=sendCommand("search "+field.toLatin1()+" "+encodeName(value));
+    if (response.ok) {
+        songs=MPDParseUtils::parseSongs(response.data, MPDParseUtils::Library);
+        qSort(songs);
+    }
+    emit searchResponse(id, songs);
+}
+
 void MPDConnection::moveInPlaylist(const QString &name, const QList<quint32> &items, quint32 pos, quint32 size)
 {
     if (doMoveInPlaylist(name, items, pos, size)) {
@@ -1353,17 +1454,17 @@ bool MPDConnection::doMoveInPlaylist(const QString &name, const QList<quint32> &
             posOffset++;
         }
         send += cmd;
-        send += QByteArray::number(moveItems.at(i));
+        send += quote(moveItems.at(i));
         send += " ";
-        send += QByteArray::number(size - 1);
+        send += quote(size - 1);
         send += "\n";
     }
     //now move all of them to the destination position
     for (int i = moveItems.size() - 1; i >= 0; i--) {
         send += cmd;
-        send += QByteArray::number(size - 1 - i);
+        send += quote(size - 1 - i);
         send += " ";
-        send += QByteArray::number(pos - posOffset);
+        send += quote(pos - posOffset);
         send += "\n";
     }
 
@@ -1387,6 +1488,24 @@ void MPDConnection::toggleStopAfterCurrent(bool afterCurrent)
     }
 }
 
+bool MPDConnection::listDirInfo(const QString &dir, MusicLibraryItemRoot *root)
+{
+    bool topLevel="/"==dir;
+    Response response=sendCommand(topLevel ? "lsinfo" : ("lsinfo "+encodeName(dir)));
+    if (response.ok) {
+        QSet<QString> childDirs;
+        MPDParseUtils::parseLibraryItems(response.data, details.dir, ver, mopidy, root, !topLevel, &childDirs);
+        foreach (const QString &child, childDirs) {
+            if (!listDirInfo(child, root)) {
+                return false;
+            }
+        }
+        return true;
+    } else {
+        return false;
+    }
+}
+
 MpdSocket::MpdSocket(QObject *parent)
     : QObject(parent)
     , tcp(0)
diff --git a/mpd/mpdconnection.h b/mpd/mpdconnection.h
index a6252eb..f1f8bae 100644
--- a/mpd/mpdconnection.h
+++ b/mpd/mpdconnection.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -173,6 +173,7 @@ public:
     };
 
     static MPDConnection * self();
+    static QByteArray quote(int val);
     static QByteArray encodeName(const QString &name);
 
     struct Response {
@@ -192,7 +193,7 @@ public:
     const MPDConnectionDetails & getDetails() const { return details; }
     void setDirReadable() { details.setDirReadable(); }
     bool isConnected() const { return State_Connected==state; }
-    bool canUsePriority() const { return ver>=MPD_MAKE_VERSION(0, 17, 0); }
+    bool canUsePriority() const { return ver>=MPD_MAKE_VERSION(0, 17, 0) && !mopidy; }
     const QSet<QString> & urlHandlers() const { return handlers; }
     const QSet<QString> & tags() const { return tagTypes; }
     bool composerTagSupported() const { return tagTypes.contains(QLatin1String("Composer")); }
@@ -201,14 +202,17 @@ public:
     static bool isPlaylist(const QString &file);
     int unmuteVolume() { return unmuteVol; }
     bool isMuted() { return -1!=unmuteVol; }
+    bool isMopdidy() const { return mopidy; }
 
 public Q_SLOTS:
     void reconnect();
     void setDetails(const MPDConnectionDetails &d);
-    void disconnectMpd();
+//    void disconnectMpd();
     // Current Playlist
     void add(const QStringList &files, bool replace, quint8 priority);
     void add(const QStringList &files, quint32 pos, quint32 size, int action, quint8 priority);
+    void add(const QStringList &files, quint32 pos, quint32 size, int action, const QList<quint8> &priority);
+    void populate(const QStringList &files, const QList<quint8> &priority);
     void addAndPlay(const QString &file);
     void currentSong();
     void playListChanges();
@@ -227,7 +231,7 @@ public Q_SLOTS:
     void goToNext();
     void setPause(bool toggle);
     void play();
-    void startPlayingSong(quint32 song = 0);
+//    void startPlayingSong(quint32 song = 0);
     void startPlayingSongId(qint32 songId = 0);
     void goToPrevious();
     void setConsume(bool toggle);
@@ -246,7 +250,7 @@ public Q_SLOTS:
     void enableOutput(int id, bool enable);
 
     // Miscellaneous
-    void getStats(bool andUpdate=false);
+    void getStats();
     void getStatus();
     void getUrlHandlers();
     void getTagTypes();
@@ -273,6 +277,8 @@ public Q_SLOTS:
 
     void setPriority(const QList<qint32> &ids, quint8 priority);
 
+    void search(const QString &field, const QString &value, int id);
+
 Q_SIGNALS:
     void stateChanged(bool connected);
     void passwordError();
@@ -283,13 +289,14 @@ Q_SIGNALS:
     void storedPlayListUpdated();
     void outputsUpdated(const QList<Output> &outputs);
     void musicLibraryUpdated(MusicLibraryItemRoot *root, QDateTime dbUpdate);
-    void dirViewUpdated(DirViewItemRoot *root);
+    void dirViewUpdated(DirViewItemRoot *root, QDateTime dbUpdate);
     void playlistsRetrieved(const QList<Playlist> &data);
     void playlistInfoRetrieved(const QString &name, const QList<Song> &songs);
     void playlistRenamed(const QString &from, const QString &to);
     void removedFromPlaylist(const QString &name, const QList<quint32> &positions);
     void movedInPlaylist(const QString &name, const QList<quint32> &items, quint32 pos);
-    void databaseUpdated();
+    void updatingDatabase();
+    void updatedDatabase();
     void playlistLoaded(const QString &playlist);
     void added(const QStringList &files);
     void replayGain(const QString &);
@@ -306,6 +313,8 @@ Q_SIGNALS:
     void stopAfterCurrentChanged(bool afterCurrent);
     void streamUrl(const QString &url);
 
+    void searchResponse(int id, const QList<Song> &songs);
+
     void socketAddress(const QString &addr);
     void cantataStreams(const QStringList &files);
     void cantataStreams(const QList<Song> &songs, bool isUpdate);
@@ -331,6 +340,7 @@ private:
     void parseIdleReturn(const QByteArray &data);
     bool doMoveInPlaylist(const QString &name, const QList<quint32> &items, quint32 pos, quint32 size);
     void toggleStopAfterCurrent(bool afterCurrent);
+    bool listDirInfo(const QString &dir, MusicLibraryItemRoot *root);
 
 private:
     Thread *thread;
@@ -364,6 +374,7 @@ private:
     qint32 currentSongId;
     quint32 songPos; // USe for stop-after-current when we only have 1 songin playqueue!
     int unmuteVol;
+    bool mopidy;
 };
 
 #endif
diff --git a/mpd/mpdparseutils.cpp b/mpd/mpdparseutils.cpp
index 4da45b2..2a1dd58 100644
--- a/mpd/mpdparseutils.cpp
+++ b/mpd/mpdparseutils.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -29,7 +29,6 @@
 #include <QStringList>
 #include <QUrl>
 #include <QFile>
-#include "localize.h"
 #include "dirviewitemroot.h"
 #include "dirviewitemdir.h"
 #include "dirviewitemfile.h"
@@ -44,13 +43,15 @@
 #include "song.h"
 #include "output.h"
 #include "covers.h"
-#ifdef TAGLIB_FOUND
+#ifdef ENABLE_HTTP_SERVER
 #include "httpserver.h"
 #endif
 #include "utils.h"
 #include "cuefile.h"
 #include "mpdconnection.h"
+#ifdef ENABLE_ONLINE_SERVICES
 #include "onlineservice.h"
+#endif
 
 #include <QDebug>
 static bool debugEnabled=false;
@@ -68,16 +69,16 @@ QList<Playlist> MPDParseUtils::parsePlaylists(const QByteArray &data)
     int amountOfLines = lines.size();
 
     for (int i = 0; i < amountOfLines; i++) {
-        QList<QByteArray> tokens = lines.at(i).split(':');
+        QString line(QString::fromUtf8(lines.at(i)));
 
-        if (tokens.at(0) == "playlist") {
+        if (line.startsWith(QLatin1String("playlist:"))) {
             Playlist playlist;
-            playlist.name = QString::fromUtf8(tokens.at(1)).simplified();
+            playlist.name = line.mid(10);
             i++;
-            tokens = lines.at(i).split(':');
+            line=QString::fromUtf8(lines.at(i));
 
-            if (tokens.at(0) == "Last-Modified") {
-                playlist.lastModified=QDateTime::fromString(tokens.at(1).trimmed()+':'+tokens.at(2)+':'+tokens.at(3), Qt::ISODate);
+            if (line.startsWith(QLatin1String("Last-Modified"))) {
+                playlist.lastModified=QDateTime::fromString(line.mid(15), Qt::ISODate);
                 playlists.append(playlist);
             }
         }
@@ -189,7 +190,20 @@ MPDStatusValues MPDParseUtils::parseStatus(const QByteArray &data)
     return v;
 }
 
-Song MPDParseUtils::parseSong(const QByteArray &data, bool isPlayQueue)
+static QSet<QString> constStdProtocols=QSet<QString>() << QLatin1String("http://")
+                                                       << QLatin1String("https://")
+                                                       << QLatin1String("mms://")
+                                                       << QLatin1String("mmsh://")
+                                                       << QLatin1String("mmst://")
+                                                       << QLatin1String("mmsu://")
+                                                       << QLatin1String("gopher://")
+                                                       << QLatin1String("rtp://")
+                                                       << QLatin1String("rtsp://")
+                                                       << QLatin1String("rtmp://")
+                                                       << QLatin1String("rtmpt://")
+                                                       << QLatin1String("rtmps://");
+
+Song MPDParseUtils::parseSong(const QByteArray &data, Location location)
 {
     Song song;
     QString tmpData = QString::fromUtf8(data.constData());
@@ -246,10 +260,12 @@ Song MPDParseUtils::parseSong(const QByteArray &data, bool isPlayQueue)
     }
 
     if (Song::Playlist!=song.type && song.genre.isEmpty()) {
-        song.genre = i18n("Unknown");
+        song.genre = Song::unknown();
     }
 
-    #ifdef TAGLIB_FOUND
+    QString origFile=song.file;
+
+    #ifdef ENABLE_HTTP_SERVER
     if (!song.file.isEmpty() && song.file.startsWith("http") && HttpServer::self()->isOurs(song.file)) {
         song.type=Song::CantataStream;
         Song mod=HttpServer::self()->decodeUrl(song.file);
@@ -262,7 +278,12 @@ Song MPDParseUtils::parseSong(const QByteArray &data, bool isPlayQueue)
     if (song.file.contains(Song::constCddaProtocol)) {
         song.type=Song::Cdda;
     } else if (song.file.contains("://")) {
-        song.type=Song::Stream;
+        foreach (const QString &protocol, constStdProtocols) {
+            if (song.file.startsWith(protocol)) {
+                song.type=Song::Stream;
+                break;
+            }
+        }
     }
 
     if (!song.file.isEmpty()) {
@@ -276,7 +297,10 @@ Song MPDParseUtils::parseSong(const QByteArray &data, bool isPlayQueue)
                     }
                 }
             } else {
-                if (!OnlineService::decode(song)) {
+                #ifdef ENABLE_ONLINE_SERVICES
+                if (!OnlineService::decode(song))
+                #endif
+                {
                     QString name=getAndRemoveStreamName(song.file);
                     if (!name.isEmpty()) {
                         song.name=name;
@@ -291,13 +315,16 @@ Song MPDParseUtils::parseSong(const QByteArray &data, bool isPlayQueue)
             song.fillEmptyFields();
         }
     }
-    if (isPlayQueue) {
-        song.setKey();
+    if (Library!=location) {
+        // HTTP server, and OnlineServices, modify the path. But this then messes up
+        // undo/restore of playqueue. Therefore, set path back to original value...
+        song.file=origFile;
+        song.setKey(location);
     }
     return song;
 }
 
-QList<Song> MPDParseUtils::parseSongs(const QByteArray &data)
+QList<Song> MPDParseUtils::parseSongs(const QByteArray &data, Location location)
 {
     QList<Song> songs;
     QByteArray line;
@@ -312,7 +339,7 @@ QList<Song> MPDParseUtils::parseSongs(const QByteArray &data)
         }
         line += "\n";
         if (i == lines.size() - 1 || lines.at(i + 1).startsWith("file:")) {
-            Song song=parseSong(line, true);
+            Song song=parseSong(line, location);
             songs.append(song);
             line.clear();
         }
@@ -368,7 +395,7 @@ QStringList MPDParseUtils::parseList(const QByteArray &data, const QLatin1String
     int keyLen=QString(key).length();
 
     for (int i = 0; i < amountOfLines; i++) {
-        QString item(lines.at(i));
+        QString item(QString::fromUtf8(lines.at(i)));
         // Skip the "OK" line, this is NOT a valid item!!!
         if (QLatin1String("OK")==item) {
             continue;
@@ -404,29 +431,38 @@ void MPDParseUtils::setGroupMultiple(bool g)
     groupMultipleArtists=g;
 }
 
-MusicLibraryItemRoot * MPDParseUtils::parseLibraryItems(const QByteArray &data, const QString &mpdDir, long mpdVersion)
+void MPDParseUtils::parseLibraryItems(const QByteArray &data, const QString &mpdDir, long mpdVersion,
+                                      bool isMopidy, MusicLibraryItemRoot *rootItem, bool parsePlaylists,
+                                      QSet<QString> *childDirs)
 {
     bool canSplitCue=mpdVersion>=MPD_MAKE_VERSION(0,17,0);
-    MusicLibraryItemRoot * const rootItem = new MusicLibraryItemRoot;
     QByteArray currentItem;
     QList<QByteArray> lines = data.split('\n');
     int amountOfLines = lines.size();
     MusicLibraryItemArtist *artistItem = 0;
     MusicLibraryItemAlbum *albumItem = 0;
     MusicLibraryItemSong *songItem = 0;
-    QString unknown=i18n("Unknown");
 
     for (int i = 0; i < amountOfLines; i++) {
-        currentItem += lines.at(i);
+        QByteArray line=lines.at(i);
+        if (childDirs && line.startsWith("directory: ")) {
+            childDirs->insert(QString::fromUtf8(line.remove(0, 11)));
+        }
+        currentItem += line;
         currentItem += "\n";
-        if (i == lines.size() - 1 || lines.at(i + 1).startsWith("file:") || lines.at(i + 1).startsWith("playlist:")) {
-            Song currentSong = parseSong(currentItem, false);
+        if (i == amountOfLines - 1 || lines.at(i + 1).startsWith("file:") || lines.at(i + 1).startsWith("playlist:")) {
+            Song currentSong = parseSong(currentItem, Library);
             currentItem.clear();
-            if (currentSong.file.isEmpty()) {
+            if (currentSong.file.isEmpty() || (isMopidy && !currentSong.file.startsWith(Song::constMopidyLocal))) {
                 continue;
             }
 
             if (Song::Playlist==currentSong.type) {
+                // lsinfo / will return all stored playlists - but this is deprecated.
+                if (!parsePlaylists) {
+                    continue;
+                }
+
                 MusicLibraryItemAlbum *prevAlbum=albumItem;
                 QString prevSongFile=songItem ? songItem->file() : QString();
                 QList<Song> cueSongs; // List of songs from cue file
@@ -445,7 +481,7 @@ MusicLibraryItemRoot * MPDParseUtils::parseLibraryItems(const QByteArray &data,
                     } else DBUG << "Parsed cue file, songs:" << cueSongs.count() << "files:" << cueFiles;
                 }
                 if (cueParseStatus &&
-                    (cueFiles.count()<cueSongs.count() || (albumItem && albumItem->data()==unknown && albumItem->parentItem()->data()==unknown))) {
+                    (cueFiles.count()<cueSongs.count() || (albumItem && albumItem->data()==Song::unknown() && albumItem->parentItem()->data()==Song::unknown()))) {
 
                     bool canUseThisCueFile=true;
                     foreach (const Song &s, cueSongs) {
@@ -598,50 +634,49 @@ MusicLibraryItemRoot * MPDParseUtils::parseLibraryItems(const QByteArray &data,
             albumItem->addGenre(currentSong.genre);
             artistItem->addGenre(currentSong.genre);
             rootItem->addGenre(currentSong.genre);
+        } else if (childDirs) {
+
         }
     }
-    rootItem->applyGrouping();
-    return rootItem;
 }
 
-DirViewItemRoot * MPDParseUtils::parseDirViewItems(const QByteArray &data)
+DirViewItemRoot * MPDParseUtils::parseDirViewItems(const QByteArray &data, bool isMopidy)
 {
     QList<QByteArray> lines = data.split('\n');
-    DirViewItemRoot * rootItem = new DirViewItemRoot;
-    DirViewItem * currentDir = rootItem;
-    QStringList currentDirList;
+    DirViewItemRoot *rootItem = new DirViewItemRoot;
+    DirViewItemDir *dir=rootItem;
+    QString currentDirPath;
 
     int amountOfLines = lines.size();
     for (int i = 0; i < amountOfLines; i++) {
         QString line = QString::fromUtf8(lines.at(i));
+        QString path;
 
         if (line.startsWith("file: ")) {
-            line.remove(0, 6);
-            QStringList parts = line.split("/");
-            static_cast<DirViewItemDir *>(currentDir)->insertFile(parts.at(parts.size() - 1));
+            path=line.remove(0, 6);
         } else if (line.startsWith("playlist: ")) {
-            line.remove(0, 10);
-            QStringList parts = line.split("/");
-            static_cast<DirViewItemDir *>(currentDir)->insertFile(parts.at(parts.size() - 1));
-        } else if (line.startsWith("directory: ")) {
-            line.remove(0, 11);
-            QStringList parts = line.split("/");
-
-            /* Check how much matches */
-            int depth = 0;
-            for (int j = 0; j < currentDirList.size() && j < parts.size(); j++) {
-                if (currentDirList.at(j) != parts.at(j)) {
-                    break;
-                }
-                depth++;
+            path=line.remove(0, 10);
+        }
+        if (!path.isEmpty() && (!isMopidy || path.startsWith(Song::constMopidyLocal))) {
+            QString mopidyPath;
+            if (isMopidy) {
+                mopidyPath=path;
+                path=Song::decodePath(path);
             }
-
-            for (int j = currentDirList.size(); j > depth; j--) {
-                currentDir = currentDir->parent();
+            int last=path.lastIndexOf(Utils::constDirSep);
+            QString dirPath=-1==last ? QString() : path.left(last);
+            QStringList parts=path.split("/");
+
+            if (dirPath!=currentDirPath) {
+                currentDirPath=dirPath;
+                dir=rootItem;
+                if (parts.length()>1) {
+                    for (int i=0; i<parts.length()-1; ++i) {
+                        dir=dir->getDirectory(parts.at(i), true);
+                    }
+                }
             }
-
-            currentDir = static_cast<DirViewItemDir *>(currentDir)->createDirectory(parts.at(parts.size() - 1));
-            currentDirList = parts;
+            dir->insertFile(parts.last(), mopidyPath);
         }
     }
 
diff --git a/mpd/mpdparseutils.h b/mpd/mpdparseutils.h
index 445d059..191ff68 100644
--- a/mpd/mpdparseutils.h
+++ b/mpd/mpdparseutils.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -28,14 +28,15 @@
 #define MPD_PARSE_UTILS_H
 
 #include <QString>
+#include <QSet>
 
 struct Song;
-class Playlist;
+struct Playlist;
+struct Output;
+struct MPDStatsValues;
+struct MPDStatusValues;
 class DirViewItemRoot;
 class MusicLibraryItemRoot;
-class Output;
-class MPDStatsValues;
-class MPDStatusValues;
 
 namespace MPDParseUtils
 {
@@ -49,19 +50,28 @@ namespace MPDParseUtils
         qint32 id;
         quint32 pos;
     };
+
+    enum Location {
+        Library,
+        Platlist,
+        PlayQueue
+    };
+
     extern QList<Playlist> parsePlaylists(const QByteArray &data);
     extern MPDStatsValues parseStats(const QByteArray &data);
     extern MPDStatusValues parseStatus(const QByteArray &data);
-    extern Song parseSong(const QByteArray &data, bool isPlayQueue);
-    extern QList<Song> parseSongs(const QByteArray &data);
+    extern Song parseSong(const QByteArray &data, Location location);
+    extern QList<Song> parseSongs(const QByteArray &data, Location location);
     extern QList<IdPos> parseChanges(const QByteArray &data);
     extern QStringList parseList(const QByteArray &data, const QLatin1String &key);
     extern bool groupSingle();
     extern void setGroupSingle(bool g);
     extern bool groupMultiple();
     extern void setGroupMultiple(bool g);
-    extern MusicLibraryItemRoot * parseLibraryItems(const QByteArray &data, const QString &mpdDir, long mpdVersion);
-    extern DirViewItemRoot * parseDirViewItems(const QByteArray &data);
+    extern void parseLibraryItems(const QByteArray &data, const QString &mpdDir, long mpdVersion,
+                                  bool isMopidy, MusicLibraryItemRoot *rootItem, bool parsePlaylists=true,
+                                  QSet<QString> *childDirs=0);
+    extern DirViewItemRoot * parseDirViewItems(const QByteArray &data, bool isMopidy);
     extern QList<Output> parseOuputs(const QByteArray &data);
     extern QString addStreamName(const QString &url, const QString &name);
     extern QString getStreamName(const QString &url);
diff --git a/mpd/mpdstats.cpp b/mpd/mpdstats.cpp
index 7a058f6..c12e6b8 100644
--- a/mpd/mpdstats.cpp
+++ b/mpd/mpdstats.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/mpd/mpdstats.h b/mpd/mpdstats.h
index 7d0aff4..5ecd1f4 100644
--- a/mpd/mpdstats.h
+++ b/mpd/mpdstats.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/mpd/mpdstatus.cpp b/mpd/mpdstatus.cpp
index e2898c6..e077cbc 100644
--- a/mpd/mpdstatus.cpp
+++ b/mpd/mpdstatus.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/mpd/mpdstatus.h b/mpd/mpdstatus.h
index fa7f7cb..fda0c4d 100644
--- a/mpd/mpdstatus.h
+++ b/mpd/mpdstatus.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/mpd/mpduser.cpp b/mpd/mpduser.cpp
index dbaebdd..501fcd4 100644
--- a/mpd/mpduser.cpp
+++ b/mpd/mpduser.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -141,7 +141,7 @@ void MPDUser::setMusicFolder(const QString &folder)
     QStringList lines;
     if (cfgFile.open(QIODevice::ReadOnly|QIODevice::Text)) {
         while (!cfgFile.atEnd()) {
-            QString line = cfgFile.readLine();
+            QString line = QString::fromUtf8(cfgFile.readLine());
             if (line.startsWith(constMusicFolderKey)) {
                 lines.append(constMusicFolderKey+" \""+folder+"\"\n");
             } else {
@@ -203,7 +203,7 @@ void MPDUser::cleanup()
                                            << QLatin1String("state_file") << QLatin1String("sticker_file");
         QStringList dirKeys=QStringList() << constPlaylistsKey;
         while (!cfgFile.atEnd()) {
-            QString line = cfgFile.readLine();
+            QString line = QString::fromUtf8(cfgFile.readLine());
             foreach (const QString &key, fileKeys) {
                 if (line.startsWith(key)) {
                     QString file=readValue(line, key);
@@ -307,7 +307,7 @@ void MPDUser::init(bool create)
             QFile cfgFile(cfgName);
             if (cfgFile.open(QIODevice::ReadOnly|QIODevice::Text)) {
                 while (!cfgFile.atEnd() && (det.dir.isEmpty() || det.hostname.isEmpty() || pidFileName.isEmpty())) {
-                    QString line = cfgFile.readLine();
+                    QString line = QString::fromUtf8(cfgFile.readLine());
                     if (det.dir.isEmpty()) {
                         det.dir=Utils::fixPath(readValue(line, constMusicFolderKey));
                     }
diff --git a/mpd/mpduser.h b/mpd/mpduser.h
index 58fa548..8613b4b 100644
--- a/mpd/mpduser.h
+++ b/mpd/mpduser.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/mpd/output.h b/mpd/output.h
index 20a1686..661f961 100644
--- a/mpd/output.h
+++ b/mpd/output.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/mpd/playlist.h b/mpd/playlist.h
index 458c665..244c523 100644
--- a/mpd/playlist.h
+++ b/mpd/playlist.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
diff --git a/mpd/song.cpp b/mpd/song.cpp
index ad3de6c..0ca5cc5 100644
--- a/mpd/song.cpp
+++ b/mpd/song.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /*
@@ -37,8 +37,31 @@
 #include <QSet>
 #include <QChar>
 #include <QLatin1Char>
+#include <QtAlgorithms>
+#include <QUrl>
 
-const QString Song::constCddaProtocol("cdda:/");
+static const quint8 constOnlineDiscId=0xEE;
+
+const QString Song::constCddaProtocol=QLatin1String("cantata-cdda:/");
+const QString Song::constMopidyLocal=QLatin1String("local:track:");
+
+static QString unknownStr;
+static QString variousArtistsStr;
+const QString & Song::unknown()
+{
+    return unknownStr;
+}
+
+const QString & Song::variousArtists()
+{
+    return variousArtistsStr;
+}
+
+void Song::initTranslations()
+{
+    unknownStr=i18n("Unknown");
+    variousArtistsStr=i18n("Various Artists");
+}
 
 // When displaying albums, we use the 1st track's year as the year of the album.
 // The map below stores the mapping from artist+album to year.
@@ -56,6 +79,59 @@ int Song::albumYear(const Song &s)
     return it==albumYears.end() ? s.year : it.value();
 }
 
+static int songType(const Song &s)
+{
+    static QStringList extensions=QStringList() << QLatin1String(".flac")
+                                                << QLatin1String(".wav")
+                                                << QLatin1String(".dff")
+                                                << QLatin1String(".dsf")
+                                                << QLatin1String(".aac")
+                                                << QLatin1String(".m4a")
+                                                << QLatin1String(".m4b")
+                                                << QLatin1String(".m4p")
+                                                << QLatin1String(".mp4")
+                                                << QLatin1String(".ogg")
+                                                << QLatin1String(".opus")
+                                                << QLatin1String(".mp3")
+                                                << QLatin1String(".wma");
+
+    for (int i=0; i<extensions.count(); ++i) {
+        if (s.file.endsWith(extensions.at(i), Qt::CaseInsensitive)) {
+            return i;
+        }
+    }
+
+    if (s.isCdda()) {
+        return extensions.count()+2;
+    }
+    if (s.isStream()) {
+        return extensions.count()+3;
+    }
+    return extensions.count()+1;
+}
+
+static bool songTypeSort(const Song &s1, const Song &s2)
+{
+    int t1=songType(s1);
+    int t2=songType(s2);
+    return t1<t2 || (t1==t2 && s1.id<s2.id);
+}
+
+void Song::sortViaType(QList<Song> &songs)
+{
+    qSort(songs.begin(), songs.end(), songTypeSort);
+}
+
+QString Song::decodePath(const QString &file)
+{
+    return file.startsWith(constMopidyLocal) ? QUrl::fromPercentEncoding(file.mid(constMopidyLocal.length()).toLatin1()) : file;
+}
+
+QString Song::encodePath(const QString &file)
+{
+    return constMopidyLocal+QString(QUrl::toPercentEncoding(file, "/"));
+}
+
 static bool useComposerIfSet=false;
 
 bool Song::useComposer()
@@ -124,45 +200,49 @@ int Song::compareTo(const Song &o) const
     if (type!=o.type) {
         return type<o.type ? -1 : 1;
     }
-    if (SingleTracks==type) {
-        int compare=artistSong().localeAwareCompare(artistSong());
-        if (0!=compare) {
-            return compare<0;
+
+    // For playlists, we only need to compare filename...
+    if (Playlist!=type) {
+        if (SingleTracks==type) {
+            int compare=artistSong().localeAwareCompare(artistSong());
+            if (0!=compare) {
+                return compare<0;
+            }
         }
-    }
 
-    int compare=artistOrComposer().localeAwareCompare(o.artistOrComposer());
+        int compare=artistOrComposer().localeAwareCompare(o.artistOrComposer());
 
-    if (0!=compare) {
-        return compare;
-    }
-    compare=album.localeAwareCompare(o.album);
-    if (0!=compare) {
-        return compare;
-    }
-    if (disc!=o.disc) {
-        return disc<o.disc ? -1 : 1;
-    }
-    if (track!=o.track) {
-        return track<o.track ? -1 : 1;
-    }
-    if (year!=o.year) {
-        return year<o.year ? -1 : 1;
-    }
-    compare=title.localeAwareCompare(o.title);
-    if (0!=compare) {
-        return compare;
-    }
-    compare=name.compare(o.name);
-    if (0!=compare) {
-        return compare;
-    }
-    compare=genre.compare(o.genre);
-    if (0!=compare) {
-        return compare;
-    }
-    if (time!=o.time) {
-        return time<o.time ? -1 : 1;
+        if (0!=compare) {
+            return compare;
+        }
+        compare=album.localeAwareCompare(o.album);
+        if (0!=compare) {
+            return compare;
+        }
+        if (disc!=o.disc) {
+            return disc<o.disc ? -1 : 1;
+        }
+        if (track!=o.track) {
+            return track<o.track ? -1 : 1;
+        }
+        if (year!=o.year) {
+            return year<o.year ? -1 : 1;
+        }
+        compare=title.localeAwareCompare(o.title);
+        if (0!=compare) {
+            return compare;
+        }
+        compare=name.compare(o.name);
+        if (0!=compare) {
+            return compare;
+        }
+        compare=genre.compare(o.genre);
+        if (0!=compare) {
+            return compare;
+        }
+        if (time!=o.time) {
+            return time<o.time ? -1 : 1;
+        }
     }
     return file.compare(o.file);
 }
@@ -225,53 +305,61 @@ void Song::guessTags()
 
 void Song::revertGuessedTags()
 {
-    title=artist=album=i18n("Unknown");
+    title=artist=album=unknownStr;
 }
 
 void Song::fillEmptyFields()
 {
-    QString unknown=i18n("Unknown");
-
     if (artist.isEmpty()) {
-        artist = unknown;
+        artist = unknownStr;
     }
     if (album.isEmpty()) {
-        album = unknown;
+        album = unknownStr;
     }
     if (title.isEmpty()) {
-        title = unknown;
+        title = unknownStr;
     }
     if (genre.isEmpty()) {
-        genre = unknown;
+        genre = unknownStr;
     }
 }
 
-void Song::setKey()
+struct KeyStore
 {
-    static quint16 currentKey=0;
-    static QMap<QString, quint16> keys;
+    KeyStore() : currentKey(0) { }
+    quint16 currentKey;
+    QMap<QString, quint16> keys;
+};
 
+static QMap<int, KeyStore> storeMap;
+
+void Song::clearKeyStore(int location)
+{
+    storeMap.remove(location);
+}
+
+void Song::setKey(int location)
+{
     if (isStream() && !isCantataStream()) {
         key=0;
         return;
     }
 
+    KeyStore &store=storeMap[location];
     QString songKey(albumKey());
-    QMap<QString, quint16>::ConstIterator it=keys.find(songKey);
-    if (it!=keys.end()) {
+    QMap<QString, quint16>::ConstIterator it=store.keys.find(songKey);
+    if (it!=store.keys.end()) {
         key=it.value();
     } else {
-        currentKey++; // Key 0 is for streams, so we need to increment before setting...
-        keys.insert(songKey, currentKey);
-        key=currentKey;
+        store.currentKey++; // Key 0 is for streams, so we need to increment before setting...
+        store.keys.insert(songKey, store.currentKey);
+        key=store.currentKey;
     }
 }
 
 bool Song::isUnknown() const
 {
-    QString unknown=i18n("Unknown");
-
-    return (artist.isEmpty() || artist==unknown) && (album.isEmpty() || album==unknown) && (title.isEmpty() || title==unknown);
+    return (artist.isEmpty() || artist==unknownStr) && (album.isEmpty() || album==unknownStr) && (title.isEmpty() || title==unknownStr);
 }
 
 void Song::clear()
@@ -296,7 +384,7 @@ void Song::clear()
 QString Song::formattedTime(quint32 seconds, bool zeroIsUnknown)
 {
     if (0==seconds && zeroIsUnknown) {
-        return i18n("Unknown");
+        return unknownStr;
     }
 
     static const quint32 constHour=60*60;
@@ -362,14 +450,19 @@ QString Song::artistSong() const
 
 QString Song::trackAndTitleStr(bool addArtist) const
 {
-    return (disc>0 ? (QString::number(disc)+QLatin1Char('.')) : QString())+
-           (track>9 ? QString::number(track) : (QLatin1Char('0')+QString::number(track)))
-           +QLatin1Char(' ')+(addArtist ? artistSong() : title);
+//    if (isFromOnlineService()) {
+//        return (disc>0 && disc!=constOnlineDiscId ? (QString::number(disc)+QLatin1Char('.')) : QString())+
+//               (track>0 ? (track>9 ? QString::number(track) : (QLatin1Char('0')+QString::number(track))) : QString())+
+//               QLatin1Char(' ')+(addArtist ? artistSong() : title);
+//    }
+    return //(disc>0 ? (QString::number(disc)+QLatin1Char('.')) : QString())+
+           (track>0 ? (track>9 ? QString::number(track) : (QLatin1Char('0')+QString::number(track))) : QString())+
+           QLatin1Char(' ')+(addArtist ? artistSong() : title);
 }
 
 bool Song::isVariousArtists(const QString &str)
 {
-    return QLatin1String("Various Artists")==str || i18n("Various Artists")==str;
+    return QLatin1String("Various Artists")==str || variousArtistsStr==str;
 }
 
 bool Song::fixVariousArtists()
@@ -442,7 +535,7 @@ bool Song::capitalise()
 
 QString Song::basicArtist() const
 {
-    if (!albumartist.isEmpty() && !artist.isEmpty() && albumartist.length()<artist.length() && artist.startsWith(albumartist)) {
+    if (!albumartist.isEmpty() && (artist.isEmpty() || (albumartist.length()<artist.length() && artist.startsWith(albumartist)))) {
         return albumartist;
     }
 
@@ -460,8 +553,6 @@ QString Song::basicArtist() const
     return artist;
 }
 
-static const quint8 constOnlineDiscId=0xEE;
-
 bool Song::isFromOnlineService() const
 {
     return constOnlineDiscId==disc && (isCantataStream() || file.startsWith("http://")) && albumartist==album;
diff --git a/mpd/song.h b/mpd/song.h
index fddda69..da86c60 100644
--- a/mpd/song.h
+++ b/mpd/song.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 
@@ -32,6 +32,7 @@
 #include <QSet>
 #include <QMetaType>
 #include "config.h"
+#include "utils.h"
 
 struct Song
 {
@@ -73,9 +74,17 @@ struct Song
     // Only used in PlayQueue/PlayLists...
     quint16 key;
 
+    static const QString & unknown();
+    static const QString & variousArtists();
+    static void initTranslations();
     static const QString constCddaProtocol;
+    static const QString constMopidyLocal;
     static void storeAlbumYear(const Song &s);
     static int albumYear(const Song &s);
+    static void sortViaType(QList<Song> &songs);
+    static QString decodePath(const QString &file);
+    static QString encodePath(const QString &file);
+    static void clearKeyStore(int location);
 
     Song();
     Song(const Song &o) { *this=o; }
@@ -89,7 +98,7 @@ struct Song
     void guessTags();
     void revertGuessedTags();
     void fillEmptyFields();
-    void setKey();
+    void setKey(int location);
     virtual void clear();
     #ifndef CANTATA_NO_SONG_TIME_FUNCTION
     static QString formattedTime(quint32 seconds, bool zeroIsUnknown=false);
@@ -111,10 +120,13 @@ struct Song
     static QString capitalize(const QString &s);
     bool capitalise();
     bool isStream() const { return Stream==type || CantataStream==type; }
+    bool isNonMPD() const { return isStream() || OnlineSvrTrack==type || Cdda==type || (!file.isEmpty() && file.startsWith(Utils::constDirSep)); }
     bool isCantataStream() const { return CantataStream==type; }
     bool isCdda() const { return Cdda==type; }
-    QString albumKey() const { return albumArtist()+QLatin1Char(':')+album; }
+    QString albumKey() const { return albumArtist()+QLatin1Char(':')+album+QLatin1Char(':')+QString::number(disc); }
     bool isCueFile() const { return Playlist==type && file.endsWith(QLatin1String(".cue"), Qt::CaseInsensitive); }
+    QString basicArtist() const;
+    QString filePath() const { return decodePath(file); }
 
     // We pass 'Song' around to cover requester. When we want the artist image, and not album image,
     // then we blank certain fields to indicate this!
@@ -123,10 +135,12 @@ struct Song
         album=artist=QString();
         size=track=0;
     }
-
     bool isArtistImageRequest() const { return album.isEmpty() && artist.isEmpty() && !albumartist.isEmpty() && 0==size && 0==track; }
 
-    QString basicArtist() const;
+    //
+    // The following sections contain various 'hacks' - where fields of Song are abused for other
+    // purposes. This is to kee the overall size of Song lower, as its used all over the place...
+    //
 
     // podcast functions...
     bool hasBeenPlayed() const { return 0!=id; }
diff --git a/network/networkaccessmanager.cpp b/network/networkaccessmanager.cpp
index 324edfc..86f3a68 100644
--- a/network/networkaccessmanager.cpp
+++ b/network/networkaccessmanager.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -24,7 +24,6 @@
 #include "networkaccessmanager.h"
 #include "networkproxyfactory.h"
 #include "settings.h"
-#include "config.h"
 #include <QTimerEvent>
 #include <QTimer>
 #ifdef ENABLE_KDE_SUPPORT
@@ -59,6 +58,29 @@ NetworkJob::NetworkJob(QNetworkReply *j)
     , job(j)
 {
     origU=j->url();
+    connectJob();
+    DBUG << (void *)this << (void *)job;
+}
+
+NetworkJob::~NetworkJob()
+{
+    DBUG << (void *)this << (void *)job;
+    cancelJob();
+}
+
+void NetworkJob::cancelAndDelete()
+{
+    DBUG << (void *)this << (void *)job;
+    cancelJob();
+    deleteLater();
+}
+
+void NetworkJob::connectJob()
+{
+    if (!job) {
+        return;
+    }
+
     connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
     connect(job, SIGNAL(readyRead()), this, SLOT(handleReadyRead()));
     connect(job, SIGNAL(error(QNetworkReply::NetworkError)), this, SIGNAL(error(QNetworkReply::NetworkError)));
@@ -67,19 +89,34 @@ NetworkJob::NetworkJob(QNetworkReply *j)
     connect(job, SIGNAL(destroyed(QObject *)), this, SLOT(jobDestroyed(QObject *)));
 }
 
-NetworkJob::~NetworkJob()
+void NetworkJob::cancelJob()
 {
+    DBUG << (void *)this << (void *)job;
     if (job) {
         disconnect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+        disconnect(job, SIGNAL(readyRead()), this, SLOT(handleReadyRead()));
+        disconnect(job, SIGNAL(error(QNetworkReply::NetworkError)), this, SIGNAL(error(QNetworkReply::NetworkError)));
+        disconnect(job, SIGNAL(uploadProgress(qint64, qint64)), this, SIGNAL(uploadProgress(qint64, qint64)));
+        disconnect(job, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProg(qint64, qint64)));
         disconnect(job, SIGNAL(destroyed(QObject *)), this, SLOT(jobDestroyed(QObject *)));
+        job->close();
         job->abort();
         job->deleteLater();
         job=0;
     }
 }
 
+void NetworkJob::abortJob()
+{
+    DBUG << (void *)this << (void *)job;
+    if (job) {
+        job->abort();
+    }
+}
+
 void NetworkJob::jobFinished()
 {
+    DBUG << (void *)this << (void *)job;
     if (!job) {
         emit finished();
     }
@@ -91,10 +128,11 @@ void NetworkJob::jobFinished()
 
     QVariant redirect = j->header(QNetworkRequest::LocationHeader);
     if (redirect.isValid() && ++numRedirects<constMaxRedirects) {
-        job=static_cast<BASE_NETWORK_ACCESS_MANAGER *>(j->manager())->get(QNetworkRequest(redirect.toUrl()));
-        DBUG << j->url().toString() << "redirected to" << job->url().toString();
-        connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
-        j->deleteLater();
+        QNetworkReply *newJob=static_cast<BASE_NETWORK_ACCESS_MANAGER *>(j->manager())->get(QNetworkRequest(redirect.toUrl()));
+        DBUG << j->url().toString() << "redirected to" << newJob->url().toString();
+        cancelJob();
+        job=newJob;
+        connectJob();
         return;
     }
 
@@ -104,6 +142,7 @@ void NetworkJob::jobFinished()
 
 void NetworkJob::jobDestroyed(QObject *o)
 {
+    DBUG << (void *)this << (void *)job;
     if (o==job) {
         job=0;
     }
@@ -121,6 +160,7 @@ void NetworkJob::downloadProg(qint64 bytesReceived, qint64 bytesTotal)
 
 void NetworkJob::handleReadyRead()
 {
+    DBUG << (void *)this << (void *)job;
     QNetworkReply *j=dynamic_cast<QNetworkReply *>(sender());
     if (!j || j!=job) {
         return;
@@ -191,7 +231,8 @@ NetworkJob * NetworkAccessManager::get(const QNetworkRequest &req, int timeout)
 
 void NetworkAccessManager::replyFinished()
 {
-    NetworkJob *job = qobject_cast<NetworkJob*>(sender());
+    NetworkJob *job = static_cast<NetworkJob*>(sender());
+    DBUG << (void *)job;
     if (timers.contains(job)) {
         killTimer(timers.take(job));
     }
@@ -200,7 +241,8 @@ void NetworkAccessManager::replyFinished()
 void NetworkAccessManager::timerEvent(QTimerEvent *e)
 {
     NetworkJob *job = timers.key(e->timerId());
+    DBUG << (void *)job;
     if (job) {
-        job->abort();
+        job->abortJob();
     }
 }
diff --git a/network/networkaccessmanager.h b/network/networkaccessmanager.h
index bb83c7f..5dd47d3 100644
--- a/network/networkaccessmanager.h
+++ b/network/networkaccessmanager.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -44,13 +44,12 @@ class NetworkJob : public QObject
     Q_OBJECT
 
 public:
-    NetworkJob(NetworkAccessManager *p, const QUrl &u);
     NetworkJob(QNetworkReply *j);
     virtual ~NetworkJob();
 
     QNetworkReply * actualJob() const { return job; }
 
-    void abort() { if (job) job->abort(); }
+    void cancelAndDelete();
     bool open(QIODevice::OpenMode mode) { return job && job->open(mode); }
     void close() { if (job) job->close(); }
 
@@ -80,10 +79,18 @@ private Q_SLOTS:
     void handleReadyRead();
 
 private:
+    NetworkJob(NetworkAccessManager *p, const QUrl &u);
+    void connectJob();
+    void cancelJob();
+    void abortJob();
+
+private:
     int numRedirects;
     int lastDownloadPc;
     QNetworkReply *job;
     QUrl origU;
+
+    friend class NetworkAccessManager;
 };
 
 class NetworkAccessManager : public BASE_NETWORK_ACCESS_MANAGER
diff --git a/network/networkproxyfactory.cpp b/network/networkproxyfactory.cpp
index 376228f..b878eff 100644
--- a/network/networkproxyfactory.cpp
+++ b/network/networkproxyfactory.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/network/networkproxyfactory.h b/network/networkproxyfactory.h
index 1a45446..e54e72f 100644
--- a/network/networkproxyfactory.h
+++ b/network/networkproxyfactory.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/network/proxysettings.cpp b/network/proxysettings.cpp
index b1e2f37..6314c7b 100644
--- a/network/proxysettings.cpp
+++ b/network/proxysettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/network/proxysettings.h b/network/proxysettings.h
index e07fa5a..3567155 100644
--- a/network/proxysettings.h
+++ b/network/proxysettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/network/proxysettings.ui b/network/proxysettings.ui
index 08879d4..facade8 100644
--- a/network/proxysettings.ui
+++ b/network/proxysettings.ui
@@ -81,7 +81,7 @@
     </widget>
    </item>
    <item row="3" column="1">
-    <widget class="SpinBox" name="proxyPort">
+    <widget class="QSpinBox" name="proxyPort">
      <property name="maximum">
       <number>65535</number>
      </property>
@@ -129,11 +129,6 @@
    <header>lineedit.h</header>
   </customwidget>
   <customwidget>
-   <class>SpinBox</class>
-   <extends>QSpinBox</extends>
-   <header>spinbox.h</header>
-  </customwidget>
-  <customwidget>
    <class>BuddyLabel</class>
    <extends>QLabel</extends>
    <header>buddylabel.h</header>
diff --git a/online/icons/jamendo.svg b/online/icons/jamendo.svg
index 7d92f7a..d2dca64 100644
--- a/online/icons/jamendo.svg
+++ b/online/icons/jamendo.svg
@@ -1,13 +1,4 @@
 <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 256 256" xmlns:dc="http://purl.org/dc/elements/1.1/">
-<metadata>
-<rdf:RDF>
-<cc:Work rdf:about="">
-<dc:format>image/svg+xml</dc:format>
-<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
-<dc:title/>
-</cc:Work>
-</rdf:RDF>
-</metadata>
 <defs>
 <clipPath id="clipPath3355">
 <path d="m744.07 238.43c-7.142-6.636-10.714-15.192-10.714-25.672 0-10.487 3.527-19.022 10.577-25.609s16.561-9.879 28.528-9.879c11.965 0 21.519 3.292 28.665 9.879 7.141 6.587 10.718 15.122 10.718 25.609 0 10.48-3.527 19.036-10.579 25.672-7.05 6.634-16.56 9.952-28.524 9.952-11.971 0-21.53-3.318-28.671-9.952m9.602-42.792c-4.545 4.361-6.816 10.068-6.816 17.12 0 7.142 2.25 12.892 6.75 17.255s10.829 6.542 18.993 6.542c8.257 0 14.635-2.159 19.135-6.474 4.5-4.314 6.75-10.09 6.75-17.323 0-7.052-2.298-12.759-6.89-17.12s-10.925-6.537-18.995-6.537-14.383 2.178-18.927 6.537"/>
diff --git a/online/jamendoservice.cpp b/online/jamendoservice.cpp
index fb9aa05..1f5132f 100644
--- a/online/jamendoservice.cpp
+++ b/online/jamendoservice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -313,7 +313,7 @@ QString JamendoService::imageUrl(const QString &id)
 
 void JamendoService::createLoader()
 {
-    loader=new JamendoMusicLoader(QUrl("http://img.jamendo.com/data/dbdump_artistalbumtrack.xml.gz"));
+    loader=new JamendoMusicLoader(QUrl("http://imgjam.com/data/dbdump_artistalbumtrack.xml.gz"));
 }
 
 Song JamendoService::fixPath(const Song &orig, bool) const
diff --git a/online/jamendoservice.h b/online/jamendoservice.h
index 89f8cf2..f075157 100644
--- a/online/jamendoservice.h
+++ b/online/jamendoservice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/jamendosettingsdialog.cpp b/online/jamendosettingsdialog.cpp
index a1650f1..8e15a1e 100644
--- a/online/jamendosettingsdialog.cpp
+++ b/online/jamendosettingsdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/jamendosettingsdialog.h b/online/jamendosettingsdialog.h
index f0e47a8..dd21c90 100644
--- a/online/jamendosettingsdialog.h
+++ b/online/jamendosettingsdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/magnatuneservice.cpp b/online/magnatuneservice.cpp
index 4a3afb2..4110a36 100644
--- a/online/magnatuneservice.cpp
+++ b/online/magnatuneservice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/magnatuneservice.h b/online/magnatuneservice.h
index d9a5f1d..21ade49 100644
--- a/online/magnatuneservice.h
+++ b/online/magnatuneservice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -65,7 +65,7 @@ public:
     static QString membershipStr(MemberShip f, bool trans=false);
     static QString downloadTypeStr(DownloadType f, bool trans=false);
 
-    MagnatuneService(MusicModel *m) : OnlineService(m, constName), membership(MB_None) { }
+    MagnatuneService(MusicModel *m) : OnlineService(m, constName), membership(MB_None), download(DL_Mp3) { }
 
     Song fixPath(const Song &orig, bool) const;
     void createLoader();
diff --git a/online/magnatunesettingsdialog.cpp b/online/magnatunesettingsdialog.cpp
index 15eef08..07241a1 100644
--- a/online/magnatunesettingsdialog.cpp
+++ b/online/magnatunesettingsdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/magnatunesettingsdialog.h b/online/magnatunesettingsdialog.h
index 0489774..6e983b0 100644
--- a/online/magnatunesettingsdialog.h
+++ b/online/magnatunesettingsdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/onlinedevice.cpp b/online/onlinedevice.cpp
index a6cbed3..8958f51 100644
--- a/online/onlinedevice.cpp
+++ b/online/onlinedevice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -23,25 +23,28 @@
 
 #include "onlinedevice.h"
 #include "musiclibrarymodel.h"
+#include "dirviewmodel.h"
 #include "utils.h"
 #include "networkaccessmanager.h"
+#include "mpdconnection.h"
 #include <QDir>
 
-void OnlineDevice::copySongTo(const Song &s, const QString &baseDir, const QString &musicPath, bool overwrite, bool copyCover)
+void OnlineDevice::copySongTo(const Song &s, const QString &musicPath, bool overwrite, bool copyCover)
 {
     Q_UNUSED(copyCover)
 
     jobAbortRequested=false;
+    QString baseDir=MPDConnection::self()->getDetails().dir;
     QString dest(baseDir+musicPath);
     if (!overwrite && (MusicLibraryModel::self()->songExists(s) || QFile::exists(dest))) {
         emit actionStatus(SongExists);
         return;
     }
 
-    overWrite=overWrite;
+    overWrite=overwrite;
     lastProg=-1;
-    currentMpdDir=baseDir;
     currentDestFile=baseDir+musicPath;
+    currentSong=s;
 
     QDir dir(Utils::getDir(dest));
     if (!dir.exists() && !Utils::createWorldReadableDir(dir.absolutePath(), baseDir)) {
@@ -75,6 +78,17 @@ void OnlineDevice::downloadFinished()
         QFile f(currentDestFile);
         if (f.open(QIODevice::WriteOnly)) {
             f.write(reply->readAll());
+
+            currentSong.file=currentDestFile.mid(MPDConnection::self()->getDetails().dir.length());
+            QString origPath;
+            if (MPDConnection::self()->isMopdidy()) {
+                origPath=currentSong.file;
+                currentSong.file=Song::encodePath(currentSong.file);
+            }
+            Utils::setFilePerms(currentDestFile);
+            MusicLibraryModel::self()->addSongToList(currentSong);
+            DirViewModel::self()->addFileToList(origPath.isEmpty() ? currentSong.file : origPath,
+                                                origPath.isEmpty() ? QString() : currentSong.file);
             emit actionStatus(Ok);
         } else {
             emit actionStatus(WriteFailed);
diff --git a/online/onlinedevice.h b/online/onlinedevice.h
index e84abe9..8baea36 100644
--- a/online/onlinedevice.h
+++ b/online/onlinedevice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -33,7 +33,7 @@ class OnlineDevice : public Device
     Q_OBJECT
 
 public:
-    OnlineDevice() : Device(0, QString(), QString()), lastProg(-1), job(0) { }
+    OnlineDevice() : Device(0, QString(), QString()), lastProg(-1), overWrite(false), job(0) { }
     virtual ~OnlineDevice() { }
 
     bool isConnected() const { return true; }
@@ -42,7 +42,7 @@ public:
     void stop() { }
     QString path() const { return QString(); }
     void addSong(const Song&, bool, bool) { }
-    void copySongTo(const Song &s, const QString &baseDir, const QString &musicPath, bool overwrite, bool copyCover);
+    void copySongTo(const Song &s, const QString &musicPath, bool overwrite, bool copyCover);
     void removeSong(const Song&) { }
     void cleanDirs(const QSet<QString>&) { }
     double usedCapacity() { return 0.0; }
diff --git a/online/onlineservice.cpp b/online/onlineservice.cpp
index e8351c2..faed47d 100644
--- a/online/onlineservice.cpp
+++ b/online/onlineservice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -92,7 +92,7 @@ bool OnlineMusicLoader::readFromCache()
 {
     if (!cache.isEmpty() && QFile::exists(cache)) {
         emit status(i18n("Reading cache"), 0);
-        if (library->fromXML(cache, QDateTime(), QString(), this)) {
+        if (library->fromXML(cache, QDateTime(), 0, QString(), this)) {
             if (!stopRequested) {
                 fixLibrary();
                 emit status(i18n("Updating display"), -100);
@@ -355,7 +355,9 @@ void OnlineService::applyUpdate()
 
 void OnlineService::loaderError(const QString &msg)
 {
+    loaded=true;
     lProgress=0;
+    emit error(data()+QLatin1String(" - ")+msg);
     setStatusMessage(msg);
     stopLoader();
     setBusy(false);
diff --git a/online/onlineservice.h b/online/onlineservice.h
index ffbabd3..5dcca4b 100644
--- a/online/onlineservice.h
+++ b/online/onlineservice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/onlineservicespage.cpp b/online/onlineservicespage.cpp
index 9f24b93..302731e 100644
--- a/online/onlineservicespage.cpp
+++ b/online/onlineservicespage.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -59,7 +59,6 @@ OnlineServicesPage::OnlineServicesPage(QWidget *p)
     view->addAction(StdActions::self()->addWithPriorityAction);
     view->addAction(StdActions::self()->addToStoredPlaylistAction);
     downloadAction = ActionCollection::get()->createAction("downloadtolibrary", i18n("Download To Library"), "go-down");
-    podcastSearchAction = ActionCollection::get()->createAction("podcastsearch", i18n("Search For Podcasts"), "edit-find");
     downloadPodcastAction = ActionCollection::get()->createAction("downloadpodcast", i18n("Download Podcast Episodes"), "go-down");
     deleteDownloadedPodcastAction = ActionCollection::get()->createAction("deletedownloadedpodcast", i18n("Delete Downloaded Podcast Episodes"), "edit-delete");
     connect(this, SIGNAL(add(const QStringList &, bool, quint8)), MPDConnection::self(), SLOT(add(const QStringList &, bool, quint8)));
@@ -69,7 +68,7 @@ OnlineServicesPage::OnlineServicesPage(QWidget *p)
     connect(OnlineServicesModel::self(), SIGNAL(updated(QModelIndex)), this, SLOT(updated(QModelIndex)));
 //    connect(OnlineServicesModel::self(), SIGNAL(needToSort()), this, SLOT(sortList()));
     connect(OnlineServicesModel::self(), SIGNAL(busy(bool)), view, SLOT(showSpinner(bool)));
-    connect(OnlineServicesModel::self(), SIGNAL(providersChanged()), view, SLOT(closeSearch()));
+    connect(OnlineServicesModel::self(), SIGNAL(providersChanged()), this, SLOT(providersChanged()));
     connect(view, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(itemDoubleClicked(const QModelIndex &)));
     connect(view, SIGNAL(searchItems()), this, SLOT(searchItems()));
     connect(view, SIGNAL(searchIsActive(bool)), this, SLOT(controlSearch(bool)));
@@ -81,7 +80,6 @@ OnlineServicesPage::OnlineServicesPage(QWidget *p)
     connect(OnlineServicesModel::self()->subscribeAct(), SIGNAL(triggered()), this, SLOT(subscribe()));
     connect(OnlineServicesModel::self()->unSubscribeAct(), SIGNAL(triggered()), this, SLOT(unSubscribe()));
     connect(OnlineServicesModel::self()->refreshSubscriptionAct(), SIGNAL(triggered()), this, SLOT(refreshSubscription()));
-    connect(podcastSearchAction, SIGNAL(triggered()), this, SLOT(searchForPodcasts()));
     connect(downloadAction, SIGNAL(triggered()), this, SLOT(download()));
     connect(downloadPodcastAction, SIGNAL(triggered()), this, SLOT(downloadPodcast()));
     connect(deleteDownloadedPodcastAction, SIGNAL(triggered()), this, SLOT(deleteDownloadedPodcast()));
@@ -92,7 +90,6 @@ OnlineServicesPage::OnlineServicesPage(QWidget *p)
     QAction *sep=new QAction(this);
     sep->setSeparator(true);
     menu->addAction(sep);
-    menu->addAction(podcastSearchAction);
     menu->addAction(OnlineServicesModel::self()->subscribeAct());
     menu->addAction(OnlineServicesModel::self()->unSubscribeAct());
     menu->addAction(OnlineServicesModel::self()->refreshSubscriptionAct());
@@ -105,7 +102,6 @@ OnlineServicesPage::OnlineServicesPage(QWidget *p)
 
     view->addAction(downloadAction);
     view->addAction(sep);
-    view->addAction(podcastSearchAction);
     view->addAction(OnlineServicesModel::self()->subscribeAct());
     view->addAction(OnlineServicesModel::self()->unSubscribeAct());
     view->addAction(OnlineServicesModel::self()->refreshSubscriptionAct());
@@ -116,6 +112,7 @@ OnlineServicesPage::OnlineServicesPage(QWidget *p)
 //    proxy.setDynamicSortFilter(false);
     view->setModel(&proxy);
     view->setRootIsDecorated(true);
+    view->setSearchResetLevel(1);
 }
 
 OnlineServicesPage::~OnlineServicesPage()
@@ -144,13 +141,7 @@ void OnlineServicesPage::showEvent(QShowEvent *e)
 void OnlineServicesPage::clear()
 {
     OnlineServicesModel::self()->clear();
-    view->setLevel(0);
-}
-
-QString OnlineServicesPage::activeService() const
-{
-    OnlineService *srv=activeSrv();
-    return srv ? srv->id() : QString();
+    view->goToTop();
 }
 
 OnlineService * OnlineServicesPage::activeSrv() const
@@ -199,14 +190,14 @@ QStringList OnlineServicesPage::selectedFiles() const
     return OnlineServicesModel::self()->filenames(mapped);
 }
 
-QList<Song> OnlineServicesPage::selectedSongs() const
+QList<Song> OnlineServicesPage::selectedSongs(bool allowPlaylists) const
 {
+    Q_UNUSED(allowPlaylists)
     QModelIndexList selected = view->selectedIndexes();
     if (selected.isEmpty()) {
         return QList<Song>();
     }
 
-    QString name;
     QModelIndexList mapped;
     foreach (const QModelIndex &idx, selected) {
         QModelIndex index = proxy.mapToSource(idx);
@@ -223,8 +214,9 @@ QList<Song> OnlineServicesPage::selectedSongs() const
     return OnlineServicesModel::self()->songs(mapped);
 }
 
-void OnlineServicesPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty)
+void OnlineServicesPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty, bool randomAlbums)
 {
+    Q_UNUSED(randomAlbums)
     QStringList files=selectedFiles();
 
     if (!files.isEmpty()) {
@@ -239,8 +231,9 @@ void OnlineServicesPage::addSelectionToPlaylist(const QString &name, bool replac
 
 void OnlineServicesPage::refresh()
 {
-    view->setLevel(0);
-    OnlineServicesModel::self()->clearImages();
+    OnlineServicesModel::self()->resetModel();
+    view->goToTop();
+    expandPodcasts();
 }
 
 void OnlineServicesPage::itemDoubleClicked(const QModelIndex &)
@@ -332,6 +325,8 @@ void OnlineServicesPage::controlSearch(bool on)
         QModelIndex filterIndex=srv ? OnlineServicesModel::self()->serviceIndex(srv) : QModelIndex();
         proxy.setFilterItem(srv);
         proxy.update(QString(), QString());
+        view->setSearchIndex(filterIndex.isValid() ? proxy.mapFromSource(filterIndex) : QModelIndex());
+        view->setSearchResetLevel(filterIndex.isValid() ? 0 : 1);
         if (filterIndex.isValid()) {
             view->expand(proxy.mapFromSource(filterIndex), true);
         }
@@ -345,6 +340,8 @@ void OnlineServicesPage::controlSearch(bool on)
         proxy.setFilterItem(0);
         proxy.update(QString(), QString());
         view->setBackgroundImage(QIcon());
+        view->setSearchIndex(QModelIndex());
+        view->setSearchResetLevel(1);
     }
 }
 
@@ -420,11 +417,9 @@ void OnlineServicesPage::controlActions()
     deleteDownloadedPodcastAction->setEnabled(canUnSubscribe);
     deleteDownloadedPodcastAction->setVisible(canUnSubscribe);
     OnlineServicesModel::self()->subscribeAct()->setEnabled(canSubscribe && 1==selected.count());
-    podcastSearchAction->setVisible(canSubscribe && 1==selected.count());
     OnlineServicesModel::self()->unSubscribeAct()->setEnabled(canUnSubscribe && 1==selected.count());
     OnlineServicesModel::self()->refreshSubscriptionAct()->setEnabled((canUnSubscribe || canSubscribe) && 1==selected.count());
     OnlineServicesModel::self()->refreshAct()->setEnabled(canRefresh && 1==selected.count());
-    podcastSearchAction->setEnabled(canSubscribe && 1==selected.count());
     downloadAction->setVisible(!srvSelected && canDownload && !selected.isEmpty() && 1==services.count());
     downloadAction->setEnabled(!srvSelected && canDownload && !selected.isEmpty() && 1==services.count());
     StdActions::self()->addToPlayQueueAction->setEnabled(!srvSelected && !selected.isEmpty());
@@ -460,12 +455,12 @@ void OnlineServicesPage::refreshService()
     if (MusicLibraryItem::Type_Root==item->itemType()) {
         OnlineService *srv=static_cast<OnlineService *>(item);
 
-        if (srv->isLoaded() && srv->childCount()>0 &&
-                MessageBox::No==MessageBox::questionYesNo(this, i18n("Re-download music listing for %1?", srv->id()), i18n("Re-download"),
-                                                          GuiItem(i18n("Re-download")), StdGuiItem::cancel())) {
-            return;
-        }
         if (srv) {
+            if (srv->isLoaded() && srv->childCount()>0 &&
+                    MessageBox::No==MessageBox::questionYesNo(this, i18n("Re-download music listing for %1?", srv->id()), i18n("Re-download"),
+                                                              GuiItem(i18n("Re-download")), StdGuiItem::cancel())) {
+                return;
+            }
             srv->reload(0==srv->childCount());
         }
     }
@@ -520,37 +515,9 @@ void OnlineServicesPage::download()
 
 void OnlineServicesPage::subscribe()
 {
-    const QModelIndexList selected = view->selectedIndexes(false); // Dont need sorted selection here...
-    if (1!=selected.size()) {
-        return;
-    }
-
-    MusicLibraryItem *item=static_cast<MusicLibraryItem *>(proxy.mapToSource(selected.first()).internalPointer());
-    if (MusicLibraryItem::Type_Root==item->itemType() && PodcastService::constName==static_cast<MusicLibraryItemRoot *>(item)->id()) {
-        PodcastService *srv=static_cast<PodcastService *>(item);
-        bool ok=false;
-        QString url=InputDialog::getText(i18n("Subscribe to Podcast"), i18n("Enter podcast URL:"), QString(), &ok, this);
-
-        if (url.isEmpty() || !ok) {
-            return;
-        }
-
-        QUrl u(PodcastService::fixUrl(url));
-
-        if (!PodcastService::isUrlOk(u)) {
-            MessageBox::error(this, i18n("Invalid URL!"));
-            return;
-        }
-
-        if (srv->subscribedToUrl(u)) {
-            MessageBox::error(this, i18n("You are already subscribed to this URL!"));
-            return;
-        }
-        if (srv->processingUrl(u)) {
-            MessageBox::error(this, i18n("Already downloading this URL!"));
-            return;
-        }
-        srv->addUrl(u);
+    if (0==PodcastSearchDialog::instanceCount()) {
+        PodcastSearchDialog *dlg=new PodcastSearchDialog(this);
+        dlg->show();
     }
 }
 
@@ -625,14 +592,6 @@ void OnlineServicesPage::refreshSubscription()
     srv->refreshSubscription(item);
 }
 
-void OnlineServicesPage::searchForPodcasts()
-{
-    if (0==PodcastSearchDialog::instanceCount()) {
-        PodcastSearchDialog *dlg=new PodcastSearchDialog(this);
-        dlg->show();
-    }
-}
-
 static QString format(const QMap<MusicLibraryItemPodcast *, QList<MusicLibraryItemPodcastEpisode *> > &urls)
 {
     QString rv;
@@ -778,6 +737,13 @@ void OnlineServicesPage::showPreferencesPage()
     emit showPreferencesPage(QLatin1String("online"));
 }
 
+void OnlineServicesPage::providersChanged()
+{
+    view->setSearchIndex(QModelIndex());
+    view->setSearchResetLevel(1);
+    view->closeSearch();
+}
+
 void OnlineServicesPage::updated(const QModelIndex &idx)
 {
 //    MusicLibraryItem *item=static_cast<MusicLibraryItem *>(idx.internalPointer());
diff --git a/online/onlineservicespage.h b/online/onlineservicespage.h
index 10dd933..9bbf41e 100644
--- a/online/onlineservicespage.h
+++ b/online/onlineservicespage.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -27,11 +27,12 @@
 #include "ui_onlineservicespage.h"
 #include "onlineservice.h"
 #include "musiclibraryproxymodel.h"
+#include "page.h"
 
 class Action;
 class QAction;
 
-class OnlineServicesPage : public QWidget, public Ui::OnlineServicesPage
+class OnlineServicesPage : public QWidget, public Ui::OnlineServicesPage, public Page
 {
     Q_OBJECT
 
@@ -41,13 +42,11 @@ public:
 
     void setEnabled(bool e);
     void clear();
-    QString activeService() const;
     QStringList selectedFiles() const;
-    QList<Song> selectedSongs() const;
-    void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0);
+    QList<Song> selectedSongs(bool allowPlaylists=false) const;
+    void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0, bool randomAlbums=false);
     void setView(int v) { view->setMode((ItemView::Mode)v); }
     void focusSearch() { view->focusSearch(); }
-    void goBack() { view->backActivated(); }
     void refresh();
     void showEvent(QShowEvent *e);
 
@@ -66,10 +65,10 @@ public Q_SLOTS:
     void subscribe();
     void unSubscribe();
     void refreshSubscription();
-    void searchForPodcasts();
     void downloadPodcast();
     void deleteDownloadedPodcast();
     void showPreferencesPage();
+    void providersChanged();
 
 Q_SIGNALS:
     // These are for communicating with MPD object (which is in its own thread, so need to talk via signal/slots)
@@ -86,7 +85,6 @@ private:
 private:
     MusicLibraryProxyModel proxy;
     Action *downloadAction;
-    Action *podcastSearchAction;
     Action *downloadPodcastAction;
     Action *deleteDownloadedPodcastAction;
     QSet<QString> genres;
diff --git a/online/onlinesettings.cpp b/online/onlinesettings.cpp
index d8ac40e..1594f76 100644
--- a/online/onlinesettings.cpp
+++ b/online/onlinesettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/onlinesettings.h b/online/onlinesettings.h
index 0d7c659..610daf2 100644
--- a/online/onlinesettings.h
+++ b/online/onlinesettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/onlinesettings.ui b/online/onlinesettings.ui
index 9480868..cc86d87 100644
--- a/online/onlinesettings.ui
+++ b/online/onlinesettings.ui
@@ -9,7 +9,7 @@
    <item row="0" column="0" colspan="2">
     <widget class="QLabel" name="label">
      <property name="text">
-      <string>The following is a list of online providers, to hide a provider simply un-check its entry in this list.</string>
+     <string>Use the checkboxes below to configure the list of active services.</string>
      </property>
      <property name="wordWrap">
       <bool>true</bool>
diff --git a/online/opmlparser.cpp b/online/opmlparser.cpp
index d865fe5..6416d08 100644
--- a/online/opmlparser.cpp
+++ b/online/opmlparser.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/opmlparser.h b/online/opmlparser.h
index 8414706..01866cb 100644
--- a/online/opmlparser.h
+++ b/online/opmlparser.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/podcastsearchdialog.cpp b/online/podcastsearchdialog.cpp
index 73a077d..0153ebb 100644
--- a/online/podcastsearchdialog.cpp
+++ b/online/podcastsearchdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -36,6 +36,8 @@
 #include "action.h"
 #include "textbrowser.h"
 #include "messagewidget.h"
+#include "rssparser.h"
+#include <QLabel>
 #include <QPushButton>
 #include <QTreeWidget>
 #include <QGridLayout>
@@ -57,6 +59,7 @@ static int iCount=0;
 
 static QCache<QUrl, QImage> imageCache(200*1024);
 static int maxImageSize=-1;
+static const char * constOrigUrlProperty="orig-url";
 
 enum Roles {
     IsPodcastRole = Qt::UserRole,
@@ -145,9 +148,9 @@ PodcastPage::PodcastPage(QWidget *p, const QString &n)
     tree->header()->setVisible(false);
     text=new TextBrowser(this);
     spinner=new Spinner(this);
-    spinner->setWidget(tree->viewport());
+    spinner->setWidget(tree);
     imageSpinner=new Spinner(this);
-    imageSpinner->setWidget(text->viewport());
+    imageSpinner->setWidget(text);
     connect(tree, SIGNAL(itemSelectionChanged()), SLOT(selectionChanged()));
     tree->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
     text->setOpenLinks(false);
@@ -155,6 +158,12 @@ PodcastPage::PodcastPage(QWidget *p, const QString &n)
     updateText();
 }
 
+QUrl PodcastPage::currentRss() const
+{
+    QList<QTreeWidgetItem *> selection=tree->selectedItems();
+    return selection.isEmpty() ? QUrl() : selection.at(0)->data(0, UrlRole).toUrl();
+}
+
 void PodcastPage::fetch(const QUrl &url)
 {
     cancel();
@@ -168,7 +177,8 @@ void PodcastPage::fetchImage(const QUrl &url)
 {
     cancelImage();
     imageSpinner->start();
-    imageJob=NetworkAccessManager::self()->get(url);
+    imageJob=NetworkAccessManager::self()->get(url, 5000);
+    imageJob->setProperty(constOrigUrlProperty, url);
     connect(imageJob, SIGNAL(finished()), this, SLOT(imageJobFinished()));
 }
 
@@ -176,8 +186,7 @@ void PodcastPage::cancel()
 {
     spinner->stop();
     if (job) {
-        disconnect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
-        job->deleteLater();
+        job->cancelAndDelete();
         job=0;
     }
 }
@@ -186,8 +195,7 @@ void PodcastPage::cancelImage()
 {
     imageSpinner->stop();
     if (imageJob) {
-        disconnect(imageJob, SIGNAL(finished()), this, SLOT(imageJobFinished()));
-        imageJob->deleteLater();
+        imageJob->cancelAndDelete();
         imageJob=0;
     }
 }
@@ -273,12 +281,13 @@ void PodcastPage::imageJobFinished()
     if (imageSpinner) {
         imageSpinner->stop();
     }
-    QImage img=QImage::fromData(imageJob->readAll());
+    QByteArray data=imageJob->readAll();
+    QImage img=QImage::fromData(data, Covers::imageFormat(data));
     if (!img.isNull()) {
         if (img.width()>maxImageSize || img.height()>maxImageSize) {
             img=img.scaled(maxImageSize, maxImageSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
         }
-        imageCache.insert(imageJob->url(), new QImage(img), img.byteCount());
+        imageCache.insert(imageJob->property(constOrigUrlProperty).toUrl(), new QImage(img), img.byteCount());
         updateText();
     }
     imageJob=0;
@@ -493,6 +502,76 @@ void OpmlBrowsePage::addPodcast(const OpmlParser::Podcast &pod, QTreeWidgetItem
     PodcastPage::addPodcast(pod.name, pod.url, pod.image, pod.description, pod.htmlUrl, p);
 }
 
+PodcastUrlPage::PodcastUrlPage(QWidget *p)
+    : PodcastPage(p, i18n("URL"))
+{
+    QBoxLayout *searchLayout=new QBoxLayout(QBoxLayout::LeftToRight);
+    QBoxLayout *viewLayout=new QBoxLayout(QBoxLayout::LeftToRight);
+    QBoxLayout *mainLayout=new QBoxLayout(QBoxLayout::TopToBottom, this);
+    searchLayout->setMargin(0);
+    viewLayout->setMargin(0);
+    mainLayout->setMargin(0);
+    urlEntry=new LineEdit(p);
+    urlEntry->setPlaceholderText(i18n("Enter podcast URL..."));
+    loadButton=new QPushButton(i18n("Load"), p);
+    QWidget::setTabOrder(urlEntry, loadButton);
+    QWidget::setTabOrder(loadButton, tree);
+    searchLayout->addWidget(urlEntry);
+    searchLayout->addWidget(loadButton);
+    viewLayout->addWidget(tree, 1);
+    viewLayout->addWidget(text, 0);
+    mainLayout->addWidget(new QLabel(i18n("Enter podcast URL below, and press 'Load'"), this));
+    mainLayout->addLayout(searchLayout);
+    mainLayout->addLayout(viewLayout);
+    connect(urlEntry, SIGNAL(returnPressed()), SLOT(loadUrl()));
+    connect(loadButton, SIGNAL(clicked()), SLOT(loadUrl()));
+    icn.addFile(":podcasts");
+}
+
+void PodcastUrlPage::showEvent(QShowEvent *e)
+{
+    urlEntry->setFocus();
+    QWidget::showEvent(e);
+}
+
+void PodcastUrlPage::loadUrl()
+{
+    QString text=urlEntry->text().trimmed();
+    if (text.isEmpty()) {
+        return;
+    }
+
+    QUrl url(PodcastService::fixUrl(text));
+    if (url==currentUrl) {
+        return;
+    }
+
+    if (!PodcastService::isUrlOk(url)) {
+        emit error(i18n("Invalid URL!"));
+    } else {
+        currentUrl=url;
+        fetch(url);
+    }
+}
+
+void PodcastUrlPage::parseResonse(QIODevice *dev)
+{
+    if (!dev) {
+        emit error(i18n("Failed to fetch podcast!"));
+        return;
+    }
+    RssParser::Channel ch=RssParser::parse(dev, false, true);
+    if (!ch.isValid()) {
+        emit error(i18n("Failed to parse podcast."));
+        return;
+    }
+    if (!ch.isValid()) {
+        emit error(i18n("Cantata only supports audio podcasts! The URL entered contains only video podcasts."));
+        return;
+    }
+    addPodcast(ch.name, currentUrl, ch.image, ch.description, QString(), 0);
+}
+
 int PodcastSearchDialog::instanceCount()
 {
     return iCount;
@@ -515,13 +594,17 @@ PodcastSearchDialog::PodcastSearchDialog(QWidget *parent)
     layout->setMargin(0);
     layout->setSpacing(0);
 
-    PageWidget *pageWidget = new PageWidget(mainWidget);
+    pageWidget = new PageWidget(mainWidget);
     QList<PodcastPage *> pages;
 
     layout->addWidget(messageWidget);
     layout->addWidget(spacer);
     layout->addWidget(pageWidget);
 
+    PodcastUrlPage *urlPage=new PodcastUrlPage(pageWidget);
+    pageWidget->addPage(urlPage, i18n("Enter URL"), urlPage->icon(), i18n("Manual podcast URL"));
+    pages << urlPage;
+
     ITunesSearchPage *itunes=new ITunesSearchPage(pageWidget);
     pageWidget->addPage(itunes, i18n("Search %1", itunes->name()), itunes->icon(), i18n("Search for podcasts on %1", itunes->name()));
     pages << itunes;
@@ -551,7 +634,7 @@ PodcastSearchDialog::PodcastSearchDialog(QWidget *parent)
         connect(p, SIGNAL(error(QString)), SLOT(showError(QString)));
     }
 
-    setCaption(i18n("Search For Podcasts"));
+    setCaption(i18n("Add Podcast Subscription"));
     setMainWidget(mainWidget);
     setAttribute(Qt::WA_DeleteOnClose);
     enableButton(User1, false);
@@ -562,6 +645,7 @@ PodcastSearchDialog::PodcastSearchDialog(QWidget *parent)
     }
     connect(OnlineServicesModel::self(), SIGNAL(podcastError(QString)), this, SLOT(showError(QString)));
     connect(messageWidget, SIGNAL(visible(bool)), SLOT(msgWidgetVisible(bool)));
+    connect(pageWidget, SIGNAL(currentPageChanged()), this, SLOT(pageChanged()));
     messageWidget->hide();
 }
 
@@ -593,6 +677,13 @@ void PodcastSearchDialog::msgWidgetVisible(bool v)
     spacer->setFixedSize(spacer->width(), v ? spacer->width() : 0);
 }
 
+void PodcastSearchDialog::pageChanged()
+{
+    PageWidgetItem *pwi=pageWidget->currentPage();
+    PodcastPage *page=pwi ? qobject_cast<PodcastPage *>(pwi->widget()) : 0;
+    rssSelected(page ? page->currentRss() : QUrl());
+}
+
 void PodcastSearchDialog::slotButtonClicked(int button)
 {
     switch (button) {
diff --git a/online/podcastsearchdialog.h b/online/podcastsearchdialog.h
index 7da7ac9..76556ba 100644
--- a/online/podcastsearchdialog.h
+++ b/online/podcastsearchdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -38,6 +38,7 @@ class Spinner;
 class QTreeWidgetItem;
 class TextBrowser;
 class MessageWidget;
+class PageWidget;
 
 namespace OpmlParser
 {
@@ -54,6 +55,7 @@ public:
     
     const Icon & icon() const { return icn; }
     const QString & name() const { return pageName; }
+    QUrl currentRss() const;
 
 Q_SIGNALS:
     void rssSelected(const QUrl &url);
@@ -134,6 +136,27 @@ private:
     QUrl url;
 };
 
+class PodcastUrlPage : public PodcastPage
+{
+    Q_OBJECT
+public:
+    PodcastUrlPage(QWidget *p);
+    virtual ~PodcastUrlPage() { }
+
+    void showEvent(QShowEvent *e);
+
+private:
+    void parseResonse(QIODevice *dev);
+
+private Q_SLOTS:
+    void loadUrl();
+
+protected:
+    LineEdit *urlEntry;
+    QPushButton *loadButton;
+    QUrl currentUrl;
+};
+
 class PodcastSearchDialog : public Dialog
 {
     Q_OBJECT
@@ -150,12 +173,14 @@ private Q_SLOTS:
     void showError(const QString &msg);
     void showInfo(const QString &msg);
     void msgWidgetVisible(bool v);
+    void pageChanged();
 
 private:
     void slotButtonClicked(int button);
 
 private:
     QUrl currentUrl;
+    PageWidget *pageWidget;
     MessageWidget *messageWidget;
     QWidget *spacer;
 };
diff --git a/online/podcastservice.cpp b/online/podcastservice.cpp
index e0153da..b58016f 100644
--- a/online/podcastservice.cpp
+++ b/online/podcastservice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -125,8 +125,12 @@ Song PodcastService::fixPath(const Song &orig, bool) const
     song.setPodcastLocalPath(QString());
     song.setIsFromOnlineService(constName);
     if (!orig.podcastLocalPath().isEmpty() && QFile::exists(orig.podcastLocalPath())) {
-        song.file=orig.podcastLocalPath();
-        song.file=HttpServer::self()->encodeUrl(song);
+        if (!HttpServer::self()->forceUsage() && MPDConnection::self()->getDetails().isLocal()) {
+            song.file=QLatin1String("file://")+orig.podcastLocalPath();
+        } else if (HttpServer::self()->isAlive()) {
+            song.file=orig.podcastLocalPath();
+            song.file=HttpServer::self()->encodeUrl(song);
+        }
         return song;
     }
     return encode(song);
@@ -173,8 +177,7 @@ void PodcastService::cancelAll()
 {
     foreach (NetworkJob *j, rssJobs) {
         disconnect(j, SIGNAL(finished()), this, SLOT(rssJobFinished()));
-        j->abort();
-        j->deleteLater();
+        j->cancelAndDelete();
     }
     rssJobs.clear();
     setBusy(!rssJobs.isEmpty() || !downloadJobs.isEmpty());
@@ -368,7 +371,7 @@ bool PodcastService::processingUrl(const QUrl &url) const
 void PodcastService::addUrl(const QUrl &url, bool isNew)
 {
     setBusy(true);
-    NetworkJob *job=NetworkAccessManager::self()->get(QUrl(url));
+    NetworkJob *job=NetworkAccessManager::self()->get(url);
     connect(job, SIGNAL(finished()), this, SLOT(rssJobFinished()));
     job->setProperty(constNewFeedProperty, isNew);
     rssJobs.append(job);
@@ -451,7 +454,7 @@ void PodcastService::downloadEpisode(const MusicLibraryItemPodcast *podcast, con
 
     dest=Utils::fixPath(dest)+Utils::fixPath(encodeName(podcast->data()))+Utils::getFile(episode.toString());
     setBusy(true);
-    NetworkJob *job=NetworkAccessManager::self()->get(QUrl(episode));
+    NetworkJob *job=NetworkAccessManager::self()->get(episode);
     connect(job, SIGNAL(finished()), this, SLOT(downloadJobFinished()));
     connect(job, SIGNAL(readyRead()), this, SLOT(downloadReadyRead()));
     connect(job, SIGNAL(downloadPercent(int)), this, SLOT(downloadPercent(int)));
@@ -479,11 +482,7 @@ void PodcastService::cancelDownload(const QUrl &url)
 
 void PodcastService::cancelDownload(NetworkJob *job)
 {
-    disconnect(job, SIGNAL(finished()), this, SLOT(downloadJobFinished()));
-    disconnect(job, SIGNAL(readyRead()), this, SLOT(downloadReadyRead()));
-    disconnect(job, SIGNAL(downloadPercent(int)), this, SLOT(downloadPercent(int)));
-    job->abort();
-    job->deleteLater();
+    job->cancelAndDelete();
 
     QString dest=job->property(constDestProperty).toString();
     QString partial=dest.isEmpty() ? QString() : QString(dest+constPartialExt);
diff --git a/online/podcastservice.h b/online/podcastservice.h
index bfc3fc4..3f96dc4 100644
--- a/online/podcastservice.h
+++ b/online/podcastservice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/online/podcastsettingsdialog.cpp b/online/podcastsettingsdialog.cpp
index d14b749..5a320a5 100644
--- a/online/podcastsettingsdialog.cpp
+++ b/online/podcastsettingsdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -28,6 +28,7 @@
 #include "localize.h"
 #include "utils.h"
 #include <QComboBox>
+#include <QCheckBox>
 #include <QFormLayout>
 
 static void setIndex(QComboBox *combo, int val)
@@ -57,15 +58,13 @@ PodcastSettingsDialog::PodcastSettingsDialog(QWidget *p)
     QFormLayout * lay=new QFormLayout(mw);
     BuddyLabel * updateLabel=new BuddyLabel(i18n("Check for new episodes:"), mw);
     BuddyLabel * downloadLabel=new BuddyLabel(i18n("Download episodes to:"), mw);
-    BuddyLabel * autoDownloadLabel=new BuddyLabel(i18n("Automatically download new episodes:"), mw);
 
     updateCombo = new QComboBox(this);
     updateLabel->setBuddy(updateCombo);
     downloadPath = new PathRequester(this);
     downloadLabel->setBuddy(downloadPath);
     downloadPath->setDirMode(true);
-    autoDownload = new OnOffButton(this);
-    autoDownloadLabel->setBuddy(autoDownload);
+    autoDownload = new QCheckBox(i18n("Automatically download new episodes"), this);
 
     int row=0;
     lay->setWidget(row, QFormLayout::LabelRole, updateLabel);
@@ -74,8 +73,7 @@ PodcastSettingsDialog::PodcastSettingsDialog(QWidget *p)
     lay->setWidget(row++, QFormLayout::FieldRole, downloadPath);
     lay->setWidget(row, QFormLayout::LabelRole, downloadLabel);
     lay->setWidget(row++, QFormLayout::FieldRole, downloadPath);
-    lay->setWidget(row, QFormLayout::LabelRole, autoDownloadLabel);
-    lay->setWidget(row++, QFormLayout::FieldRole, autoDownload);
+    lay->setWidget(row++, QFormLayout::SpanningRole, autoDownload);
 
     setButtons(Ok|Cancel);
     setMainWidget(mw);
diff --git a/online/podcastsettingsdialog.h b/online/podcastsettingsdialog.h
index 03b8de9..937e7c9 100644
--- a/online/podcastsettingsdialog.h
+++ b/online/podcastsettingsdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -25,9 +25,9 @@
 #define PODCAST_SETTINGS_DIALOG_H
 
 #include "dialog.h"
-#include "onoffbutton.h"
 
 class QComboBox;
+class QCheckBox;
 class PathRequester;
 
 class PodcastSettingsDialog : public Dialog
@@ -55,7 +55,7 @@ private:
     QComboBox *updateCombo;
     int origRssUpdate;
     PathRequester *downloadPath;
-    OnOffButton *autoDownload;
+    QCheckBox *autoDownload;
     QString origPodcastDownloadPath;
     bool origPodcastAutoDownload;
     int changed;
diff --git a/online/rssparser.cpp b/online/rssparser.cpp
index f832698..0168906 100644
--- a/online/rssparser.cpp
+++ b/online/rssparser.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -133,7 +133,7 @@ static Episode parseEpisode(QXmlStreamReader &reader)
     return ep;
 }
 
-Channel RssParser::parse(QIODevice *dev)
+Channel RssParser::parse(QIODevice *dev, bool getEpisodes, bool getDescription)
 {
     Channel ch;
     QXmlStreamReader reader(dev);
@@ -152,13 +152,17 @@ Channel RssParser::parse(QIODevice *dev)
                     } else {
                         ch.image=parseImage(reader);
                     }
-                } else if (QLatin1String("item")==name) {
+                } else if (getEpisodes && QLatin1String("item")==name) {
                     Episode ep=parseEpisode(reader);
                     if (!ep.name.isEmpty() && !ep.url.isEmpty()) {
                         ch.episodes.append(ep);
                     } else if (ep.video) {
                         ch.video=true;
                     }
+                } else if (getDescription && QLatin1String("description")==name && ch.description.isEmpty()) {
+                    ch.description=reader.readElementText();
+                } else if (getDescription && QLatin1String("summary")==name && ch.description.isEmpty() && constITunesNameSpace==reader.namespaceUri()) {
+                    ch.description=reader.readElementText();
                 } else {
                     consumeCurrentElement(reader);
                 }
diff --git a/online/rssparser.h b/online/rssparser.h
index 99251d6..229faca 100644
--- a/online/rssparser.h
+++ b/online/rssparser.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -51,11 +51,12 @@ struct Channel
     QString name;
     QUrl image;
     QList<Episode> episodes;
+    QString description;
     bool video;
     bool isValid() const { return !name.isEmpty(); }
 };
 
-Channel parse(QIODevice *dev);
+Channel parse(QIODevice *dev, bool getEpisodes=true, bool getDescription=false);
 
 }
 
diff --git a/online/soundcloudservice.cpp b/online/soundcloudservice.cpp
index f6809a6..118dd0f 100644
--- a/online/soundcloudservice.cpp
+++ b/online/soundcloudservice.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -103,9 +103,7 @@ void SoundCloudService::setSearch(const QString &searchTerm)
 void SoundCloudService::cancelAll()
 {
     if (job) {
-        disconnect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
-        job->abort();
-        job->deleteLater();
+        job->cancelAndDelete();
         job=0;
     }
     setBusy(false);
diff --git a/online/soundcloudservice.h b/online/soundcloudservice.h
index dae9c19..9b7f7c4 100644
--- a/online/soundcloudservice.h
+++ b/online/soundcloudservice.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/po/cantata.pot b/po/cantata.pot
index db27442..df72ec7 100644
--- a/po/cantata.pot
+++ b/po/cantata.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-14 20:26+0000\n"
+"POT-Creation-Date: 2014-02-02 20:02+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -22,14 +22,13 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr ""
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:307
-#: gui/cachesettings.cpp:262
+#: context/albumview.cpp:71 gui/cachesettings.cpp:269
 msgid "Album Information"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:143
+#. i18n: file: devices/albumdetails.ui:136
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
+#: context/albumview.cpp:175 po/rc.cpp:107 rc.cpp:107
 msgid "Tracks"
 msgstr ""
 
@@ -37,22 +36,22 @@ msgstr ""
 msgid "Refresh Artist Information"
 msgstr ""
 
-#: context/artistview.cpp:92 context/contextwidget.cpp:306
-#: gui/cachesettings.cpp:260
+#: context/artistview.cpp:92 gui/cachesettings.cpp:267
 msgid "Artist Information"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:137
+#. i18n: file: gui/interfacesettings.ui:272
 #. i18n: ectx: attribute (title), widget (QWidget, tab_2)
-#: context/artistview.cpp:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
+#: context/artistview.cpp:314 gui/interfacesettings.cpp:106
+#: gui/mainwindow.cpp:308 po/rc.cpp:588 rc.cpp:588
 msgid "Albums"
 msgstr ""
 
-#: context/artistview.cpp:333
+#: context/artistview.cpp:337
 msgid "Web Links"
 msgstr ""
 
-#: context/artistview.cpp:419
+#: context/artistview.cpp:424
 msgid "Similar Artists"
 msgstr ""
 
@@ -60,22 +59,29 @@ msgstr ""
 msgid "Lyrics Providers"
 msgstr ""
 
-#: context/contextsettings.cpp:37
+#: context/contextsettings.cpp:37 gui/cachesettings.cpp:278
 msgid "Wikipedia Languages"
 msgstr ""
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
-#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1388
+#: models/streamsmodel.cpp:1434 models/streamsmodel.cpp:1642
 msgid "Other"
 msgstr ""
 
-#: context/contextwidget.cpp:98
+#: context/contextwidget.cpp:293
 msgid "Reset Spacing"
 msgstr ""
 
-#: context/contextwidget.cpp:308 context/songview.cpp:105
-#: gui/cachesettings.cpp:259
-msgid "Lyrics"
+#: context/contextwidget.cpp:506
+msgid "&Artist"
+msgstr ""
+
+#: context/contextwidget.cpp:507
+msgid "Al&bum"
+msgstr ""
+
+#: context/contextwidget.cpp:508
+msgid "&Lyrics"
 msgstr ""
 
 #: context/lastfmengine.cpp:63
@@ -93,37 +99,38 @@ msgid ""
 "original song title and artist as displayed in Cantata."
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#: context/lyricsdialog.cpp:64 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
-#: rc.cpp:61 rc.cpp:304 rc.cpp:789
+#: context/lyricsdialog.cpp:64 gui/searchpage.cpp:204 po/rc.cpp:92
+#: po/rc.cpp:377 po/rc.cpp:941 rc.cpp:92 rc.cpp:377 rc.cpp:941
 msgid "Title:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#: context/lyricsdialog.cpp:66 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
-#: rc.cpp:55 rc.cpp:292 rc.cpp:792
+#: context/lyricsdialog.cpp:66 devices/actiondialog.cpp:800
+#: gui/searchpage.cpp:197 po/rc.cpp:86 po/rc.cpp:362 po/rc.cpp:944 rc.cpp:86
+#: rc.cpp:362 rc.cpp:944
 msgid "Artist:"
 msgstr ""
 
@@ -135,95 +142,123 @@ msgstr ""
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr ""
 
-#: context/lyricsettings.cpp:66
-msgid "(Polish Translations)"
+#: context/othersettings.cpp:45 gui/coverdialog.cpp:877
+#: gui/interfacesettings.cpp:174
+msgid "Images (*.png *.jpg)"
 msgstr ""
 
-#: context/lyricsettings.cpp:67
-msgid "(Portuguese Translations)"
+#: context/othersettings.cpp:47 gui/interfacesettings.cpp:176
+msgctxt "pixels"
+msgid "10px"
 msgstr ""
 
-#: context/songview.cpp:89
-msgid "Refresh Lyrics"
+#: context/othersettings.cpp:102 gui/interfacesettings.cpp:524
+msgctxt "value%"
+msgid "%1%"
+msgstr ""
+
+#: context/othersettings.cpp:107 gui/interfacesettings.cpp:529
+#, c-format
+msgctxt "pixels"
+msgid "%1px"
 msgstr ""
 
 #: context/songview.cpp:90
-msgid "Edit Lyrics"
+msgid "Refresh Lyrics"
 msgstr ""
 
 #: context/songview.cpp:91
-msgid "Save Lyrics"
+msgid "Edit Lyrics"
 msgstr ""
 
 #: context/songview.cpp:92
-msgid "Cancel Editing Lyrics"
+msgid "Save Lyrics"
 msgstr ""
 
 #: context/songview.cpp:93
+msgid "Cancel Editing Lyrics"
+msgstr ""
+
+#: context/songview.cpp:94
 msgid "Delete Lyrics File"
 msgstr ""
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:106 gui/cachesettings.cpp:266
+msgid "Lyrics"
+msgstr ""
+
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort editing of lyrics?"
 msgstr ""
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort Editing"
 msgstr ""
 
-#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
-#: replaygain/rgdialog.cpp:252 replaygain/rgdialog.cpp:253
-#: replaygain/rgdialog.cpp:261 replaygain/rgdialog.cpp:262
-#: tags/trackorganiser.cpp:150
+#: context/songview.cpp:120 context/songview.cpp:139 context/songview.cpp:198
+#: replaygain/rgdialog.cpp:247 replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:256 replaygain/rgdialog.cpp:257
+#: tags/trackorganiser.cpp:164
 msgid "Abort"
 msgstr ""
 
-#: context/songview.cpp:121
+#: context/songview.cpp:122
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr ""
 
-#: context/songview.cpp:121 context/songview.cpp:122
-#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
+#: context/songview.cpp:122 context/songview.cpp:123
+#: online/onlineservicespage.cpp:458 online/onlineservicespage.cpp:459
 msgid "Re-download"
 msgstr ""
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Current playing song has changed, still perform search?"
 msgstr ""
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Song Changed"
 msgstr ""
 
-#: context/songview.cpp:148
+#: context/songview.cpp:149
 msgid "Perform Search"
 msgstr ""
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save updated lyrics?"
 msgstr ""
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save"
 msgstr ""
 
-#: context/songview.cpp:185
+#: context/songview.cpp:186
 msgid "Failed to save lyrics."
 msgstr ""
 
-#: context/songview.cpp:207
+#: context/songview.cpp:208
 msgid "Delete lyrics file?"
 msgstr ""
 
-#: context/songview.cpp:207 gui/mainwindow.cpp:292
-#: widgets/messageoverlay.cpp:43
-msgid "Cancel"
+#: context/songview.cpp:208
+msgid "Delete File"
 msgstr ""
 
-#: context/songview.cpp:431
+#: context/songview.cpp:462
 msgid "Fetching lyrics via %1"
 msgstr ""
 
+#: context/ultimatelyricsprovider.cpp:200
+msgid "(Polish Translations)"
+msgstr ""
+
+#: context/ultimatelyricsprovider.cpp:201
+msgid "(Portuguese Translations)"
+msgstr ""
+
+#: context/view.cpp:91 gui/mainwindow.cpp:328 widgets/messageoverlay.cpp:44
+msgid "Cancel"
+msgstr ""
+
 #: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr ""
@@ -246,14 +281,14 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr ""
 
-#: context/wikipediasettings.cpp:99
+#: context/wikipediasettings.cpp:114
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
 msgstr ""
 
-#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
-#: online/podcastsearchdialog.cpp:393
+#: context/wikipediasettings.cpp:115 models/streamsmodel.cpp:598
+#: online/podcastsearchdialog.cpp:404
 msgid "Reload"
 msgstr ""
 
@@ -261,37 +296,47 @@ msgstr ""
 msgid "Cantata is playing a track"
 msgstr ""
 
-#: devices/actiondialog.cpp:76
+#: devices/actiondialog.cpp:83
 msgid "Songs To Be Copied"
 msgstr ""
 
-#: devices/actiondialog.cpp:146
+#: devices/actiondialog.cpp:153
 msgid "<b>INVALID</b>"
 msgstr ""
 
-#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
+#: devices/actiondialog.cpp:167 devices/actiondialog.cpp:170
 msgid "<i>(When different)</i>"
 msgstr ""
 
-#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:185 tags/tageditor.cpp:713
+#: tags/trackorganiser.cpp:444
+msgid ""
+"Cantata has detected that you are connected to a Mopidy server.\n"
+"\n"
+"Currently it is not possible for Cantata to force Mopidy to refresh its "
+"local music listing. Therefore, you will need to stop Cantata, manually "
+"refresh Mopidy's database, and restart Cantata for any changes to be active."
+msgstr ""
+
+#: devices/actiondialog.cpp:211 devices/synccollectionwidget.cpp:274
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr ""
 
-#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
-#: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
+#: devices/actiondialog.cpp:271 devices/mtpdevice.cpp:1622
+#: devices/remotefsdevice.cpp:571 devices/umsdevice.cpp:103
 msgid "%1 free"
 msgstr ""
 
-#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
+#: devices/actiondialog.cpp:284 devices/actiondialog.cpp:288
 msgid "Local Music Library"
 msgstr ""
 
-#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
+#: devices/actiondialog.cpp:286 devices/albumdetailsdialog.cpp:104
+#: gui/preferencesdialog.cpp:115 widgets/groupedview.cpp:251
 msgid "Audio CD"
 msgstr ""
 
-#: devices/actiondialog.cpp:293
+#: devices/actiondialog.cpp:309
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -299,259 +344,273 @@ msgid ""
 "successfully copied."
 msgstr ""
 
-#: devices/actiondialog.cpp:300
+#: devices/actiondialog.cpp:316
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
 msgstr ""
 
-#: devices/actiondialog.cpp:349
+#: devices/actiondialog.cpp:365
 msgid "Copy Songs"
 msgstr ""
 
-#: devices/actiondialog.cpp:349 devices/devicespage.cpp:503
-#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: devices/actiondialog.cpp:365 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:214 gui/folderpage.cpp:270 gui/librarypage.cpp:257
 #: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr ""
 
-#: devices/actiondialog.cpp:380
+#: devices/actiondialog.cpp:402
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
 msgstr ""
 
-#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
+#: devices/actiondialog.cpp:403 devices/actiondialog.cpp:407
 msgid "Not Configured"
 msgstr ""
 
-#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
+#: devices/actiondialog.cpp:404 devices/actiondialog.cpp:408
 msgid "Use Defaults"
 msgstr ""
 
-#: devices/actiondialog.cpp:384
+#: devices/actiondialog.cpp:406
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
 msgstr ""
 
-#: devices/actiondialog.cpp:446
+#: devices/actiondialog.cpp:468
 msgid "Are you sure you wish to stop?"
 msgstr ""
 
-#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
+#: devices/actiondialog.cpp:468 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr ""
 
-#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
-#: tags/trackorganiser.cpp:446
+#: devices/actiondialog.cpp:513 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:468 tags/tageditor.cpp:880
+#: tags/trackorganiser.cpp:478
 msgid "Device has been removed!"
 msgstr ""
 
-#: devices/actiondialog.cpp:491
+#: devices/actiondialog.cpp:515
 msgid "Device is not connected!"
 msgstr ""
 
-#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
-#: tags/trackorganiser.cpp:456
+#: devices/actiondialog.cpp:517 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:478 tags/tageditor.cpp:890
+#: tags/trackorganiser.cpp:488
 msgid "Device is busy?"
 msgstr ""
 
-#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:519 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr ""
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:586
 msgid "Clearing unused folders"
 msgstr ""
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr ""
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "ReplyGain"
 msgstr ""
 
-#: devices/actiondialog.cpp:578
+#: devices/actiondialog.cpp:602
 msgid "Calculate"
 msgstr ""
 
-#: devices/actiondialog.cpp:634
-msgid "The destination filename already exists!<hr/>%1"
+#: devices/actiondialog.cpp:661
+msgid "The destination filename already exists!"
 msgstr ""
 
-#: devices/actiondialog.cpp:637
-msgid "Song already exists!<hr/>%1"
+#: devices/actiondialog.cpp:664
+msgid "Song already exists!"
 msgstr ""
 
-#: devices/actiondialog.cpp:640
-msgid "Song does not exist!<hr/>%1"
+#: devices/actiondialog.cpp:667
+msgid "Song does not exist!"
 msgstr ""
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:670
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
-"permissions.<hr/>%1"
+"permissions."
 msgstr ""
 
-#: devices/actiondialog.cpp:646
-msgid "Source file no longer exists?<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:673
+msgid "Source file no longer exists?"
 msgstr ""
 
-#: devices/actiondialog.cpp:649
-msgid "Failed to copy.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to copy."
 msgstr ""
 
-#: devices/actiondialog.cpp:650
-msgid "Failed to delete.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to delete."
 msgstr ""
 
-#: devices/actiondialog.cpp:653
-msgid "Not connected to device.<hr/>%1"
+#: devices/actiondialog.cpp:679
+msgid "Not connected to device."
 msgstr ""
 
-#: devices/actiondialog.cpp:656
-msgid "Selected codec is not available.<hr/>%1"
+#: devices/actiondialog.cpp:682
+msgid "Selected codec is not available."
 msgstr ""
 
-#: devices/actiondialog.cpp:659
-msgid "Transcoding failed.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:685
+msgid "Transcoding failed."
 msgstr ""
 
-#: devices/actiondialog.cpp:662
+#: devices/actiondialog.cpp:688
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
-"devices.)<hr/>%1"
+"devices.)"
 msgstr ""
 
-#: devices/actiondialog.cpp:665
-msgid "Failed to read source file.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:691
+msgid "Failed to read source file."
 msgstr ""
 
-#: devices/actiondialog.cpp:668
-msgid "Failed to write to destination file.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:694
+msgid "Failed to write to destination file."
 msgstr ""
 
-#: devices/actiondialog.cpp:671
-msgid "No space left on device.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:697
+msgid "No space left on device."
 msgstr ""
 
-#: devices/actiondialog.cpp:674
-msgid "Failed to update metadata.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:700
+msgid "Failed to update metadata."
 msgstr ""
 
-#: devices/actiondialog.cpp:677
-msgid "Failed to download track.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:703
+msgid "Failed to download track."
 msgstr ""
 
-#: devices/actiondialog.cpp:680
-msgid "Failed to lock device.<hr/>%1"
+#: devices/actiondialog.cpp:706
+msgid "Failed to lock device."
 msgstr ""
 
-#: devices/actiondialog.cpp:709
+#: devices/actiondialog.cpp:735
 msgid "Local Music Library Properties"
 msgstr ""
 
-#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
-msgid "<b>Error</b><br/>"
+#: devices/actiondialog.cpp:776 devices/actiondialog.cpp:790
+#: support/messagebox.cpp:108 support/messagebox.cpp:114
+#: support/messagebox.h:62
+msgid "Error"
 msgstr ""
 
-#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:780 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Skip"
 msgstr ""
 
-#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:781 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Auto Skip"
 msgstr ""
 
-#: devices/actiondialog.cpp:759
+#: devices/actiondialog.cpp:785
 msgid "Retry"
 msgstr ""
 
-#: devices/actiondialog.cpp:774
-msgid ""
-"<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
-"td></tr>"
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#: devices/actiondialog.cpp:801 gui/searchpage.cpp:203 po/rc.cpp:374
+#: po/rc.cpp:953 rc.cpp:374 rc.cpp:953
+msgid "Album:"
 msgstr ""
 
-#: devices/actiondialog.cpp:781
-msgid ""
-"<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
-"\"right\">Destination file:</td><td>%2</td></tr>"
+#. i18n: file: tags/tageditor.ui:25
+#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
+#: devices/actiondialog.cpp:802 po/rc.cpp:938 rc.cpp:938
+msgid "Track:"
+msgstr ""
+
+#: devices/actiondialog.cpp:806
+msgid "Source file:"
+msgstr ""
+
+#: devices/actiondialog.cpp:807
+msgid "Destination file:"
 msgstr ""
 
-#: devices/actiondialog.cpp:786
-msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
+#: devices/actiondialog.cpp:809 gui/searchpage.cpp:207
+msgid "File:"
 msgstr ""
 
-#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
-#: gui/cachesettings.cpp:230
+#: devices/actiondialog.cpp:815 gui/cachesettings.cpp:179
+#: gui/cachesettings.cpp:235
 msgid "Calculating..."
 msgstr ""
 
-#: devices/actiondialog.cpp:799
+#: devices/actiondialog.cpp:822
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr ""
 
-#: devices/actiondialog.cpp:802
-msgid ""
-"<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
-"i></tr>"
+#: devices/actiondialog.cpp:824
+msgid "Time remaining:"
 msgstr ""
 
-#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: devices/actiondialog.cpp:847 devices/fsdevice.cpp:762
 #: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
+#: devices/albumdetailsdialog.cpp:139 devices/albumdetailsdialog.cpp:236
+#: tags/tageditor.cpp:158 tags/tageditor.cpp:373
 msgid "Apply \"Various Artists\" Workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
+#: devices/albumdetailsdialog.cpp:140 devices/albumdetailsdialog.cpp:260
+#: tags/tageditor.cpp:159 tags/tageditor.cpp:418
 msgid "Revert \"Various Artists\" Workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
-#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
+#: devices/albumdetailsdialog.cpp:141 devices/albumdetailsdialog.cpp:278
+#: tags/tageditor.cpp:161 tags/tageditor.cpp:499
 msgid "Capitalize"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
-#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
+#: devices/albumdetailsdialog.cpp:142 devices/albumdetailsdialog.cpp:295
+#: tags/tageditor.cpp:162 tags/tageditor.cpp:528
 msgid "Adjust Track Numbers"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
+#: devices/albumdetailsdialog.cpp:144 tags/tageditor.cpp:156
 msgid "Tools"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:369
 msgid "Apply \"Various Artists\" workaround?"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
+#: devices/albumdetailsdialog.cpp:234 tags/tageditor.cpp:371
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:411
 msgid "Revert \"Various Artists\" workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
+#: devices/albumdetailsdialog.cpp:255 tags/tageditor.cpp:413
 msgid ""
 "<i>Where the 'Album artist' is the same as 'Artist' and the 'Title' is of "
 "the format \"TrackArtist - TrackTitle\", 'Artist' will be taken from 'Title' "
@@ -560,36 +619,26 @@ msgid ""
 "will be set to \"Wobble\"</i>"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
+#: devices/albumdetailsdialog.cpp:261 tags/tageditor.cpp:419
 msgid "Revert"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
+#: devices/albumdetailsdialog.cpp:277 tags/tageditor.cpp:497
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
+#: devices/albumdetailsdialog.cpp:295 tags/tageditor.cpp:529
 msgid "Adjust track number by:"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:335 devices/cddbinterface.cpp:143
-#: devices/deviceoptions.cpp:358 devices/musicbrainz.cpp:202
-#: devices/musicbrainz.cpp:324 gui/mainwindow.cpp:1771 gui/mainwindow.cpp:1784
-#: models/musiclibraryitemroot.cpp:362 models/musiclibraryitemroot.cpp:520
-#: models/playqueuemodel.cpp:325 mpd/mpdparseutils.cpp:249
-#: mpd/mpdparseutils.cpp:409 mpd/song.cpp:228 mpd/song.cpp:233
-#: mpd/song.cpp:272 mpd/song.cpp:299 widgets/groupedview.cpp:260
-msgid "Unknown"
-msgstr ""
-
 #: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr ""
 
-#: devices/audiocddevice.cpp:353 gui/mainwindow.cpp:2199
-#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
-#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
+#: devices/audiocddevice.cpp:358 gui/mainwindow.cpp:2345
+#: gui/searchpage.cpp:220 models/albumsmodel.cpp:245 models/musicmodel.cpp:217
+#: models/playlistsmodel.cpp:309 models/playlistsmodel.cpp:324
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] ""
@@ -612,7 +661,7 @@ msgid "Failed to open CD device"
 msgstr ""
 
 #: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
-#: devices/musicbrainz.cpp:217
+#: devices/musicbrainz.cpp:216
 msgid "Track %1"
 msgstr ""
 
@@ -632,19 +681,19 @@ msgstr ""
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:170
+#. i18n: file: devices/albumdetails.ui:163
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:66
-#: models/playqueuemodel.cpp:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
-#: rc.cpp:82
+#: models/playqueuemodel.cpp:106 po/rc.cpp:113 replaygain/rgdialog.cpp:128
+#: rc.cpp:113
 msgid "Artist"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:175
+#. i18n: file: devices/albumdetails.ui:168
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:76
-#: models/playqueuemodel.cpp:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
-#: rc.cpp:85
+#: models/playqueuemodel.cpp:105 po/rc.cpp:116 replaygain/rgdialog.cpp:130
+#: rc.cpp:116
 msgid "Title"
 msgstr ""
 
@@ -714,7 +763,7 @@ msgid ""
 "from the 'Title' tag.</p>"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:99
+#: devices/devicepropertieswidget.cpp:98
 msgid ""
 "<p>If you enable this, then Cantata will create a cache of the device's "
 "music library. This will help to speed up subsequent library scans (as the "
@@ -725,19 +774,19 @@ msgid ""
 "removed, and the contents of the device re-scanned.</p>"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:204
+#: devices/devicepropertieswidget.cpp:209
 msgid "Do not transcode"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:212
+#: devices/devicepropertieswidget.cpp:216
 msgid "Encoder"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:228
+#: devices/devicepropertieswidget.cpp:231
 msgid "Transcode to %1"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:259
+#: devices/devicepropertieswidget.cpp:262
 msgctxt "name (size free)"
 msgid "%1 (%2 free)"
 msgstr ""
@@ -750,11 +799,11 @@ msgstr ""
 msgid "Sync"
 msgstr ""
 
-#: devices/devicespage.cpp:71
+#: devices/devicespage.cpp:70
 msgid "Forget Device"
 msgstr ""
 
-#: devices/devicespage.cpp:114 devices/remotedevicepropertiesdialog.cpp:60
+#: devices/devicespage.cpp:113 devices/remotedevicepropertiesdialog.cpp:60
 msgid "Add Device"
 msgstr ""
 
@@ -763,7 +812,7 @@ msgid "Lookup album and track details?"
 msgstr ""
 
 #: devices/devicespage.cpp:433 devices/devicespage.cpp:445
-#: devices/devicespage.cpp:455
+#: devices/devicespage.cpp:455 gui/mainwindow.cpp:589
 msgid "Refresh"
 msgstr ""
 
@@ -790,8 +839,8 @@ msgstr ""
 msgid "Full"
 msgstr ""
 
-#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
-#: gui/librarypage.cpp:257
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:213 gui/folderpage.cpp:269
+#: gui/librarypage.cpp:256
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -817,11 +866,11 @@ msgstr ""
 msgid "Disconnect"
 msgstr ""
 
-#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1220
 msgid "Please close other dialogs first."
 msgstr ""
 
-#: devices/encoders.cpp:77
+#: devices/encoders.cpp:78
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -832,7 +881,7 @@ msgid ""
 "a reasonable choice for the iPod and some other portable music players."
 msgstr ""
 
-#: devices/encoders.cpp:82
+#: devices/encoders.cpp:83
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>AAC</b> encoder used by Cantata supports a <a "
@@ -850,21 +899,21 @@ msgid ""
 "s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:100 devices/encoders.cpp:140
+#: devices/encoders.cpp:101 devices/encoders.cpp:141
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr ""
 
-#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
-#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:293 devices/encoders.cpp:329
 msgid "Smaller file"
 msgstr ""
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:233 devices/encoders.cpp:329
+#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
+#: devices/encoders.cpp:234 devices/encoders.cpp:330
 msgid "Better sound quality"
 msgstr ""
 
-#: devices/encoders.cpp:119
+#: devices/encoders.cpp:120
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -875,7 +924,7 @@ msgid ""
 "and is widely supported on portable music players."
 msgstr ""
 
-#: devices/encoders.cpp:123
+#: devices/encoders.cpp:124
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>MP3</b> encoder used by Cantata supports a <a "
@@ -891,11 +940,11 @@ msgid ""
 "anything above <b>205kb/s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
+#: devices/encoders.cpp:156 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr ""
 
-#: devices/encoders.cpp:158
+#: devices/encoders.cpp:159
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -906,7 +955,7 @@ msgid ""
 "excellent choice, especially for portable music players that support it."
 msgstr ""
 
-#: devices/encoders.cpp:163
+#: devices/encoders.cpp:164
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Vorbis</b> encoder used by Cantata supports a "
@@ -925,15 +974,15 @@ msgid ""
 "anything above <b>8</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:183
+#: devices/encoders.cpp:184
 msgid "Quality rating"
 msgstr ""
 
-#: devices/encoders.cpp:200
+#: devices/encoders.cpp:201
 msgid "Opus"
 msgstr ""
 
-#: devices/encoders.cpp:203
+#: devices/encoders.cpp:204
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -942,7 +991,7 @@ msgid ""
 "patent-free digital audio codec using a form of lossy data compression."
 msgstr ""
 
-#: devices/encoders.cpp:205
+#: devices/encoders.cpp:206
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Opus</b> encoder used by Cantata supports a <a "
@@ -958,15 +1007,15 @@ msgid ""
 "anything above <b>256kb/s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:222 devices/encoders.cpp:319
+#: devices/encoders.cpp:223 devices/encoders.cpp:320
 msgid "Bitrate"
 msgstr ""
 
-#: devices/encoders.cpp:241
+#: devices/encoders.cpp:242
 msgid "Apple Lossless"
 msgstr ""
 
-#: devices/encoders.cpp:244
+#: devices/encoders.cpp:245
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -977,11 +1026,11 @@ msgid ""
 "FLAC."
 msgstr ""
 
-#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:260 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr ""
 
-#: devices/encoders.cpp:262
+#: devices/encoders.cpp:263
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -992,7 +1041,7 @@ msgid ""
 "compromising on audio quality, FLAC is an excellent choice."
 msgstr ""
 
-#: devices/encoders.cpp:266
+#: devices/encoders.cpp:267
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1007,19 +1056,19 @@ msgid ""
 "file, and are not recommended."
 msgstr ""
 
-#: devices/encoders.cpp:281
+#: devices/encoders.cpp:282
 msgid "Compression level"
 msgstr ""
 
-#: devices/encoders.cpp:291
+#: devices/encoders.cpp:292
 msgid "Faster compression"
 msgstr ""
 
-#: devices/encoders.cpp:298
+#: devices/encoders.cpp:299
 msgid "Windows Media Audio"
 msgstr ""
 
-#: devices/encoders.cpp:301
+#: devices/encoders.cpp:302
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1030,7 +1079,7 @@ msgid ""
 "not support Ogg Vorbis."
 msgstr ""
 
-#: devices/encoders.cpp:305
+#: devices/encoders.cpp:306
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>Due to the limitations of the proprietary <b>WMA</b> "
@@ -1044,163 +1093,107 @@ msgid ""
 "probably overkill."
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:33
+#: devices/filenameschemedialog.cpp:34
 msgid "Filename Scheme"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:62
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:63
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:64
 msgctxt "Example composer"
 msgid "Vivaldi"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:65
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:56
+#: devices/filenameschemedialog.cpp:66
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:57
+#: devices/filenameschemedialog.cpp:67
 msgctxt "Example genre"
 msgid "Dance"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:101
+#: devices/filenameschemedialog.cpp:121
 msgid ""
 "<p>The following variables will be replaced with their corresponding meaning "
 "for each track name.</p>"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:103
+#: devices/filenameschemedialog.cpp:123
 msgid ""
-"<tr><th><em>Button</em></th><th><em>Variable</em></th><th><em>Description</"
+"<tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</"
 "em></th></tr>"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:104
-msgid ""
-"<tr><td>%albumartist%</td><td>%1</td><td>The artist of the album. For most "
-"albums, this will be the same as the <i>Track Artist.</i> For compilations, "
-"this will often be <i>Various Artists.</i> </td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:106
-msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:107
-msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:108
-msgid "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:109
-msgid ""
-"<tr><td>%title%</td><td>%1</td><td>The track title (without <i>Track Artist</"
-"i>).</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:110
-msgid ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>The track title (with <i>Track "
-"Artist</i>, if different to <i>Album Artist</i>).</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:111
-msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:112
-msgid ""
-"<tr><td>%discnumber%</td><td>%1</td><td>The album number of a multi-album "
-"album. Often compilations consist of several albums.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:113
-msgid ""
-"<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:114
-msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
-msgstr ""
-
-#: devices/fsdevice.cpp:668
+#: devices/fsdevice.cpp:675 gui/albumspage.cpp:287 gui/folderpage.cpp:304
+#: gui/librarypage.cpp:414
 msgid "Updating..."
 msgstr ""
 
-#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: devices/fsdevice.cpp:757 online/onlineservice.cpp:94
 #: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr ""
 
-#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
+#: devices/fsdevice.cpp:769 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr ""
 
-#: devices/mtpdevice.cpp:137
+#: devices/mtpdevice.cpp:153
 msgid "Connecting to device..."
 msgstr ""
 
-#: devices/mtpdevice.cpp:139 devices/mtpdevice.cpp:161
+#: devices/mtpdevice.cpp:155 devices/mtpdevice.cpp:202
 msgid "No devices found"
 msgstr ""
 
-#: devices/mtpdevice.cpp:173
+#: devices/mtpdevice.cpp:217
 msgid "Connected to device"
 msgstr ""
 
-#: devices/mtpdevice.cpp:183
+#: devices/mtpdevice.cpp:230
 msgid "Disconnected from device"
 msgstr ""
 
-#: devices/mtpdevice.cpp:250
+#: devices/mtpdevice.cpp:304
 msgid "Updating folders..."
 msgstr ""
 
-#: devices/mtpdevice.cpp:257
+#: devices/mtpdevice.cpp:320
 msgid "Updating files..."
 msgstr ""
 
-#: devices/mtpdevice.cpp:262 devices/remotefsdevice.cpp:465
-#: devices/remotefsdevice.cpp:485
+#: devices/mtpdevice.cpp:334 devices/remotefsdevice.cpp:461
+#: devices/remotefsdevice.cpp:481
 msgid "Updating tracks..."
 msgstr ""
 
-#: devices/mtpdevice.cpp:281 devices/mtpdevice.cpp:383
-#: models/musiclibraryitemroot.cpp:78 models/musiclibraryitemroot.cpp:117
-#: models/musiclibraryitemroot.cpp:171 models/musiclibraryitemroot.cpp:833
-#: models/musiclibraryitemroot.cpp:1012 mpd/song.cpp:371
-msgid "Various Artists"
-msgstr ""
-
-#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
-#: models/devicesmodel.cpp:140
+#: devices/mtpdevice.cpp:1619 devices/remotefsdevice.cpp:564
+#: devices/umsdevice.cpp:100 gui/initialsettingswizard.cpp:57
+#: models/devicesmodel.cpp:157
 msgid "Not Connected"
 msgstr ""
 
-#: devices/musicbrainz.cpp:320
+#: devices/musicbrainz.cpp:319
 msgid "%1 (Disc %2)"
 msgstr ""
 
-#: devices/musicbrainz.cpp:408
+#: devices/musicbrainz.cpp:407
 msgid "No matches found in MusicBrainz"
 msgstr ""
 
@@ -1208,7 +1201,7 @@ msgstr ""
 msgid "Connection"
 msgstr ""
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:261
 msgid "Music Library"
 msgstr ""
 
@@ -1234,79 +1227,79 @@ msgstr ""
 msgid "Locally Mounted Folder"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:612
+#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:608
 msgid "Available"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:610
+#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:606
 msgid "Not Available"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:315
+#: devices/remotefsdevice.cpp:313
 msgid "Failed to resolve connection details for %1"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:330 devices/remotefsdevice.cpp:345
-#: devices/remotefsdevice.cpp:403
+#: devices/remotefsdevice.cpp:328 devices/remotefsdevice.cpp:343
+#: devices/remotefsdevice.cpp:399
 msgid "Connecting..."
 msgstr ""
 
-#: devices/remotefsdevice.cpp:358
+#: devices/remotefsdevice.cpp:356
 msgid ""
 "Password prompting does not work when cantata is started from the "
 "commandline."
 msgstr ""
 
-#: devices/remotefsdevice.cpp:379
+#: devices/remotefsdevice.cpp:375
 msgid ""
 "No suitable ssh-askpass application installed! This is required for entering "
 "passwords."
 msgstr ""
 
-#: devices/remotefsdevice.cpp:386
+#: devices/remotefsdevice.cpp:382
 msgid "Mount point (\"%1\") is not empty!"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:398
+#: devices/remotefsdevice.cpp:394
 msgid "\"sshfs\" is not installed!"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:426 devices/remotefsdevice.cpp:446
+#: devices/remotefsdevice.cpp:422 devices/remotefsdevice.cpp:442
 msgid "Disconnecting..."
 msgstr ""
 
-#: devices/remotefsdevice.cpp:440
+#: devices/remotefsdevice.cpp:436
 msgid "\"fusermount\" is not installed!"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:461 devices/remotefsdevice.cpp:482
+#: devices/remotefsdevice.cpp:457 devices/remotefsdevice.cpp:478
 msgid "Failed to connect to \"%1\""
 msgstr ""
 
-#: devices/remotefsdevice.cpp:462 devices/remotefsdevice.cpp:497
+#: devices/remotefsdevice.cpp:458 devices/remotefsdevice.cpp:493
 msgid "Failed to disconnect from \"%1\""
 msgstr ""
 
-#: devices/remotefsdevice.cpp:573
+#: devices/remotefsdevice.cpp:569
 msgid "Capacity Unknown"
 msgstr ""
 
-#. i18n: file: gui/coverdialog.ui:30
+#. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (text), widget (QPushButton, search)
-#: devices/synccollectionwidget.cpp:53 gui/stdactions.cpp:92
-#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
+#: devices/synccollectionwidget.cpp:54 gui/mainwindow.cpp:323
+#: online/podcastsearchdialog.cpp:334 po/rc.cpp:404 rc.cpp:404
 msgid "Search"
 msgstr ""
 
-#: devices/synccollectionwidget.cpp:62
+#: devices/synccollectionwidget.cpp:63
 msgid "Check Items"
 msgstr ""
 
-#: devices/synccollectionwidget.cpp:64
+#: devices/synccollectionwidget.cpp:65
 msgid "Uncheck Items"
 msgstr ""
 
-#: devices/synccollectionwidget.cpp:266
+#: devices/synccollectionwidget.cpp:272
 msgid "Nothing selected"
 msgstr ""
 
@@ -1330,7 +1323,7 @@ msgstr ""
 msgid "Device and library are in sync."
 msgstr ""
 
-#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:190
+#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:188
 msgid "Not Scanned"
 msgstr ""
 
@@ -1338,91 +1331,91 @@ msgstr ""
 msgid " (recommended)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:208
+#: dynamic/dynamic.cpp:215
 msgid "Start Dynamic Playlist"
 msgstr ""
 
-#: dynamic/dynamic.cpp:209
+#: dynamic/dynamic.cpp:216
 msgid "Stop Dynamic Mode"
 msgstr ""
 
-#: dynamic/dynamic.cpp:257
+#: dynamic/dynamic.cpp:264
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] ""
 msgstr[1] ""
 
-#: dynamic/dynamic.cpp:396
+#: dynamic/dynamic.cpp:403
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr ""
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:410
 msgid "Failed to locate rules file - %1"
 msgstr ""
 
-#: dynamic/dynamic.cpp:411
+#: dynamic/dynamic.cpp:418
 msgid "Failed to remove previous rules file - %1"
 msgstr ""
 
-#: dynamic/dynamic.cpp:416
+#: dynamic/dynamic.cpp:423
 msgid "Failed to install rules file - %1 -> %2"
 msgstr ""
 
-#: dynamic/dynamic.cpp:729
+#: dynamic/dynamic.cpp:736
 msgid "Dynamizer has been terminated."
 msgstr ""
 
-#: dynamic/dynamic.cpp:816
+#: dynamic/dynamic.cpp:823 mpd/mpdconnection.cpp:150
 msgid "Uknown"
 msgstr ""
 
-#: dynamic/dynamic.cpp:818
+#: dynamic/dynamic.cpp:825
 msgid "Loading list of rules"
 msgstr ""
 
-#: dynamic/dynamic.cpp:819
+#: dynamic/dynamic.cpp:826
 msgid "Saving rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:820
+#: dynamic/dynamic.cpp:827
 msgid "Deleting rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:821
+#: dynamic/dynamic.cpp:828
 msgid "Setting active rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:822
+#: dynamic/dynamic.cpp:829
 msgid "Stopping dynamizer"
 msgstr ""
 
-#: dynamic/dynamic.cpp:823
+#: dynamic/dynamic.cpp:830
 msgid "Requesting ID details"
 msgstr ""
 
-#: dynamic/dynamic.cpp:826
+#: dynamic/dynamic.cpp:833
 msgid "Awaiting response for previous command. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:981
+#: dynamic/dynamic.cpp:988
 msgid "Dynamizer is not active"
 msgstr ""
 
-#: dynamic/dynamic.cpp:989
+#: dynamic/dynamic.cpp:996
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:1020
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to delete rules file. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:1027
+#: dynamic/dynamic.cpp:1034
 msgid "Failed to control dynamizer state. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:1036
+#: dynamic/dynamic.cpp:1043
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr ""
 
@@ -1438,11 +1431,11 @@ msgstr ""
 msgid "Edit Dynamic Rules"
 msgstr ""
 
-#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:151
+#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:150
 msgid "Remove Dynamic Rules"
 msgstr ""
 
-#: dynamic/dynamicpage.cpp:150
+#: dynamic/dynamicpage.cpp:149
 msgid ""
 "Are you sure you wish to remove the selected rules?\n"
 "This cannot be undone."
@@ -1454,15 +1447,15 @@ msgstr ""
 
 #. i18n: file: dynamic/dynamicrules.ui:53
 #. i18n: ectx: property (text), widget (QPushButton, addBtn)
-#: dynamic/dynamicruledialog.cpp:136 po/rc.cpp:280 rc.cpp:280
+#: dynamic/dynamicruledialog.cpp:145 po/rc.cpp:341 rc.cpp:341
 msgid "Add"
 msgstr ""
 
-#: dynamic/dynamicruledialog.cpp:202
+#: dynamic/dynamicruledialog.cpp:211
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr ""
 
-#: dynamic/dynamicruledialog.cpp:205
+#: dynamic/dynamicruledialog.cpp:214
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1476,27 +1469,27 @@ msgstr ""
 msgid "AlbumArtist"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: file: devices/filenameschemedialog.ui:102
 #. i18n: ectx: property (text), widget (QPushButton, composer)
-#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:212 rc.cpp:212
 msgid "Composer"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:48
+#: models/playqueuemodel.cpp:107 replaygain/rgdialog.cpp:129
 msgid "Album"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:106
-#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:112
+#: po/rc.cpp:254 po/rc.cpp:380 rc.cpp:254 rc.cpp:380
 msgid "Genre"
 msgstr ""
 
@@ -1554,82 +1547,81 @@ msgstr ""
 msgid "Saving %1"
 msgstr ""
 
-#: gui/cachesettings.cpp:168
+#: gui/cachesettings.cpp:173
 msgid "Deleting..."
 msgstr ""
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Name"
 msgstr ""
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Item Count"
 msgstr ""
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Space Used"
 msgstr ""
 
-#: gui/cachesettings.cpp:234
+#: gui/cachesettings.cpp:239
 msgid "Total space used: %1"
 msgstr ""
 
-#: gui/cachesettings.cpp:245
+#: gui/cachesettings.cpp:250
 msgid ""
-"To speed up loading of the music library, Cantata caches a local copy of the "
-"MPD listing. Cantata might also have cached covers, or lyrics, if these have "
-"been downloaded and could not be saved into the MPD folder (because Cantata "
-"cannot access it, or you have configured Cantata to not save these items "
-"there). Below is a summary of Cantata's cache usage."
+"Cantata caches a local copy of the MPD listing to speed up loading of the "
+"music library. Cantata might also have cached covers, lyrics, or artist "
+"images, if these have been downloaded and could not be saved into the MPD "
+"folder (because Cantata cannot access it, or you have configured Cantata to "
+"not save these items there). Below is a summary of Cantata's current cache "
+"usage."
 msgstr ""
 
-#: gui/cachesettings.cpp:257
+#: gui/cachesettings.cpp:263
 msgid "Covers"
 msgstr ""
 
-#: gui/cachesettings.cpp:258
+#: gui/cachesettings.cpp:264
+msgid "Scaled Covers"
+msgstr ""
+
+#: gui/cachesettings.cpp:265
 msgid "Backdrops"
 msgstr ""
 
-#: gui/cachesettings.cpp:263 gui/interfacesettings.cpp:167
-#: gui/mainwindow.cpp:283 gui/preferencesdialog.cpp:85
-#: widgets/groupedview.cpp:256
-msgid "Streams"
+#: gui/cachesettings.cpp:271
+msgid "Stream Listings"
 msgstr ""
 
-#: gui/cachesettings.cpp:264
+#: gui/cachesettings.cpp:274
 msgid "Jamendo"
 msgstr ""
 
-#: gui/cachesettings.cpp:265
+#: gui/cachesettings.cpp:275
 msgid "Magnatune"
 msgstr ""
 
-#: gui/cachesettings.cpp:266
+#: gui/cachesettings.cpp:276
 msgid "Podcast Directories"
 msgstr ""
 
-#: gui/cachesettings.cpp:273
+#: gui/cachesettings.cpp:285
 msgid "Delete All"
 msgstr ""
 
-#: gui/cachesettings.cpp:312
+#: gui/cachesettings.cpp:324
 msgid "Delete all '%1' items?"
 msgstr ""
 
-#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
+#: gui/cachesettings.cpp:325 gui/cachesettings.cpp:335
 msgid "Delete Cache Items"
 msgstr ""
 
-#: gui/cachesettings.cpp:322
+#: gui/cachesettings.cpp:334
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr ""
 
-#: gui/coverdialog.cpp:151 gui/main.cpp:231
-msgid "Last.fm"
-msgstr ""
-
-#: gui/coverdialog.cpp:165
+#: gui/coverdialog.cpp:124
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1638,91 +1630,80 @@ msgid ""
 "%2 x %3 (%4)"
 msgstr ""
 
-#: gui/coverdialog.cpp:184
+#: gui/coverdialog.cpp:126
 msgctxt ""
-"Google\n"
-"width x height (file size)"
+"name\n"
+"width x height"
 msgid ""
-"Google\n"
-"%1 x %2 (%3)"
+"%1\n"
+"%2 x %3"
 msgstr ""
 
-#: gui/coverdialog.cpp:204
-msgctxt ""
-"Discogs\n"
-"width x height"
-msgid ""
-"Discogs\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:162
+msgid "Current Cover"
 msgstr ""
 
-#: gui/coverdialog.cpp:238
-msgctxt ""
-"Current Cover\n"
-"width x height"
-msgid ""
-"Current Cover\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:211 gui/coverdialog.cpp:411
+msgid "CoverArt Archive"
 msgstr ""
 
-#: gui/coverdialog.cpp:256
+#: gui/coverdialog.cpp:242
 msgid "Image"
 msgstr ""
 
-#: gui/coverdialog.cpp:259
+#: gui/coverdialog.cpp:245
 msgid "Downloading..."
 msgstr ""
 
-#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
+#: gui/coverdialog.cpp:290 gui/coverdialog.cpp:325
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr ""
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:446
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
 msgstr ""
 
-#: gui/coverdialog.cpp:433
+#: gui/coverdialog.cpp:447
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
 msgstr ""
 
-#: gui/coverdialog.cpp:440 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:234
-msgctxt "Album by Artist"
-msgid "%1 by %2"
+#: gui/coverdialog.cpp:452
+msgid "'%1' Artist Image"
+msgstr ""
+
+#: gui/coverdialog.cpp:454
+msgctxt "'Artist - Album' Album Cover"
+msgid "'%1 - %2' Album Cover"
 msgstr ""
 
-#: gui/coverdialog.cpp:579
+#: gui/coverdialog.cpp:582
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
 msgstr ""
 
-#: gui/coverdialog.cpp:607
+#: gui/coverdialog.cpp:616
 msgid "Failed to download image!"
 msgstr ""
 
-#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
+#: gui/coverdialog.cpp:875 gui/coverdialog.cpp:877
 msgid "Load Local Cover"
 msgstr ""
 
-#: gui/coverdialog.cpp:795
-msgid "Images (*.png *.jpg)"
-msgstr ""
-
-#: gui/coverdialog.cpp:800
+#: gui/coverdialog.cpp:882
 msgid "File is already in list!"
 msgstr ""
 
-#: gui/coverdialog.cpp:804
+#: gui/coverdialog.cpp:886
 msgid "Failed to read image!"
 msgstr ""
 
-#: gui/coverdialog.cpp:817
+#: gui/coverdialog.cpp:899
 msgid "Display"
 msgstr ""
 
@@ -1734,575 +1715,677 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QPushButton, removeBtn)
 #. i18n: file: streams/streamssettings.ui:73
 #. i18n: ectx: property (text), widget (QPushButton, removeButton)
-#: gui/coverdialog.cpp:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
-#: rc.cpp:286 rc.cpp:765
+#: gui/coverdialog.cpp:900 gui/stdactions.cpp:90 po/rc.cpp:347 po/rc.cpp:917
+#: rc.cpp:347 rc.cpp:917
 msgid "Remove"
 msgstr ""
 
-#: gui/coverdialog.cpp:1181
+#: gui/coverdialog.cpp:1333
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
 msgstr ""
 
-#: gui/coverdialog.cpp:1190
+#: gui/coverdialog.cpp:1342
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
 msgstr ""
 
-#: gui/coverdialog.cpp:1239
+#: gui/coverdialog.cpp:1391
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
 msgstr ""
 
-#: gui/folderpage.cpp:45
+#: gui/coverdialog.cpp:1449 models/onlineservicesmodel.cpp:157
+msgid "Searching..."
+msgstr ""
+
+#: gui/folderpage.cpp:44
 msgid "Open In File Manager"
 msgstr ""
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Established"
 msgstr ""
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Failed"
 msgstr ""
 
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
+#. i18n: file: support/shortcutssettingswidget.ui:78
+#. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
 #. i18n: file: support/shortcutssettingswidget.ui:78
 #. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
-#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
-#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
+#: gui/interfacesettings.cpp:48 gui/playbacksettings.cpp:46
+#: online/magnatuneservice.cpp:159 po/rc.cpp:6 po/rc.cpp:660 po/rc.cpp:751
+#: po/rc.cpp:778 po/rc.cpp:932 rc.cpp:6 rc.cpp:660 rc.cpp:751 rc.cpp:778
+#: rc.cpp:932
 msgid "None"
 msgstr ""
 
-#: gui/interfacesettings.cpp:40
+#: gui/interfacesettings.cpp:49 gui/interfacesettings.cpp:160
 msgid "Small"
 msgstr ""
 
-#: gui/interfacesettings.cpp:41
+#: gui/interfacesettings.cpp:50
 msgid "Medium"
 msgstr ""
 
-#: gui/interfacesettings.cpp:42
+#: gui/interfacesettings.cpp:51 gui/interfacesettings.cpp:159
 msgid "Large"
 msgstr ""
 
-#: gui/interfacesettings.cpp:43
+#: gui/interfacesettings.cpp:52
 msgid "Extra Large"
 msgstr ""
 
-#: gui/interfacesettings.cpp:48
+#: gui/interfacesettings.cpp:57
+msgid "Basic Tree (No Icons)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:58
 msgid "Simple Tree"
 msgstr ""
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:59
 msgid "Detailed Tree"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:329
+#. i18n: file: gui/interfacesettings.ui:449
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
+#: gui/interfacesettings.cpp:61 po/rc.cpp:639 rc.cpp:639
 msgid "Grouped Albums"
 msgstr ""
 
-#: gui/interfacesettings.cpp:53
+#: gui/interfacesettings.cpp:63
 msgid "List"
 msgstr ""
 
-#: gui/interfacesettings.cpp:55
+#: gui/interfacesettings.cpp:65
 msgid "Icon/List"
 msgstr ""
 
-#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+#. i18n: file: gui/interfacesettings.ui:454
+#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
+#: gui/interfacesettings.cpp:68 po/rc.cpp:642 rc.cpp:642
+msgid "Table"
+msgstr ""
+
+#: gui/interfacesettings.cpp:104
+msgid "Play queue"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:182
+#. i18n: ectx: attribute (title), widget (QWidget, tab)
+#: gui/interfacesettings.cpp:105 gui/mainwindow.cpp:307 po/rc.cpp:569
+#: rc.cpp:569
+msgid "Artists"
+msgstr ""
+
+#: gui/interfacesettings.cpp:107 gui/interfacesettings.cpp:138
+#: gui/mainwindow.cpp:309
 msgid "Folders"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:337
+#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
+#: gui/interfacesettings.cpp:108 gui/mainwindow.cpp:310 po/rc.cpp:609
+#: rc.cpp:609
+msgid "Playlists"
+msgstr ""
+
+#: gui/interfacesettings.cpp:110
+msgid "Dynamic Playlists"
+msgstr ""
+
+#: gui/interfacesettings.cpp:114
+msgid "Streams (e.g. Radio Stations)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:121
+msgid "Online Services - Jamendo, Maganatune, SoundCloud, and Podcasts"
+msgstr ""
+
+#: gui/interfacesettings.cpp:128
+msgid "Devices - UMS, MTP (e.g. Android), and AudioCDs"
+msgstr ""
+
+#: gui/interfacesettings.cpp:134
+msgid "Search (via MPD)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:135
+msgid "Info - Current song information (artist, album, and lyrics)"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#: gui/interfacesettings.cpp:165 gui/interfacesettings.cpp:168
-#: gui/interfacesettings.cpp:171 gui/interfacesettings.cpp:174 po/rc.cpp:472
-#: po/rc.cpp:491 po/rc.cpp:512 po/rc.cpp:536 rc.cpp:472 rc.cpp:491 rc.cpp:512
-#: rc.cpp:536
+#: gui/interfacesettings.cpp:139 po/rc.cpp:554 po/rc.cpp:572 po/rc.cpp:591
+#: po/rc.cpp:612 po/rc.cpp:636 rc.cpp:554 rc.cpp:572 rc.cpp:591 rc.cpp:612
+#: rc.cpp:636
 msgid "Style:"
 msgstr ""
 
-#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
-#: gui/preferencesdialog.cpp:89
-msgid "Online"
+#: gui/interfacesettings.cpp:161
+msgid "Tab-bar"
 msgstr ""
 
-#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
-msgid "Devices"
+#: gui/interfacesettings.cpp:162
+msgid "Left"
+msgstr ""
+
+#: gui/interfacesettings.cpp:162
+msgid "Right"
+msgstr ""
+
+#: gui/interfacesettings.cpp:163
+msgid "Top"
 msgstr ""
 
-#: gui/interfacesettings.cpp:178
-msgid "Grouped by 'Album Artist'"
+#: gui/interfacesettings.cpp:164
+msgid "Bottom"
 msgstr ""
 
-#: gui/interfacesettings.cpp:179
-msgid "Grouped under 'Various Artists'"
+#: gui/interfacesettings.cpp:391
+msgid "System default"
 msgstr ""
 
-#: gui/main.cpp:213 gui/mainwindow.cpp:1941 gui/trayitem.cpp:98
-#: gui/trayitem.cpp:100 gui/trayitem.cpp:135 gui/trayitem.cpp:199
-#: gui/trayitem.cpp:209 gui/trayitem.cpp:212 gui/trayitem.cpp:215
-#: gui/trayitem.cpp:228 gui/trayitem.cpp:230
+#: gui/main.cpp:224 gui/mainwindow.cpp:2075 gui/trayitem.cpp:112
+#: gui/trayitem.cpp:118 gui/trayitem.cpp:153 gui/trayitem.cpp:217
+#: gui/trayitem.cpp:227 gui/trayitem.cpp:230 gui/trayitem.cpp:233
+#: gui/trayitem.cpp:246 gui/trayitem.cpp:248
 msgid "Cantata"
 msgstr ""
 
-#: gui/main.cpp:214
+#: gui/main.cpp:225
 msgid "A KDE client for MPD"
 msgstr ""
 
-#: gui/main.cpp:216
-msgid "Copyright (c) 2011–2013 Craig Drummond"
+#: gui/main.cpp:227
+msgid "© 2011-2014 Craig Drummond"
 msgstr ""
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Craig Drummond"
 msgstr ""
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Maintainer"
 msgstr ""
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "Piotr Wicijowski"
 msgstr ""
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "UI Improvements"
 msgstr ""
 
-#: gui/main.cpp:222
+#: gui/main.cpp:233
 msgid "Sander Knopper"
 msgstr ""
 
-#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
+#: gui/main.cpp:233 gui/main.cpp:234 gui/main.cpp:235 gui/main.cpp:236
 msgid "QtMPC author"
 msgstr ""
 
-#: gui/main.cpp:223
+#: gui/main.cpp:234
 msgid "Roeland Douma"
 msgstr ""
 
-#: gui/main.cpp:224
+#: gui/main.cpp:235
 msgid "Daniel Selinger"
 msgstr ""
 
-#: gui/main.cpp:225
+#: gui/main.cpp:236
 msgid "Armin Walland"
 msgstr ""
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid "FanArt.tv"
 msgstr ""
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr ""
 
-#: gui/main.cpp:230
+#: gui/main.cpp:238
 msgid "Wikipedia"
 msgstr ""
 
-#: gui/main.cpp:230 gui/main.cpp:231
+#: gui/main.cpp:238 gui/main.cpp:239
 msgid "Context view metadata"
 msgstr ""
 
-#: gui/main.cpp:235
+#: gui/main.cpp:239
+msgid "Last.fm"
+msgstr ""
+
+#: gui/main.cpp:243
 msgid "URL to open"
 msgstr ""
 
-#: gui/mainwindow.cpp:238
+#: gui/mainwindow.cpp:269
 msgid "Quit"
 msgstr ""
 
-#: gui/mainwindow.cpp:242
+#: gui/mainwindow.cpp:273
 msgid "Show Window"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:469
 #. i18n: ectx: property (text), widget (QPushButton, connectButton)
-#: gui/mainwindow.cpp:245 po/rc.cpp:418 rc.cpp:418
+#: gui/mainwindow.cpp:276 po/rc.cpp:482 rc.cpp:482
 msgid "Connect"
 msgstr ""
 
-#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
+#: gui/mainwindow.cpp:277 gui/preferencesdialog.cpp:83
 msgid "Collection"
 msgstr ""
 
-#: gui/mainwindow.cpp:247
+#: gui/mainwindow.cpp:278
 msgid "Outputs"
 msgstr ""
 
-#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
+#: gui/mainwindow.cpp:279 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr ""
 
-#: gui/mainwindow.cpp:249
+#: gui/mainwindow.cpp:280
 msgid "Add To Stored Playlist"
 msgstr ""
 
-#: gui/mainwindow.cpp:250
+#: gui/mainwindow.cpp:281
 msgid "Remove From Play Queue"
 msgstr ""
 
-#: gui/mainwindow.cpp:251
+#: gui/mainwindow.cpp:282
 msgid "Copy Track Info"
 msgstr ""
 
-#: gui/mainwindow.cpp:252
+#: gui/mainwindow.cpp:283
 msgid "Crop"
 msgstr ""
 
-#: gui/mainwindow.cpp:253
+#: gui/mainwindow.cpp:284
 msgid "Shuffle Tracks"
 msgstr ""
 
-#: gui/mainwindow.cpp:254
+#: gui/mainwindow.cpp:285
 msgid "Shuffle Albums"
 msgstr ""
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:286
 msgid "Add Stream URL"
 msgstr ""
 
-#: gui/mainwindow.cpp:256
+#: gui/mainwindow.cpp:287
 msgid "Clear"
 msgstr ""
 
-#: gui/mainwindow.cpp:257
+#: gui/mainwindow.cpp:288
 msgid "Expanded Interface"
 msgstr ""
 
-#: gui/mainwindow.cpp:258
+#: gui/mainwindow.cpp:289
 msgid "Show Current Song Information"
 msgstr ""
 
-#: gui/mainwindow.cpp:261
+#: gui/mainwindow.cpp:292
 msgid "Full Screen"
 msgstr ""
 
-#: gui/mainwindow.cpp:263
+#: gui/mainwindow.cpp:294
 msgid "Random"
 msgstr ""
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:295
 msgid "Repeat"
 msgstr ""
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid "Single"
 msgstr ""
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
 msgstr ""
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid "Consume"
 msgstr ""
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
 msgstr ""
 
-#: gui/mainwindow.cpp:267
-msgid "Search Play Queue"
-msgstr ""
-
-#: gui/mainwindow.cpp:269
+#: gui/mainwindow.cpp:298
 msgid "Set Priority"
 msgstr ""
 
-#: gui/mainwindow.cpp:271
+#: gui/mainwindow.cpp:300
 msgid "Play Stream"
 msgstr ""
 
-#: gui/mainwindow.cpp:273
+#: gui/mainwindow.cpp:302
 msgid "Locate In Library"
 msgstr ""
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:304
 msgid "Edit Song Tags"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:304
+#. i18n: file: gui/interfacesettings.ui:429
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
+#: gui/mainwindow.cpp:306 po/rc.cpp:633 rc.cpp:633
 msgid "Play Queue"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:27
-#. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
-msgid "Artists"
+#: gui/mainwindow.cpp:312
+msgid "Dynamic"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:202
-#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
-#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
-msgid "Playlists"
+#: gui/mainwindow.cpp:315 gui/preferencesdialog.cpp:89
+#: widgets/groupedview.cpp:251
+msgid "Streams"
 msgstr ""
 
-#: gui/mainwindow.cpp:282
-msgid "Dynamic"
+#: gui/mainwindow.cpp:318 gui/preferencesdialog.cpp:94
+msgid "Online"
 msgstr ""
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:321
+msgid "Devices"
+msgstr ""
+
+#: gui/mainwindow.cpp:324
 msgid "Expand All"
 msgstr ""
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:325
 msgid "Collapse All"
 msgstr ""
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:326
 msgid "Remove All Songs"
 msgstr ""
 
-#: gui/mainwindow.cpp:398
+#: gui/mainwindow.cpp:456
 msgid "Info"
 msgstr ""
 
-#: gui/mainwindow.cpp:405
-msgid "Auto Hide"
-msgstr ""
-
-#: gui/mainwindow.cpp:411
-msgid "Monochrome Icons"
+#: gui/mainwindow.cpp:585
+msgid "Server information..."
 msgstr ""
 
-#: gui/mainwindow.cpp:541
-msgid "Server information..."
+#: gui/mainwindow.cpp:588
+msgid "Refresh Database"
 msgstr ""
 
-#: gui/mainwindow.cpp:552
+#: gui/mainwindow.cpp:602
 msgid "Configure Cantata..."
 msgstr ""
 
-#: gui/mainwindow.cpp:559
+#: gui/mainwindow.cpp:612
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr ""
 
-#: gui/mainwindow.cpp:571
+#: gui/mainwindow.cpp:624
 msgid "&File"
 msgstr ""
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:628
+msgid "&Edit"
+msgstr ""
+
+#: gui/mainwindow.cpp:631
 msgid "&Settings"
 msgstr ""
 
-#: gui/mainwindow.cpp:589 support/dialog.cpp:97
+#: gui/mainwindow.cpp:646 support/dialog.cpp:81
 msgid "&Help"
 msgstr ""
 
-#: gui/mainwindow.cpp:948
+#: gui/mainwindow.cpp:1035
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
 
-#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
+#: gui/mainwindow.cpp:1157 mpd/mpdconnection.cpp:401
 msgid "Connecting to %1"
 msgstr ""
 
-#: gui/mainwindow.cpp:1151
+#: gui/mainwindow.cpp:1189
+msgid "Refresh MPD Database?"
+msgstr ""
+
+#: gui/mainwindow.cpp:1257
 msgid ""
 "Podcasts are currently being downloaded\n"
 "\n"
 "Quiting now will abort all downloads."
 msgstr ""
 
-#: gui/mainwindow.cpp:1152
+#: gui/mainwindow.cpp:1258
 msgid "Abort downloads and quit"
 msgstr ""
 
-#: gui/mainwindow.cpp:1447
+#: gui/mainwindow.cpp:1577
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1448
+#: gui/mainwindow.cpp:1578
 msgctxt "Qt-only"
 msgid ""
-"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html"
-"\">GPLv3</a>"
+"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl."
+"html\">GPLv3</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1450
+#: gui/mainwindow.cpp:1580
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
-"QtMPC Authors<br/>"
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"The QtMPC Authors<br/>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1451
+#: gui/mainwindow.cpp:1581
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1452
+#: gui/mainwindow.cpp:1582
 msgctxt "Qt-only"
 msgid ""
 "Context view metadata courtesy of <a href=\"http://www.wikipedia.org"
 "\">Wikipedia</a> and <a href=\"http://www.last.fm\">Last.fm</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1453
+#: gui/mainwindow.cpp:1583
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1594
 msgid ""
-"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Uptime:</td><td>%4</td></"
-"tr><tr><td align=\"right\">Time playing:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right"
+"\">Protocol version: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Uptime: </td><td>%4</td></tr><tr><td align=\"right"
+"\">Time playing: </td><td>%5</td></tr>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1472
+#: gui/mainwindow.cpp:1602
 msgid ""
 "<tr><td colspan=\"2\"><b>Database</b></td></tr><tr><td align=\"right"
-"\">Artists:</td><td>%1</td></tr><tr><td align=\"right\">Albums:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Songs:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL handlers:</td><td>%4</td></tr><tr><td align=\"right\">Total "
-"duration:</td><td>%5</td></tr><tr><td align=\"right\">Last update:</td><td>"
-"%6</td></tr></table></p>"
+"\">Artists: </td><td>%1</td></tr><tr><td align=\"right\">Albums: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Songs: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Total duration: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Last update: </td><td>%6</td></tr></"
+"table></p>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1481
+#: gui/mainwindow.cpp:1611
 msgid "Server Information"
 msgstr ""
 
-#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
+#: gui/mainwindow.cpp:1859 gui/mainwindow.cpp:1866
 msgid "Cantata (%1)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
+#: gui/mainwindow.cpp:1862 gui/mainwindow.cpp:1869
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
+#: gui/mainwindow.cpp:1863 gui/mainwindow.cpp:1870
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1728
+#: gui/mainwindow.cpp:1874
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1730
+#: gui/mainwindow.cpp:1876
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1773
+#: gui/mainwindow.cpp:1919
 msgid "(Stream)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1775
+#: gui/mainwindow.cpp:1921
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr ""
 
-#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
+#: gui/mainwindow.cpp:1939 widgets/groupedview.cpp:278
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr ""
 
-#: gui/mainwindow.cpp:1843
+#: gui/mainwindow.cpp:1989 mpd/mpdconnection.cpp:543 mpd/mpdconnection.cpp:550
 msgid "MPD reported the following error: %1"
 msgstr ""
 
-#: gui/mainwindow.cpp:1990
+#: gui/mainwindow.cpp:2119
 msgid "Remove all songs from play queue?"
 msgstr ""
 
-#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
+#: gui/mainwindow.cpp:2210 models/playqueuemodel.cpp:113
 msgid "Priority"
 msgstr ""
 
-#: gui/mainwindow.cpp:2080
+#: gui/mainwindow.cpp:2210
 msgid "Enter priority (0..255):"
 msgstr ""
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Playlist Name"
 msgstr ""
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Enter a name for the playlist:"
 msgstr ""
 
-#: gui/mainwindow.cpp:2106
+#: gui/mainwindow.cpp:2236
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr ""
 
-#: gui/mainwindow.cpp:2107
+#: gui/mainwindow.cpp:2237
 msgid "Existing Playlist"
 msgstr ""
 
-#: gui/playbacksettings.cpp:42
-msgid "Do not fadeout"
+#: gui/mainwindow.cpp:2303
+msgid "Stream URL"
 msgstr ""
 
-#: gui/playbacksettings.cpp:43
-msgid " ms"
+#: gui/mainwindow.cpp:2303
+msgid "Enter URL of stream:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:165
+#: gui/mainwindow.cpp:2306
+msgid "Invalid, or unsupported, URL!"
+msgstr ""
+
+#: gui/mainwindow.cpp:2889
+msgid "Can only edit tags of songs within MPD's music collection."
+msgstr ""
+
+#. i18n: file: devices/albumdetails.ui:158
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
-#: gui/playbacksettings.cpp:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
-#: rc.cpp:79
+#: gui/playbacksettings.cpp:47 models/playqueuemodel.cpp:108 po/rc.cpp:110
+#: rc.cpp:110
 msgid "Track"
 msgstr ""
 
-#: gui/playbacksettings.cpp:51
+#: gui/playbacksettings.cpp:49
 msgid "Auto"
 msgstr ""
 
-#: gui/playbacksettings.cpp:164
+#: gui/playbacksettings.cpp:161
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:26
+#. i18n: file: gui/playbacksettings.ui:114
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
+#: gui/playbacksettings.cpp:164 po/rc.cpp:769 rc.cpp:769
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
 msgstr ""
 
-#: gui/playbacksettings.cpp:174
+#: gui/playbacksettings.cpp:171
 msgid ""
 "<p>Replay Gain is a proposed standard published in 2001 to normalize the "
 "perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It "
@@ -2316,133 +2399,199 @@ msgid ""
 "li></ul></p>"
 msgstr ""
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:95 widgets/playqueueview.cpp:160
+msgid "Stretch Columns To Fit Window"
+msgstr ""
+
+#: gui/playlistspage.cpp:146 tags/tageditor.cpp:828 tags/trackorganiser.cpp:72
 msgid "Rename"
 msgstr ""
 
-#: gui/playlistspage.cpp:190
+#: gui/playlistspage.cpp:147 models/playqueuemodel.cpp:156
+msgid "Remove Duplicates"
+msgstr ""
+
+#: gui/playlistspage.cpp:309
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
 msgstr ""
 
-#: gui/playlistspage.cpp:191
+#: gui/playlistspage.cpp:310
 msgid "Remove Playlists"
 msgstr ""
 
-#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
+#: gui/playlistspage.cpp:330 gui/playlistspage.cpp:357
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr ""
 
-#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
+#: gui/playlistspage.cpp:331 gui/playlistspage.cpp:358
 msgid "Overwrite Playlist"
 msgstr ""
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Rename Playlist"
 msgstr ""
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Enter new name for playlist:"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:80
+#: gui/playlistspage.cpp:446
+msgid "Cannot add songs from '%1' to '%2'"
+msgstr ""
+
+#: gui/preferencesdialog.cpp:83
 msgid "Collection Settings"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: file: gui/playbacksettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
+#: gui/preferencesdialog.cpp:84 po/rc.cpp:742 rc.cpp:742
 msgid "Playback"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:84
 msgid "Playback Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "Files"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "File Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:85
+#: gui/preferencesdialog.cpp:89
 msgid "Streams Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:89
+#: gui/preferencesdialog.cpp:94
 msgid "Online Providers"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context View Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:103
+#: gui/preferencesdialog.cpp:115
 msgid "Audio CD Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgid "Proxy"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cache"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cached Items"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:116
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#: gui/preferencesdialog.cpp:128 po/rc.cpp:53 po/rc.cpp:65 po/rc.cpp:410
+#: rc.cpp:53 rc.cpp:65 rc.cpp:410
 msgid "Configure"
 msgstr ""
 
-#: gui/serversettings.cpp:87
-msgid ""
-"<i> This folder will also be used to locate music files for transferring to "
-"(and from) devices.</i>"
-msgstr ""
-
-#: gui/serversettings.cpp:100
-msgid "Not used"
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#: gui/searchpage.cpp:200 po/rc.cpp:89 po/rc.cpp:371 po/rc.cpp:950 rc.cpp:89
+#: rc.cpp:371 rc.cpp:950
+msgid "Composer:"
+msgstr ""
+
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#: gui/searchpage.cpp:205 po/rc.cpp:95 po/rc.cpp:962 rc.cpp:95 rc.cpp:962
+msgid "Genre:"
+msgstr ""
+
+#: gui/searchpage.cpp:206
+msgid "Date:"
+msgstr ""
+
+#: gui/searchpage.cpp:208
+msgid "Any:"
+msgstr ""
+
+#: gui/searchpage.cpp:215
+msgid "No tracks found."
+msgstr ""
+
+#: gui/serversettings.cpp:87
+msgid ""
+"<i> This folder will also be used to locate music files for transferring to "
+"(and from) devices.</i>"
+msgstr ""
+
+#: gui/serversettings.cpp:100
+msgid "Not used"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:75
@@ -2457,8 +2606,8 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
-#: gui/serversettings.cpp:103 po/rc.cpp:208 po/rc.cpp:247 po/rc.cpp:705
-#: rc.cpp:208 rc.cpp:247 rc.cpp:705
+#: gui/serversettings.cpp:103 po/rc.cpp:269 po/rc.cpp:308 po/rc.cpp:857
+#: rc.cpp:269 rc.cpp:308 rc.cpp:857
 msgid "Host:"
 msgstr ""
 
@@ -2491,7 +2640,7 @@ msgid ""
 "</i></p>"
 msgstr ""
 
-#: gui/serversettings.cpp:252
+#: gui/serversettings.cpp:257
 msgid ""
 "Which type of collection do you wish to connect to?<br/><ul><li>Standard - "
 "music collection may be shared, is on another machine, or is already setup</"
@@ -2499,73 +2648,61 @@ msgid ""
 "configure and control the MPD instance</li></ul>"
 msgstr ""
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Add Collection"
 msgstr ""
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Standard"
 msgstr ""
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Basic"
 msgstr ""
 
-#: gui/serversettings.cpp:297
+#: gui/serversettings.cpp:302
 msgid "Delete <b>%1</b>?"
 msgstr ""
 
-#: gui/serversettings.cpp:298
+#: gui/serversettings.cpp:303
 msgid "Delete"
 msgstr ""
 
-#: gui/serversettings.cpp:336
+#: gui/serversettings.cpp:341
 msgid "New Collection %1"
 msgstr ""
 
-#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
+#: gui/serversettings.cpp:357 mpd/mpdconnection.cpp:173
 msgid "Default"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:74
+#: gui/shortcutssettingspage.cpp:76
 msgid "Multi-Media Keys"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:80
+#: gui/shortcutssettingspage.cpp:82
 msgid "Do not use media keys to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:81
+#: gui/shortcutssettingspage.cpp:83 gui/shortcutssettingspage.cpp:97
 msgid "Use media keys to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:84
+#: gui/shortcutssettingspage.cpp:86 gui/shortcutssettingspage.cpp:104
 msgid "Use media keys, as configured in desktop settings, to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:85
+#: gui/shortcutssettingspage.cpp:87 gui/shortcutssettingspage.cpp:105
 msgid ""
 "Use media keys, as configured in GNOME/Unity settings, to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
-#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+#: gui/shortcutssettingspage.cpp:90 gui/shortcutssettingspage.cpp:107
+#: online/onlineservicespage.cpp:99 streams/streamspage.cpp:99
+#: support/fancytabwidget.cpp:825
 msgid "Configure..."
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:95
-msgid "Use media keys to control Cantata:"
-msgstr ""
-
-#: gui/shortcutssettingspage.cpp:106
-msgid "Use media keys, as configured in desktop settings, to control Cantata:"
-msgstr ""
-
-#: gui/shortcutssettingspage.cpp:107
-msgid ""
-"Use media keys, as configured in GNOME/Unity settings, to control Cantata:"
-msgstr ""
-
 #: gui/stdactions.cpp:55
 msgid "Previous Track"
 msgstr ""
@@ -2638,7 +2775,7 @@ msgstr ""
 msgid "Add To Playlist"
 msgstr ""
 
-#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:66
 msgid "Organize Files"
 msgstr ""
 
@@ -2646,7 +2783,7 @@ msgstr ""
 msgid "Edit Tags"
 msgstr ""
 
-#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:106
 msgid "ReplayGain"
 msgstr ""
 
@@ -2659,88 +2796,89 @@ msgid "Set Image"
 msgstr ""
 
 #: gui/stdactions.cpp:88
-msgid "Refresh Database"
+msgid "Back"
 msgstr ""
 
-#: gui/stdactions.cpp:89
-msgid "Back"
+#: gui/stdactions.cpp:91
+msgid "Find"
 msgstr ""
 
-#: gui/trayitem.cpp:192
+#: gui/trayitem.cpp:210
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr ""
 
-#: gui/trayitem.cpp:193
+#: gui/trayitem.cpp:211
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr ""
 
-#: gui/trayitem.cpp:195
+#: gui/trayitem.cpp:213
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr ""
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:214
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr ""
 
-#: gui/trayitem.cpp:223
+#: gui/trayitem.cpp:241
 msgid "Now playing"
 msgstr ""
 
-#: http/httpserversettings.cpp:40
+#: http/httpserversettings.cpp:39
 msgid "Local loopback (%1)"
 msgstr ""
 
-#: http/httpserversettings.cpp:43
+#: http/httpserversettings.cpp:42
 msgid "Wired (%1)"
 msgstr ""
 
-#: http/httpserversettings.cpp:46
+#: http/httpserversettings.cpp:45
 msgid "Wireless (%1)"
 msgstr ""
 
-#: http/httpserversettings.cpp:53
+#: http/httpserversettings.cpp:52
 msgid "First active interface"
 msgstr ""
 
-#: http/httpserversettings.cpp:98
-msgid "Inactive"
+#: models/albumsmodel.cpp:260 models/musicmodel.cpp:254
+msgctxt "Album by Artist"
+msgid "%1 by %2"
 msgstr ""
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:221
+#: models/musicmodel.cpp:133
 msgid "Cue Sheet"
 msgstr ""
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:220
+#: models/musicmodel.cpp:133
 msgid "Playlist"
 msgstr ""
 
-#: models/devicesmodel.cpp:108
+#: models/devicesmodel.cpp:116
 msgid "Configure Device"
 msgstr ""
 
-#: models/devicesmodel.cpp:109
+#: models/devicesmodel.cpp:117
 msgid "Refresh Device"
 msgstr ""
 
-#: models/devicesmodel.cpp:110
+#: models/devicesmodel.cpp:118
 msgid "Connect Device"
 msgstr ""
 
-#: models/devicesmodel.cpp:111
+#: models/devicesmodel.cpp:119
 msgid "Disconnect Device"
 msgstr ""
 
-#: models/devicesmodel.cpp:113
+#: models/devicesmodel.cpp:121
 msgid "Edit CD Details"
 msgstr ""
 
-#: models/devicesmodel.cpp:690
+#: models/devicesmodel.cpp:730
 msgid "No Devices Attached"
 msgstr ""
 
@@ -2772,42 +2910,42 @@ msgstr ""
 msgid "Session expired"
 msgstr ""
 
-#: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
+#: models/dirviewmodel.cpp:204 models/dirviewmodel.cpp:212
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:696
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/dirviewmodel.cpp:190
+#: models/dirviewmodel.cpp:219
 msgid "Audio File"
 msgstr ""
 
-#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
-#: models/musiclibraryitemroot.cpp:844
+#: models/musiclibraryitemartist.cpp:248 models/musiclibraryitemartist.cpp:261
+#: models/musiclibraryitemroot.cpp:840
 msgid "Single Tracks"
 msgstr ""
 
-#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
-#: widgets/groupedview.cpp:366
+#: models/musicmodel.cpp:190 models/onlineservicesmodel.cpp:167
+#: widgets/groupedview.cpp:364
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/musicmodel.cpp:185
+#: models/musicmodel.cpp:196
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/musicmodel.cpp:192
+#: models/musicmodel.cpp:203
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/musicmodel.cpp:198
+#: models/musicmodel.cpp:209
 msgid "1 Episode"
 msgid_plural "%1 Episodes"
 msgstr[0] ""
@@ -2815,208 +2953,215 @@ msgstr[1] ""
 
 #. i18n: file: online/onlinesettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: models/onlineservicesmodel.cpp:83 po/rc.cpp:720 rc.cpp:720
+#: models/onlineservicesmodel.cpp:91 po/rc.cpp:872 rc.cpp:872
 msgid "Configure Service"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:84
+#: models/onlineservicesmodel.cpp:92
 msgid "Refresh Service"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:85
+#: models/onlineservicesmodel.cpp:93
 msgid "Add Subscription"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:86
+#: models/onlineservicesmodel.cpp:94
 msgid "Remove Subscription"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:87
+#: models/onlineservicesmodel.cpp:95
 msgid "Refresh Subscription"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:137
+#: models/onlineservicesmodel.cpp:145
 msgid "Last Search:%1"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:149
-msgid "Searching..."
-msgstr ""
-
-#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
-#: models/streamsmodel.cpp:670
+#: models/onlineservicesmodel.cpp:160 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:691
 msgid "Not Loaded"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:155
+#: models/onlineservicesmodel.cpp:163
 msgid "Use search to locate tracks"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:166
+#: models/onlineservicesmodel.cpp:174
 msgid "1 Podcast"
 msgid_plural "%1 Podcasts"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/onlineservicesmodel.cpp:177
+#: models/onlineservicesmodel.cpp:185
 msgid "(Downloading: %1%)"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:235
+#: models/onlineservicesmodel.cpp:243
 msgctxt "podcast name (num unplayed episodes)"
 msgid "%1 (%2)"
 msgstr ""
 
-#: models/playlistsmodel.cpp:77
+#: models/playlistsmodel.cpp:105
 msgid "New Playlist..."
 msgstr ""
 
-#: models/playqueuemodel.cpp:102
-msgctxt "Track Number (#)"
-msgid "#"
+#: models/playlistsmodel.cpp:321
+msgid "Smart Playlist"
 msgstr ""
 
-#: models/playqueuemodel.cpp:103
+#: models/playqueuemodel.cpp:109
 msgid "Length"
 msgstr ""
 
-#: models/playqueuemodel.cpp:104
+#: models/playqueuemodel.cpp:110
 msgid "Disc"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:138
+#. i18n: file: devices/filenameschemedialog.ui:174
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
+#: models/playqueuemodel.cpp:111 po/rc.cpp:248 rc.cpp:248
 msgid "Year"
 msgstr ""
 
-#: models/playqueuemodel.cpp:360
+#: models/playqueuemodel.cpp:158
+msgid "Undo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:160
+msgid "Redo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:404
 msgid "<b>(Priority: %1)</b>"
 msgstr ""
 
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:693
 msgid "Loading..."
 msgstr ""
 
-#: models/streamsmodel.cpp:286
+#: models/streamsmodel.cpp:302
 msgid "Bookmarks"
 msgstr ""
 
-#: models/streamsmodel.cpp:560
+#: models/streamsmodel.cpp:576
 msgid "TuneIn"
 msgstr ""
 
-#: models/streamsmodel.cpp:563
+#: models/streamsmodel.cpp:579
 msgid "IceCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:564
+#: models/streamsmodel.cpp:580
 msgid "ShoutCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:567
+#: models/streamsmodel.cpp:583
 msgid "SomaFM"
 msgstr ""
 
-#: models/streamsmodel.cpp:568
+#: models/streamsmodel.cpp:584
+msgid "Radio GFM"
+msgstr ""
+
+#: models/streamsmodel.cpp:585
 msgid "Digitally Imported"
 msgstr ""
 
-#: models/streamsmodel.cpp:569
+#: models/streamsmodel.cpp:586
 msgid "JazzRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:570
+#: models/streamsmodel.cpp:587
 msgid "RockRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:571
+#: models/streamsmodel.cpp:588
 msgid "Sky.fm"
 msgstr ""
 
-#: models/streamsmodel.cpp:572
+#: models/streamsmodel.cpp:589
 msgid "Favorites"
 msgstr ""
 
-#: models/streamsmodel.cpp:573
+#: models/streamsmodel.cpp:590
 msgid "Listen Live"
 msgstr ""
 
-#: models/streamsmodel.cpp:578
+#: models/streamsmodel.cpp:595
 msgid "Bookmark Category"
 msgstr ""
 
-#: models/streamsmodel.cpp:579
+#: models/streamsmodel.cpp:596
 msgid "Add Stream To Favorites"
 msgstr ""
 
-#: models/streamsmodel.cpp:580
+#: models/streamsmodel.cpp:597
 msgid "Configure Streams"
 msgstr ""
 
-#: models/streamsmodel.cpp:660
+#: models/streamsmodel.cpp:681
 msgid "%1 (Read-Only)"
 msgstr ""
 
-#: models/streamsmodel.cpp:1241
+#: models/streamsmodel.cpp:1261
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr ""
 
-#: models/streamsmodel.cpp:1639
+#: models/streamsmodel.cpp:1659
 msgid "All"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:154
+#: mpd/mpdconnection.cpp:179
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr ""
 
-#: mpd/mpdconnection.cpp:156
+#: mpd/mpdconnection.cpp:181
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:372 mpd/mpdconnection.cpp:415
-#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
-#: mpd/mpdconnection.cpp:1036
+#: mpd/mpdconnection.cpp:406 mpd/mpdconnection.cpp:451
+#: mpd/mpdconnection.cpp:501 mpd/mpdconnection.cpp:1137
+#: mpd/mpdconnection.cpp:1164
 msgid "Connection to %1 failed"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
+#: mpd/mpdconnection.cpp:412 mpd/mpdconnection.cpp:455
 msgid "Connection to %1 failed - incorrect password"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:455
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to send command to %1 - not connected"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:491
+#: mpd/mpdconnection.cpp:539
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr ""
 
-#: mpd/mpdconnection.cpp:493
+#: mpd/mpdconnection.cpp:541
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
 msgstr ""
 
-#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
+#: mpd/mpdconnection.cpp:547 mpd/mpdconnection.cpp:558
 msgid "Failed to send command. Disconnected from %1"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1306
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1183
+#: mpd/mpdconnection.cpp:1318
 msgid "Failed to save <b>%1</b>"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1196
+#: mpd/mpdconnection.cpp:1331
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1199
+#: mpd/mpdconnection.cpp:1334
 msgid "You cannot add a playlist to another playlist!"
 msgstr ""
 
@@ -3024,7 +3169,15 @@ msgstr ""
 msgid "Personal"
 msgstr ""
 
-#: mpd/song.cpp:343
+#: mpd/song.cpp:62
+msgid "Unknown"
+msgstr ""
+
+#: mpd/song.cpp:63
+msgid "Various Artists"
+msgstr ""
+
+#: mpd/song.cpp:427
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3091,8 +3244,8 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
-#: rc.cpp:711 rc.cpp:729
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:863 po/rc.cpp:881
+#: rc.cpp:863 rc.cpp:881
 msgid "Username:"
 msgstr ""
 
@@ -3120,9 +3273,9 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPasswordLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:220 po/rc.cpp:238
-#: po/rc.cpp:412 po/rc.cpp:647 po/rc.cpp:714 po/rc.cpp:732 rc.cpp:220
-#: rc.cpp:238 rc.cpp:412 rc.cpp:647 rc.cpp:714 rc.cpp:732
+#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:281 po/rc.cpp:299
+#: po/rc.cpp:476 po/rc.cpp:802 po/rc.cpp:866 po/rc.cpp:884 rc.cpp:281
+#: rc.cpp:299 rc.cpp:476 rc.cpp:802 rc.cpp:866 rc.cpp:884
 msgid "Password:"
 msgstr ""
 
@@ -3162,155 +3315,177 @@ msgstr ""
 msgid "Download To Library"
 msgstr ""
 
-#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
-msgid "Search For Podcasts"
-msgstr ""
-
-#: online/onlineservicespage.cpp:63
+#: online/onlineservicespage.cpp:62
 msgid "Download Podcast Episodes"
 msgstr ""
 
-#: online/onlineservicespage.cpp:64
+#: online/onlineservicespage.cpp:63
 msgid "Delete Downloaded Podcast Episodes"
 msgstr ""
 
-#: online/onlineservicespage.cpp:329
+#: online/onlineservicespage.cpp:320
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr ""
 
-#: online/onlineservicespage.cpp:464
+#: online/onlineservicespage.cpp:458
 msgid "Re-download music listing for %1?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:532
-msgid "Subscribe to Podcast"
-msgstr ""
-
-#: online/onlineservicespage.cpp:532
-msgid "Enter podcast URL:"
-msgstr ""
-
-#: online/onlineservicespage.cpp:541
-msgid "Invalid URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:546
-msgid "You are already subscribed to this URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:550
-msgid "Already downloading this URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:579
+#: online/onlineservicespage.cpp:544
 msgid "Unsubscribe from <b>%1</b>?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:600
+#: online/onlineservicespage.cpp:565
 msgid "Refresh all podcast listings?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:621
+#: online/onlineservicespage.cpp:586
 msgid "Refresh episode listing from <b>%1</b>?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:695
+#: online/onlineservicespage.cpp:652
 msgid "All selected podcasts have already been downloaded!"
 msgstr ""
 
-#: online/onlineservicespage.cpp:699
+#: online/onlineservicespage.cpp:656
 msgid "Do you wish to download the following podcast episode?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:702
+#: online/onlineservicespage.cpp:659
 msgid "Do you wish to download the following podcast episodes?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:705
+#: online/onlineservicespage.cpp:662
 msgid "Do you wish to download the selected podcast episodes?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:753
+#: online/onlineservicespage.cpp:710
 msgid "All selected downloaded podcast episodes have already been deleted!"
 msgstr ""
 
-#: online/onlineservicespage.cpp:757
+#: online/onlineservicespage.cpp:714
 msgid ""
 "Do you wish to delete the downloaded file of the following podcast episode?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:760
+#: online/onlineservicespage.cpp:717
 msgid ""
 "Do you wish to the delete downloaded files of the following podcast episodes?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:763
+#: online/onlineservicespage.cpp:720
 msgid ""
 "Do you wish to the delete downloaded files of the selected podcast episodes?"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:243
+#: online/podcastsearchdialog.cpp:253
 msgid "RSS:"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:245
+#: online/podcastsearchdialog.cpp:255
 msgid "Website:"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Podcast details"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Select a podcast to display its details"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:322
+#: online/podcastsearchdialog.cpp:333
 msgid "Enter search term..."
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:372
+#: online/podcastsearchdialog.cpp:383
 msgid "Failed to fetch podcasts from %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:378
+#: online/podcastsearchdialog.cpp:389
 msgid "There was a problem parsing the response from %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:439
+#: online/podcastsearchdialog.cpp:450
 msgid "Failed to download directory listing"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:447
+#: online/podcastsearchdialog.cpp:458
 msgid "Failed to parse directory listing"
 msgstr ""
 
 #: online/podcastsearchdialog.cpp:508
+msgid "URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:517
+msgid "Enter podcast URL..."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:518
+msgid "Load"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:525
+msgid "Enter podcast URL below, and press 'Load'"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:552
+msgid "Invalid URL!"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:562
+msgid "Failed to fetch podcast!"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:567
+msgid "Failed to parse podcast."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:571
+msgid ""
+"Cantata only supports audio podcasts! The URL entered contains only video "
+"podcasts."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:589
 msgid "Subscribe"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:607
+msgid "Enter URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:607
+msgid "Manual podcast URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search for podcasts on %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1 podcasts"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:602
+#: online/podcastsearchdialog.cpp:639
+msgid "Add Podcast Subscription"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:695
 msgid "Subscription added"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:604
+#: online/podcastsearchdialog.cpp:697
 msgid "You are already subscribed to this podcast!"
 msgstr ""
 
@@ -3318,91 +3493,170 @@ msgstr ""
 msgid "Podcasts"
 msgstr ""
 
-#: online/podcastservice.cpp:284
+#: online/podcastservice.cpp:288
 msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
 msgstr ""
 
-#: online/podcastservice.cpp:286
+#: online/podcastservice.cpp:290
 msgid "Failed to parse %1"
 msgstr ""
 
-#: online/podcastservice.cpp:290
+#: online/podcastservice.cpp:294
 msgid "Failed to download %1"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:58
+#: online/podcastsettingsdialog.cpp:59
 msgid "Check for new episodes:"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:59
+#: online/podcastsettingsdialog.cpp:60
 msgid "Download episodes to:"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:60
-msgid "Automatically download new episodes:"
+#: online/podcastsettingsdialog.cpp:67
+msgid "Automatically download new episodes"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:82
+#: online/podcastsettingsdialog.cpp:80
 msgid "Podcast Settings"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:84
+#: online/podcastsettingsdialog.cpp:82
 msgid "Manually"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:85
+#: online/podcastsettingsdialog.cpp:83
 msgid "Every 15 minutes"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:86
+#: online/podcastsettingsdialog.cpp:84
 msgid "Every 30 minutes"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:87
+#: online/podcastsettingsdialog.cpp:85
 msgid "Every hour"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:88
+#: online/podcastsettingsdialog.cpp:86
 msgid "Every 2 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:89
+#: online/podcastsettingsdialog.cpp:87
 msgid "Every 6 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:90
+#: online/podcastsettingsdialog.cpp:88
 msgid "Every 12 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:91
+#: online/podcastsettingsdialog.cpp:89
 msgid "Every day"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:92
+#: online/podcastsettingsdialog.cpp:90
 msgid "Every week"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:19
-#. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
-#: po/rc.cpp:3 rc.cpp:3
-msgid "Use backdrop:"
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:3 po/rc.cpp:657 rc.cpp:3 rc.cpp:657
+msgid "Background Image"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:36
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_artist)
+#: po/rc.cpp:9 rc.cpp:9
+msgid "Artist image"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#: po/rc.cpp:12 po/rc.cpp:666 rc.cpp:12 rc.cpp:666
+msgid "Custom image:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#: po/rc.cpp:15 po/rc.cpp:669 rc.cpp:15 rc.cpp:669
+msgid "Blur:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#: po/rc.cpp:18 po/rc.cpp:672 rc.cpp:18 rc.cpp:672
+msgid "10px"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: po/rc.cpp:21 po/rc.cpp:675 rc.cpp:21 rc.cpp:675
+msgid "Opacity:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#: po/rc.cpp:25 po/rc.cpp:679 rc.cpp:25 rc.cpp:679
+#, no-c-format
+msgid "40%"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, contextDarkBackground)
+#: po/rc.cpp:28 rc.cpp:28
+msgid "Dark background"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:32
-#. i18n: ectx: property (text), widget (BuddyLabel, contextDarkBackgroundLabel)
-#: po/rc.cpp:6 rc.cpp:6
-msgid "Dark background:"
+#. i18n: file: context/othersettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, wikipediaIntroOnly)
+#: po/rc.cpp:31 rc.cpp:31
+msgid "Only show basic wikipedia text"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:45
-#. i18n: ectx: property (text), widget (BuddyLabel, wikipediaIntroOnlyLabel)
-#: po/rc.cpp:9 rc.cpp:9
-msgid "Only show basic wikipedia text:"
+#. i18n: file: context/othersettings.ui:178
+#. i18n: ectx: property (text), widget (QCheckBox, contextAlwaysCollapsed)
+#: po/rc.cpp:34 rc.cpp:34
+msgid "Always collapse into a single pane"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:86
+#. i18n: file: context/othersettings.ui:207
 #. i18n: ectx: property (text), widget (StateLabel, wikipediaIntroOnlyNote)
-#: po/rc.cpp:13 rc.cpp:13
+#: po/rc.cpp:38 rc.cpp:38
 #, no-c-format
 msgid ""
 "<i><b>NOTE:</b> Cantata does not show the full wikipedia pages (with images, "
@@ -3415,188 +3669,172 @@ msgstr ""
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:16 rc.cpp:16
+#: po/rc.cpp:41 rc.cpp:41
 msgid "Available:"
 msgstr ""
 
 #. i18n: file: context/togglelist.ui:24
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:19 rc.cpp:19
+#: po/rc.cpp:44 rc.cpp:44
 msgid "Selected:"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:30
+#. i18n: file: devices/actiondialog.ui:33
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:22 rc.cpp:22
+#: po/rc.cpp:47 rc.cpp:47
 msgid "Copy songs from:"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#: po/rc.cpp:25 po/rc.cpp:31 po/rc.cpp:49 po/rc.cpp:744 rc.cpp:25 rc.cpp:31
-#: rc.cpp:49 rc.cpp:744
+#: po/rc.cpp:50 po/rc.cpp:62 po/rc.cpp:896 rc.cpp:50 rc.cpp:62 rc.cpp:896
 msgid "TextLabel"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#: po/rc.cpp:28 po/rc.cpp:34 rc.cpp:28 rc.cpp:34
+#: po/rc.cpp:56 po/rc.cpp:68 rc.cpp:56 rc.cpp:68
 msgid "(Needs configuring)"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:123
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:37 rc.cpp:37
-msgid "Overwrite songs:"
-msgstr ""
-
-#. i18n: file: devices/actiondialog.ui:150
+#. i18n: file: devices/actiondialog.ui:86
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:40 rc.cpp:40
+#: po/rc.cpp:59 rc.cpp:59
 msgid "Copy songs to:"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:157
+#. i18n: file: devices/actiondialog.ui:149
 #. i18n: ectx: property (text), widget (QLabel, codecLabel)
-#: po/rc.cpp:43 rc.cpp:43
+#: po/rc.cpp:71 rc.cpp:71
 msgid "Destination format:"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:171
+#. i18n: file: devices/actiondialog.ui:163
+#. i18n: ectx: property (text), widget (QCheckBox, overwrite)
+#: po/rc.cpp:74 rc.cpp:74
+msgid "Overwrite songs"
+msgstr ""
+
+#. i18n: file: devices/actiondialog.ui:170
 #. i18n: ectx: property (text), widget (QLabel, songCountLabel)
-#: po/rc.cpp:46 rc.cpp:46
+#: po/rc.cpp:77 rc.cpp:77
 msgid "To copy:"
 msgstr ""
 
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#: po/rc.cpp:80 po/rc.cpp:968 po/rc.cpp:995 rc.cpp:80 rc.cpp:968 rc.cpp:995
+msgid ""
+"<i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i>"
+msgstr ""
+
 #. i18n: file: devices/albumdetails.ui:26
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:52 rc.cpp:52
+#: po/rc.cpp:83 rc.cpp:83
 msgid "Album Details"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#: po/rc.cpp:58 po/rc.cpp:298 po/rc.cpp:798 rc.cpp:58 rc.cpp:298 rc.cpp:798
-msgid "Composer:"
-msgstr ""
-
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
-msgid "Genre:"
-msgstr ""
-
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#: po/rc.cpp:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
+#: po/rc.cpp:98 po/rc.cpp:965 rc.cpp:98 rc.cpp:965
 msgid "Year:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:99
+#. i18n: file: devices/albumdetails.ui:102
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:70 rc.cpp:70
+#: po/rc.cpp:101 rc.cpp:101
 msgid "Disc:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:73 rc.cpp:73
-msgid "Single artist:"
+#. i18n: file: devices/albumdetails.ui:115
+#. i18n: ectx: property (text), widget (QCheckBox, singleArtist)
+#: po/rc.cpp:104 rc.cpp:104
+msgid "Single artist"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:20
+#. i18n: file: devices/audiocdsettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:119 rc.cpp:119
 msgid "Album and Track Information Retrieval"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:26
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:91 rc.cpp:91
-msgid "Automatically lookup:"
-msgstr ""
-
-#. i18n: file: devices/audiocdsettings.ui:39
+#. i18n: file: devices/audiocdsettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:122 rc.cpp:122
 msgid "Initially look up via:"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:52
+#. i18n: file: devices/audiocdsettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:125 rc.cpp:125
 msgid "CDDB Host:"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:65
+#. i18n: file: devices/audiocdsettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:128 rc.cpp:128
 msgid "CDDB Port:"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:88
+#. i18n: file: devices/audiocdsettings.ui:84
+#. i18n: ectx: property (text), widget (QCheckBox, cdAuto)
+#: po/rc.cpp:131 rc.cpp:131
+msgid "Lookup information as soon as CD is inserted"
+msgstr ""
+
+#. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:134 rc.cpp:134
 msgid "Audio Extraction"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:94
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:106 rc.cpp:106
-msgid "Full paranoia mode (best quality):"
+#. i18n: file: devices/audiocdsettings.ui:100
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaFull)
+#: po/rc.cpp:137 rc.cpp:137
+msgid "Full paranoia mode (best quality)"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:107
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:109 rc.cpp:109
-msgid "Never skip on read error:"
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaNeverSkip)
+#: po/rc.cpp:140 rc.cpp:140
+msgid "Never skip on read error"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:112 rc.cpp:112
+#: po/rc.cpp:143 rc.cpp:143
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3622,188 +3860,255 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
 #. i18n: file: gui/serversettings.ui:325
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
-#: po/rc.cpp:115 po/rc.cpp:415 po/rc.cpp:433 po/rc.cpp:650 po/rc.cpp:671
-#: rc.cpp:115 rc.cpp:415 rc.cpp:433 rc.cpp:650 rc.cpp:671
+#: po/rc.cpp:146 po/rc.cpp:479 po/rc.cpp:497 po/rc.cpp:805 po/rc.cpp:826
+#: rc.cpp:146 rc.cpp:479 rc.cpp:497 rc.cpp:805 rc.cpp:826
 msgid "Music folder:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:149 rc.cpp:149
 msgid "Copy album covers as:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: po/rc.cpp:152 rc.cpp:152
 msgid "Maximum cover size:"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:82
-#. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:124 rc.cpp:124
-msgid "'Various Artists' workaround:"
+#. i18n: file: devices/devicepropertieswidget.ui:85
+#. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
+#: po/rc.cpp:155 rc.cpp:155
+msgid "Default volume:"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, autoScanLabel)
-#: po/rc.cpp:127 rc.cpp:127
-msgid "Automatically scan music when attached:"
+#. i18n: file: devices/devicepropertieswidget.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, fixVariousArtists)
+#: po/rc.cpp:158 rc.cpp:158
+msgid "'Various Artists' workaround"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:108
-#. i18n: ectx: property (text), widget (BuddyLabel, useCacheLabel)
-#: po/rc.cpp:130 rc.cpp:130
-msgid "Use cache:"
+#. i18n: file: devices/devicepropertieswidget.ui:99
+#. i18n: ectx: property (text), widget (QCheckBox, autoScan)
+#: po/rc.cpp:161 rc.cpp:161
+msgid "Automatically scan music when attached"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:121
-#. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:133 rc.cpp:133
-msgid "Default volume:"
+#. i18n: file: devices/devicepropertieswidget.ui:106
+#. i18n: ectx: property (text), widget (QCheckBox, useCache)
+#: po/rc.cpp:164 rc.cpp:164
+msgid "Use cache"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#: po/rc.cpp:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
+#: po/rc.cpp:167 po/rc.cpp:971 rc.cpp:167 rc.cpp:971
 msgid "Filenames"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
-msgid "Use only ASCII characters:"
-msgstr ""
-
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
-msgid "Replace spaces with underscores:"
-msgstr ""
-
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
-msgid "Ignore 'The' in artist names:"
-msgstr ""
-
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
+#: po/rc.cpp:170 po/rc.cpp:974 rc.cpp:170 rc.cpp:974
 msgid "Filename scheme:"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
-msgid "VFAT safe:"
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#: po/rc.cpp:173 po/rc.cpp:977 rc.cpp:173 rc.cpp:977
+msgid "VFAT safe"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:250
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#: po/rc.cpp:176 po/rc.cpp:980 rc.cpp:176 rc.cpp:980
+msgid "Use only ASCII characters"
+msgstr ""
+
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#: po/rc.cpp:179 po/rc.cpp:983 rc.cpp:179 rc.cpp:983
+msgid "Replace spaces with underscores"
+msgstr ""
+
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#: po/rc.cpp:182 po/rc.cpp:986 rc.cpp:182 rc.cpp:986
+msgid "Ignore 'The' in artist names"
+msgstr ""
+
+#. i18n: file: devices/devicepropertieswidget.ui:192
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:185 rc.cpp:185
 msgid "Transcoding"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:261
-#. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:157 rc.cpp:157
-msgid "Only transcode if source file is of a different format:"
+#. i18n: file: devices/devicepropertieswidget.ui:201
+#. i18n: ectx: property (text), widget (QCheckBox, transcoderWhenDifferent)
+#: po/rc.cpp:188 rc.cpp:188
+msgid "Only transcode if source file is of a different format"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:29
+#. i18n: file: devices/filenameschemedialog.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:191 rc.cpp:191
 msgid "Example:"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:58
+#. i18n: file: devices/filenameschemedialog.ui:67
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:194 rc.cpp:194
 msgid "About filename schemes"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:70
+#. i18n: file: devices/filenameschemedialog.ui:79
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumArtist)
+#: po/rc.cpp:197 rc.cpp:197
+msgid ""
+"The artist of the album. For most albums, this will be the same as the "
+"<i>Track Artist.</i> For compilations, this will often be <i>Various Artists."
+"</i>"
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:82
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:200 rc.cpp:200
 msgid "Album Artist"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:77
+#. i18n: file: devices/filenameschemedialog.ui:89
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumTitle)
+#: po/rc.cpp:203 rc.cpp:203
+msgid "The name of the album."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:92
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:206 rc.cpp:206
 msgid "Album Title"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:91
+#. i18n: file: devices/filenameschemedialog.ui:99
+#. i18n: ectx: property (toolTip), widget (QPushButton, composer)
+#: po/rc.cpp:209 rc.cpp:209
+msgid "The composer."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:109
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtist)
+#: po/rc.cpp:215 rc.cpp:215
+msgid "The artist of each track."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:112
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:218 rc.cpp:218
 msgid "Track Artist"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:98
+#. i18n: file: devices/filenameschemedialog.ui:119
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackTitle)
+#: po/rc.cpp:221 rc.cpp:221
+msgid "The track title (without <i>Track Artist</i>)."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:122
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:224 rc.cpp:224
 msgid "Track Title"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:117
+#. i18n: file: devices/filenameschemedialog.ui:141
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtistAndTitle)
+#: po/rc.cpp:227 rc.cpp:227
+msgid ""
+"The track title (with <i>Track Artist</i>, if different to <i>Album Artist</"
+"i>)."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:144
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:230 rc.cpp:230
 msgid "Track Title (+Artist)"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:124
+#. i18n: file: devices/filenameschemedialog.ui:151
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackNo)
+#: po/rc.cpp:233 rc.cpp:233
+msgid "The track number."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:154
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:184 rc.cpp:184
+#: po/rc.cpp:236 rc.cpp:236
 msgid "Track #"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:131
+#. i18n: file: devices/filenameschemedialog.ui:161
+#. i18n: ectx: property (toolTip), widget (QPushButton, cdNo)
+#: po/rc.cpp:239 rc.cpp:239
+msgid ""
+"The album number of a multi-album album. Often compilations consist of "
+"several albums."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:164
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:187 rc.cpp:187
+#: po/rc.cpp:242 rc.cpp:242
 msgid "CD #"
 msgstr ""
 
+#. i18n: file: devices/filenameschemedialog.ui:171
+#. i18n: ectx: property (toolTip), widget (QPushButton, year)
+#: po/rc.cpp:245 rc.cpp:245
+msgid "The year of the album's release."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:181
+#. i18n: ectx: property (toolTip), widget (QPushButton, genre)
+#: po/rc.cpp:251 rc.cpp:251
+msgid "The genre of the album."
+msgstr ""
+
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:196 rc.cpp:196
+#: po/rc.cpp:257 rc.cpp:257
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -3811,17 +4116,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
-#: po/rc.cpp:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
+#: po/rc.cpp:260 po/rc.cpp:353 po/rc.cpp:848 rc.cpp:260 rc.cpp:353 rc.cpp:848
 msgid "Type:"
 msgstr ""
 
@@ -3833,14 +4138,16 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, nameLabel)
 #. i18n: file: gui/serversettings.ui:63
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
-#: rc.cpp:638
+#: po/rc.cpp:263 po/rc.cpp:793 streams/streamdialog.cpp:71 rc.cpp:263
+#: rc.cpp:793
 msgid "Name:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:205 rc.cpp:205
+#. i18n: file: gui/interfacesettings.ui:122
+#. i18n: ectx: property (title), widget (QGroupBox, optionsGroup)
+#: po/rc.cpp:266 rc.cpp:266 po/rc.cpp:551 rc.cpp:551
 msgid "Options"
 msgstr ""
 
@@ -3864,8 +4171,8 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: network/proxysettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPortLabel)
-#: po/rc.cpp:211 po/rc.cpp:250 po/rc.cpp:409 po/rc.cpp:644 po/rc.cpp:708
-#: rc.cpp:211 rc.cpp:250 rc.cpp:409 rc.cpp:644 rc.cpp:708
+#: po/rc.cpp:272 po/rc.cpp:311 po/rc.cpp:473 po/rc.cpp:799 po/rc.cpp:860
+#: rc.cpp:272 rc.cpp:311 rc.cpp:473 rc.cpp:799 rc.cpp:860
 msgid "Port:"
 msgstr ""
 
@@ -3881,7 +4188,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2x)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:322
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel)
-#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
+#: po/rc.cpp:275 po/rc.cpp:293 po/rc.cpp:314 rc.cpp:275 rc.cpp:293 rc.cpp:314
 msgid "User:"
 msgstr ""
 
@@ -3893,7 +4200,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:218
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2x)
-#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:278 po/rc.cpp:296 rc.cpp:278 rc.cpp:296
 msgid "Domain:"
 msgstr ""
 
@@ -3905,7 +4212,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:248
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2)
-#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
+#: po/rc.cpp:284 po/rc.cpp:302 rc.cpp:284 rc.cpp:302
 msgid "Share:"
 msgstr ""
 
@@ -3917,7 +4224,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QLabel, label_4)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:263
 #. i18n: ectx: property (text), widget (QLabel, label_4x)
-#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
+#: po/rc.cpp:287 po/rc.cpp:305 rc.cpp:287 rc.cpp:305
 msgid ""
 "<i><b>NOTE:</b> If you enter a password here, it will be stored "
 "<b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the "
@@ -3926,7 +4233,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:229 rc.cpp:229
+#: po/rc.cpp:290 rc.cpp:290
 msgid "Service name:"
 msgstr ""
 
@@ -3938,19 +4245,19 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:390
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
+#: po/rc.cpp:317 po/rc.cpp:326 rc.cpp:317 rc.cpp:326
 msgid "Folder:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:259 rc.cpp:259
+#: po/rc.cpp:320 rc.cpp:320
 msgid "Extra Options:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:323 rc.cpp:323
 msgid ""
 "<i><b>NOTE:</b> Due to the way sshfs works, a suitable ssh-askpass "
 "application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter "
@@ -3959,7 +4266,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:329 rc.cpp:329
 msgid ""
 "<i><b>NOTE:</b> This dialog is only used to add remote devices (e.g. via "
 "Samba), or to access locally mounted folders. For normal media players, "
@@ -3969,178 +4276,160 @@ msgstr ""
 
 #. i18n: file: dynamic/dynamicpage.ui:26
 #. i18n: ectx: property (text), widget (StatusLabel, infoLabel)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:332 rc.cpp:332
 msgid "No dynamizer port defined in server settings."
 msgstr ""
 
 #. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:274 rc.cpp:274
+#: po/rc.cpp:335 rc.cpp:335
 msgid "Remote dynamizer is not running."
 msgstr ""
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:277 rc.cpp:277
+#: po/rc.cpp:338 rc.cpp:338
 msgid "Name of Dynamic Rules"
 msgstr ""
 
 #. i18n: file: dynamic/dynamicrules.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, editBtn)
-#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
+#: po/rc.cpp:344 streams/streamspage.cpp:62 rc.cpp:344
 msgid "Edit"
 msgstr ""
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:350 rc.cpp:350
 msgid "About Rules"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:38
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:295 rc.cpp:295
-msgid "Album Artist:"
+#. i18n: file: dynamic/dynamicrule.ui:37
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:356 rc.cpp:356
+msgid "Include songs that match the following:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
-msgid "Album:"
+#. i18n: file: dynamic/dynamicrule.ui:42
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:359 rc.cpp:359
+msgid "Exclude songs that match the following:"
+msgstr ""
+
+#. i18n: file: dynamic/dynamicrule.ui:63
+#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
+#: po/rc.cpp:365 rc.cpp:365
+msgid "Artists similar to:"
+msgstr ""
+
+#. i18n: file: dynamic/dynamicrule.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
+#: po/rc.cpp:368 rc.cpp:368
+msgid "Album Artist:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:103
+#. i18n: file: dynamic/dynamicrule.ui:141
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:310 rc.cpp:310
+#: po/rc.cpp:383 rc.cpp:383
 msgid "From Year:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#: po/rc.cpp:386 po/rc.cpp:392 rc.cpp:386 rc.cpp:392
 msgid "Any"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:126
+#. i18n: file: dynamic/dynamicrule.ui:164
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:316 rc.cpp:316
+#: po/rc.cpp:389 rc.cpp:389
 msgid "To Year:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:149
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:322 rc.cpp:322
-msgid "Exact match:"
-msgstr ""
-
-#. i18n: file: dynamic/dynamicrule.ui:173
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:328 rc.cpp:328
-msgid "Include songs that match the following:"
-msgstr ""
-
-#. i18n: file: dynamic/dynamicrule.ui:178
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:331 rc.cpp:331
-msgid "Exclude songs that match the following:"
-msgstr ""
-
-#. i18n: file: dynamic/dynamicrule.ui:186
-#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:334 rc.cpp:334
-msgid "Artists similar to:"
+#. i18n: file: dynamic/dynamicrule.ui:187
+#. i18n: ectx: property (text), widget (QCheckBox, exactCheck)
+#: po/rc.cpp:395 rc.cpp:395
+msgid "Exact match"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:236
+#. i18n: file: dynamic/dynamicrule.ui:231
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:337 rc.cpp:337
+#: po/rc.cpp:398 rc.cpp:398
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:262
+#. i18n: file: dynamic/dynamicrule.ui:260
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:340 rc.cpp:340
+#: po/rc.cpp:401 rc.cpp:401
 msgid ""
 "<i><b>NOTE</b> For genre, end string with an asterisk to match various "
 "genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. </i>"
 msgstr ""
 
-#. i18n: file: gui/coverdialog.ui:23
-#. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:343 rc.cpp:343
-msgid "<html><head/><body><p>Cancel current query</p></body></html>"
-msgstr ""
-
-#. i18n: file: gui/coverdialog.ui:37
+#. i18n: file: gui/coverdialog.ui:30
 #. i18n: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:349 rc.cpp:349
-msgid "<html><head/><body><p>Add a local file</p></body></html>"
-msgstr ""
-
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:352 po/rc.cpp:442 rc.cpp:352 rc.cpp:442
-msgid "Save downloaded covers in music folder:"
-msgstr ""
-
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:355 po/rc.cpp:445 rc.cpp:355 rc.cpp:445
-msgid "Save downloaded lyrics in music folder:"
-msgstr ""
-
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#: po/rc.cpp:358 po/rc.cpp:448 rc.cpp:358 rc.cpp:448
-msgid "Save downloaded backdrops in music folder:"
-msgstr ""
-
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:361 po/rc.cpp:451 rc.cpp:361 rc.cpp:451
-msgid "Save list of favorite streams in music folder:"
-msgstr ""
-
-#. i18n: file: gui/filesettings.ui:110
+#: po/rc.cpp:407 rc.cpp:407
+msgid "Add a local file"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#: po/rc.cpp:413 po/rc.cpp:506 rc.cpp:413 rc.cpp:506
+msgid "Save downloaded covers in music folder"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#: po/rc.cpp:416 po/rc.cpp:509 rc.cpp:416 rc.cpp:509
+msgid "Save downloaded lyrics in music folder"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#: po/rc.cpp:419 po/rc.cpp:512 rc.cpp:419 rc.cpp:512
+msgid "Save downloaded backdrops in music folder"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#: po/rc.cpp:422 po/rc.cpp:515 rc.cpp:422 rc.cpp:515
+msgid "Save list of favorite streams in music folder"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:79
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:425 rc.cpp:425
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, lyrics, or "
 "backdrops, within the music folder, and you do not have write access to this "
@@ -4152,9 +4441,18 @@ msgid ""
 "will only be accessible to yourself.</i>"
 msgstr ""
 
-#. i18n: file: gui/filesettings.ui:145
+#. i18n: file: gui/filesettings.ui:108
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:428 rc.cpp:428
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. (i.e. 'Artist/Album/Tracks')"
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:140
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:431 rc.cpp:431
 msgid ""
 "<i><b>NOTE:</b> If you change the location where streams are stored (i.e. "
 "you toggle the 'Save list of favorite streams in music folder' option), then "
@@ -4166,19 +4464,19 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:370 rc.cpp:370
+#: po/rc.cpp:434 rc.cpp:434
 msgid "Cantata First Run"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:373 rc.cpp:373
+#: po/rc.cpp:437 rc.cpp:437
 msgid "Welcome to Cantata"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:440 rc.cpp:440
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4191,13 +4489,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:379 rc.cpp:379
+#: po/rc.cpp:443 rc.cpp:443
 msgid "<html><head/><body><p>Welcome to Cantata</p></body></html>"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:128
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:382 rc.cpp:382
+#: po/rc.cpp:446 rc.cpp:446
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4208,13 +4506,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:166
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:385 rc.cpp:385
+#: po/rc.cpp:449 rc.cpp:449
 msgid "Standard multi-user/server setup"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:179
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:388 rc.cpp:388
+#: po/rc.cpp:452 rc.cpp:452
 msgid ""
 "<i>Select this option if your music collection is shared between users, your "
 "MPD instance is running on another machine, or you already have a personal "
@@ -4225,13 +4523,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:211
 #. i18n: ectx: property (text), widget (QRadioButton, basic)
-#: po/rc.cpp:391 rc.cpp:391
+#: po/rc.cpp:455 rc.cpp:455
 msgid "Basic single user setup"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:224
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
-#: po/rc.cpp:394 rc.cpp:394
+#: po/rc.cpp:458 rc.cpp:458
 msgid ""
 "<i>Select this option if your music collection is not shared with others, "
 "and you wish Cantata to configure and control the MPD instance.</i>"
@@ -4239,7 +4537,7 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:397 rc.cpp:397
+#: po/rc.cpp:461 rc.cpp:461
 msgid ""
 "<html><head/><body><p>For more information on MPD itself, please refer to "
 "the MPD website <a href=\"http://www.musicpd.org\"><span style=\" text-"
@@ -4250,13 +4548,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:400 rc.cpp:400
+#: po/rc.cpp:464 rc.cpp:464
 msgid "Connection details"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:341
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:403 rc.cpp:403
+#: po/rc.cpp:467 rc.cpp:467
 msgid ""
 "The settings below are the basic settings required by Cantata. Please enter "
 "the relevant details, and use the 'Connect' button to test the connection."
@@ -4270,16 +4568,17 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: gui/serversettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
-#: po/rc.cpp:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
+#: po/rc.cpp:470 po/rc.cpp:796 rc.cpp:470 rc.cpp:796
 msgid "Host (or local socket):"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:494
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:421 rc.cpp:421
+#: po/rc.cpp:485 rc.cpp:485
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
-"lyrics, etc.</i>"
+"lyrics, etc. If you're MPD instance is on a remote host, you may set this to "
+"a HTTP URL.</i>"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:520
@@ -4290,7 +4589,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
 #. i18n: file: gui/serversettings.ui:225
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#: po/rc.cpp:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
+#: po/rc.cpp:488 po/rc.cpp:820 rc.cpp:488 rc.cpp:820
 msgid ""
 "<i><b>NOTE:</b> When using a local socket the full absolute path to the "
 "socket needs to be set. (Port number is not required.)</i>"
@@ -4298,25 +4597,25 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:553
 #. i18n: ectx: property (text), widget (QLabel, label_13)
-#: po/rc.cpp:427 rc.cpp:427
+#: po/rc.cpp:491 rc.cpp:491
 msgid "Music folder"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:576
 #. i18n: ectx: property (text), widget (QLabel, label_12)
-#: po/rc.cpp:430 rc.cpp:430
+#: po/rc.cpp:494 rc.cpp:494
 msgid "Please choose the folder containing your music collection."
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:662
 #. i18n: ectx: property (text), widget (QLabel, label_6f)
-#: po/rc.cpp:436 rc.cpp:436
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Covers, Lyrics, and Streams"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:685
 #. i18n: ectx: property (text), widget (QLabel, label_5f)
-#: po/rc.cpp:439 rc.cpp:439
+#: po/rc.cpp:503 rc.cpp:503
 msgid ""
 "<p>Cantata will download missing covers, and lyrics, from the internet. "
 "Cantata also allows you to save a list of internet streams (e.g. Radio "
@@ -4325,9 +4624,9 @@ msgid ""
 "music folder, or within your personal cache/config folders.</p>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: file: gui/initialsettingswizard.ui:758
 #. i18n: ectx: property (text), widget (QLabel, persNote)
-#: po/rc.cpp:454 rc.cpp:454
+#: po/rc.cpp:518 rc.cpp:518
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
 "the music folder, and you do not have write access to this folder, then "
@@ -4339,33 +4638,42 @@ msgid ""
 "be accessible to yourself.</i>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:824
-#. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:457 rc.cpp:457
+#. i18n: file: gui/initialsettingswizard.ui:784
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:521 rc.cpp:521
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. i.e. 'Artist/Album/Tracks'."
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/initialsettingswizard.ui:810
+#. i18n: ectx: property (text), widget (StateLabel, httpNote)
+#: po/rc.cpp:524 rc.cpp:524
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata "
 "currently cannot upload files to external HTTP servers. Therefore, the above "
-"settings should be left disabled.</i>"
+"settings should be left un-checked.</i>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:857
+#. i18n: file: gui/initialsettingswizard.ui:843
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:460 rc.cpp:460
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Finished!"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:880
+#. i18n: file: gui/initialsettingswizard.ui:866
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:463 rc.cpp:463
+#: po/rc.cpp:530 rc.cpp:530
 msgid ""
 "Cantata is now configured! If you wish to further configure Cantata (to add "
 "extra MPD hosts, etc) then Canta's configuration dialog may be accessed from "
 "the menu triggered by the button in the top-right of Cantata's main window."
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:918
+#. i18n: file: gui/initialsettingswizard.ui:904
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:466 rc.cpp:466
+#: po/rc.cpp:533 rc.cpp:533
 msgid ""
 "<b>Warning:</b> You are not currently a member of the 'users' group. Cantata "
 "will function better (saving of album covers, lyrics, etc. with the correct "
@@ -4374,284 +4682,392 @@ msgid ""
 "effect."
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:36
+#. i18n: ectx: attribute (title), widget (QWidget, sidebarTab)
+#: po/rc.cpp:536 rc.cpp:536
+msgid "Sidebar"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:42
+#. i18n: ectx: property (title), widget (QGroupBox, viewsGroup)
+#: po/rc.cpp:539 rc.cpp:539
+msgid "Views"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:48
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:542 rc.cpp:542
+msgid "Use the checkboxes below to configure the list of active views."
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, sbPlayQueueLabel)
+#: po/rc.cpp:545 rc.cpp:545
+msgid ""
+"<i><b>NOTE:</b> By default, the play queue appears to the side of the other "
+"views. If you enable the option above, then it will be merged into the "
+"sidebar as per other views.</i>"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:106
+#. i18n: ectx: property (text), widget (StateLabel, sbInfoLabel)
+#: po/rc.cpp:548 rc.cpp:548
+msgid ""
+"<i><b>NOTE:</b> By default, the 'Info' (current song information) view is "
+"accessible by pressing its icon in the main toolbar. If you enable the "
+"option above, then it will be merged into the sidebar as per other views.</i>"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:144
+#. i18n: ectx: property (text), widget (BuddyLabel, sbPositionLabel)
+#: po/rc.cpp:557 rc.cpp:557
+msgid "Position:"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:157
+#. i18n: ectx: property (text), widget (QCheckBox, sbIconsOnly)
+#: po/rc.cpp:560 rc.cpp:560
+msgid "Only show icons, no text"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, sbMonoIcons)
+#: po/rc.cpp:563 rc.cpp:563
+msgid "Use monochrome icons"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, sbAutoHide)
+#: po/rc.cpp:566 rc.cpp:566
+msgid "Auto-hide"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#: po/rc.cpp:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
+#: po/rc.cpp:575 po/rc.cpp:594 rc.cpp:575 rc.cpp:594
 msgid "Covers:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:478 rc.cpp:478
-msgid "Show artist images:"
+#. i18n: file: gui/interfacesettings.ui:219
+#. i18n: ectx: property (text), widget (QCheckBox, libraryArtistImage)
+#: po/rc.cpp:578 rc.cpp:578
+msgid "Show artist images"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:81
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:481 rc.cpp:481
-msgid "Show album year:"
+#. i18n: file: gui/interfacesettings.ui:226
+#. i18n: ectx: property (text), widget (QCheckBox, libraryYear)
+#: po/rc.cpp:581 rc.cpp:581
+msgid "Show album year"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:123
+#. i18n: file: gui/interfacesettings.ui:258
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:484 rc.cpp:484
+#: po/rc.cpp:584 rc.cpp:584
 msgid ""
 "<i><b>NOTE:</b> When looking for artist images, Cantata will look for either "
 "artist.jpg, artist.png, 'Artist'.jpg, or 'Artist'.png,\n"
 "within the folder of the current track, or within its parent folder. If no "
-"image is found, Cantata will attempt to download one. When the image is "
-"displayed, it will be cropped (either top/bottom, or left/right) to provide "
-"a square image.</i>"
+"image is found, Cantata will attempt to download one.</i>"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:172
+#. i18n: file: gui/interfacesettings.ui:307
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:497 rc.cpp:497
+#: po/rc.cpp:597 rc.cpp:597
 msgid "Sort albums:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:183
+#. i18n: file: gui/interfacesettings.ui:318
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:500 rc.cpp:500
+#: po/rc.cpp:600 rc.cpp:600
 msgid "Album/Artist"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:188
+#. i18n: file: gui/interfacesettings.ui:323
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:503 rc.cpp:503
+#: po/rc.cpp:603 rc.cpp:603
 msgid "Artist/Album"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: file: gui/interfacesettings.ui:328
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:506 rc.cpp:506
+#: po/rc.cpp:606 rc.cpp:606
 msgid "Artist/Year/Album"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#: po/rc.cpp:515 po/rc.cpp:545 rc.cpp:515 rc.cpp:545
-msgid "Initially collapse albums:"
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#: po/rc.cpp:615 po/rc.cpp:645 rc.cpp:615 rc.cpp:645
+msgid "Initially collapse albums"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:242
+#. i18n: file: gui/interfacesettings.ui:367
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:518 rc.cpp:518
+#: po/rc.cpp:618 rc.cpp:618
 msgid "Other Views"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:251
+#. i18n: file: gui/interfacesettings.ui:376
 #. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
-#: po/rc.cpp:521 rc.cpp:521
+#: po/rc.cpp:621 rc.cpp:621
 msgid "Folder view style:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:264
+#. i18n: file: gui/interfacesettings.ui:389
 #. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
-#: po/rc.cpp:524 rc.cpp:524
+#: po/rc.cpp:624 rc.cpp:624
 msgid "Streams view style:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:277
+#. i18n: file: gui/interfacesettings.ui:402
 #. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
-#: po/rc.cpp:527 rc.cpp:527
+#: po/rc.cpp:627 rc.cpp:627
 msgid "Online view style:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:290
+#. i18n: file: gui/interfacesettings.ui:415
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:530 rc.cpp:530
+#: po/rc.cpp:630 rc.cpp:630
 msgid "Devices view style:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:324
-#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:539 rc.cpp:539
-msgid "Table"
+#. i18n: file: gui/interfacesettings.ui:469
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueAutoExpand)
+#: po/rc.cpp:648 rc.cpp:648
+msgid "Automatically expand current album"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:354
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueAutoExpandLabel)
-#: po/rc.cpp:548 rc.cpp:548
-msgid "Automatically expand current album:"
+#. i18n: file: gui/interfacesettings.ui:476
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueScroll)
+#: po/rc.cpp:651 rc.cpp:651
+msgid "Scroll to current track"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:371
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueScrollLabel)
-#: po/rc.cpp:551 rc.cpp:551
-msgid "Scroll to current track:"
+#. i18n: file: gui/interfacesettings.ui:483
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueConfirmClear)
+#: po/rc.cpp:654 rc.cpp:654
+msgid "Prompt before clearing"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:384
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueBackgroundLabel)
-#: po/rc.cpp:554 rc.cpp:554
-msgid "Use current album cover as background:"
-msgstr ""
-
-#. i18n: file: gui/interfacesettings.ui:397
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueConfirmClearLabel)
-#: po/rc.cpp:557 rc.cpp:557
-msgid "Prompt before clearing:"
+#. i18n: file: gui/interfacesettings.ui:509
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_cover)
+#: po/rc.cpp:663 rc.cpp:663
+msgid "Current album cover"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:411
+#. i18n: file: gui/interfacesettings.ui:638
 #. i18n: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:560 rc.cpp:560
+#: po/rc.cpp:682 rc.cpp:682
 msgid "External"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:417
-#. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:563 rc.cpp:563
-msgid "Show icon in notification area:"
+#. i18n: file: gui/interfacesettings.ui:644
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayPopup)
+#: po/rc.cpp:685 rc.cpp:685
+msgid "Show popup messages when changing tracks"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:437
-#. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:566 rc.cpp:566
-msgid "Minimize to notification area when closed:"
+#. i18n: file: gui/interfacesettings.ui:654
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayCheckBox)
+#: po/rc.cpp:688 rc.cpp:688
+msgid "Show icon in notification area"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:664
+#. i18n: ectx: property (text), widget (QCheckBox, minimiseOnClose)
+#: po/rc.cpp:691 rc.cpp:691
+msgid "Minimize to notification area when closed"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:671
+#. i18n: ectx: property (title), widget (QGroupBox, startupState)
+#: po/rc.cpp:694 rc.cpp:694
+msgid "On Start-up"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:677
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateShow)
+#: po/rc.cpp:697 rc.cpp:697
+msgid "Show main window"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:457
-#. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:569 rc.cpp:569
-msgid "Show popup messages when changing tracks:"
+#. i18n: file: gui/interfacesettings.ui:684
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateHide)
+#: po/rc.cpp:700 rc.cpp:700
+msgid "Hide main window"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:475
+#. i18n: file: gui/interfacesettings.ui:691
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateRestore)
+#: po/rc.cpp:703 rc.cpp:703
+msgid "Restore previous state"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:715
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:572 rc.cpp:572
+#: po/rc.cpp:706 rc.cpp:706
 msgid "General"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:486
-#. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:575 rc.cpp:575
-msgid "Group single track albums:"
+#. i18n: file: gui/interfacesettings.ui:726
+#. i18n: ectx: property (text), widget (QCheckBox, groupSingle)
+#: po/rc.cpp:709 rc.cpp:709
+msgid "Group single track albums"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:503
-#. i18n: ectx: property (text), widget (BuddyLabel, useComposerLabel)
-#: po/rc.cpp:578 rc.cpp:578
-msgid "Group albums by composer:"
+#. i18n: file: gui/interfacesettings.ui:733
+#. i18n: ectx: property (text), widget (QCheckBox, useComposer)
+#: po/rc.cpp:712 rc.cpp:712
+msgid "Group albums by composer"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:520
-#. i18n: ectx: property (text), widget (BuddyLabel, groupMultipleLabel)
-#: po/rc.cpp:581 rc.cpp:581
-msgid "Multiple artist albums:"
+#. i18n: file: gui/interfacesettings.ui:740
+#. i18n: ectx: property (text), widget (QCheckBox, groupMultiple)
+#: po/rc.cpp:715 rc.cpp:715
+msgid "Group multiple artist albums under 'Various Artists'"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:533
-#. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:584 rc.cpp:584
-msgid "Show delete action in context menus:"
+#. i18n: file: gui/interfacesettings.ui:747
+#. i18n: ectx: property (text), widget (QCheckBox, fetchCovers)
+#: po/rc.cpp:718 rc.cpp:718
+msgid "Fetch missing covers from Last.fm"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:754
+#. i18n: ectx: property (text), widget (QCheckBox, cacheScaledCovers)
+#: po/rc.cpp:721 rc.cpp:721
+msgid "Cache scaled covers"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:761
+#. i18n: ectx: property (text), widget (QCheckBox, showDeleteAction)
+#: po/rc.cpp:724 rc.cpp:724
+msgid "Show delete action in context menus"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:768
+#. i18n: ectx: property (text), widget (QCheckBox, forceSingleClick)
+#: po/rc.cpp:727 rc.cpp:727
+msgid "Enforce single-click activation of items"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:550
-#. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:587 rc.cpp:587
-msgid "Enforce single-click activation of items:"
+#. i18n: file: gui/interfacesettings.ui:775
+#. i18n: ectx: property (text), widget (BuddyLabel, langLabel)
+#: po/rc.cpp:730 rc.cpp:730
+msgid "Language:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:591
+#. i18n: file: gui/interfacesettings.ui:806
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:590 rc.cpp:590
+#: po/rc.cpp:733 rc.cpp:733
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
 msgstr ""
 
-#. i18n: file: gui/mainwindow.ui:287
+#. i18n: file: gui/interfacesettings.ui:835
+#. i18n: ectx: property (text), widget (StateLabel, langNoteLabel)
+#: po/rc.cpp:736 rc.cpp:736
+msgid ""
+"<i><b>NOTE:</b> Changing the language setting will require a re-start of "
+"Cantata.</i>"
+msgstr ""
+
+#. i18n: file: gui/mainwindow.ui:298
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:593 rc.cpp:593
+#: po/rc.cpp:739 rc.cpp:739
 msgid "[Dynamic]"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:20
-#. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:596 rc.cpp:596
-msgid "Output"
+#. i18n: file: gui/playbacksettings.ui:38
+#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
+#: po/rc.cpp:745 rc.cpp:745
+msgid "Fadeout on stop:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:41
-#. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:602 rc.cpp:602
-msgid "Crossfading:"
+#. i18n: file: gui/playbacksettings.ui:48
+#. i18n: ectx: property (suffix), widget (QSpinBox, stopFadeDuration)
+#: po/rc.cpp:748 rc.cpp:748
+msgid " ms"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:51
-#. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:605 rc.cpp:605
-msgid " seconds"
+#. i18n: file: gui/playbacksettings.ui:58
+#. i18n: ectx: property (text), widget (QCheckBox, stopOnExit)
+#: po/rc.cpp:754 rc.cpp:754
+msgid "Stop playback on exit"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:61
-#. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:608 rc.cpp:608
-msgid "Replay gain:"
+#. i18n: file: gui/playbacksettings.ui:65
+#. i18n: ectx: property (text), widget (QCheckBox, stopDynamizerOnExit)
+#: po/rc.cpp:757 rc.cpp:757
+msgid "Stop dynamizer on exit"
+msgstr ""
+
+#. i18n: file: gui/playbacksettings.ui:72
+#. i18n: ectx: property (text), widget (QCheckBox, inhibitSuspend)
+#: po/rc.cpp:760 rc.cpp:760
+msgid "Inhibit suspend whilst playing"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:95
-#. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:611 rc.cpp:611
-msgid "About replay gain"
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:763 rc.cpp:763
+msgid ""
+"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
+"shown allowing you to choose whether to stop playback now, or after the "
+"current track.</i>"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:104
-#. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:614 rc.cpp:614
-msgid "Devices:"
+#. i18n: file: gui/playbacksettings.ui:108
+#. i18n: ectx: property (title), widget (QGroupBox, outputBox)
+#: po/rc.cpp:766 rc.cpp:766
+msgid "Output"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:141
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:620 rc.cpp:620
-msgid "Fadeout on stop:"
+#. i18n: file: gui/playbacksettings.ui:129
+#. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
+#: po/rc.cpp:772 rc.cpp:772
+msgid "Crossfade between tracks:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:623 rc.cpp:623
-msgid "Stop playback on exit:"
+#. i18n: file: gui/playbacksettings.ui:139
+#. i18n: ectx: property (suffix), widget (QSpinBox, crossfading)
+#: po/rc.cpp:775 rc.cpp:775
+msgid " s"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:626 rc.cpp:626
-msgid "Stop dynamizer on exit:"
+#. i18n: file: gui/playbacksettings.ui:152
+#. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
+#: po/rc.cpp:781 rc.cpp:781
+msgid "Replay gain:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:184
-#. i18n: ectx: property (text), widget (BuddyLabel, inhibitSuspendLabel)
-#: po/rc.cpp:629 rc.cpp:629
-msgid "Inhibit suspend whilst playing:"
+#. i18n: file: gui/playbacksettings.ui:195
+#. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
+#: po/rc.cpp:784 rc.cpp:784
+msgid "About replay gain"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:217
-#. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:632 rc.cpp:632
-msgid ""
-"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
-"shown allowing you to choose whether to stop playback now, or after the "
-"current track.</i>"
+#. i18n: file: gui/playbacksettings.ui:204
+#. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
+#: po/rc.cpp:787 rc.cpp:787
+msgid "Use the checkboxes below to control the active outputs."
 msgstr ""
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:635 rc.cpp:635
+#: po/rc.cpp:790 rc.cpp:790
 msgid "Collection:"
 msgstr ""
 
@@ -4663,25 +5079,25 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
 #. i18n: file: gui/serversettings.ui:338
 #. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
-#: po/rc.cpp:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
+#: po/rc.cpp:808 po/rc.cpp:829 rc.cpp:808 rc.cpp:829
 msgid "Cover filename:"
 msgstr ""
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:656 rc.cpp:656
+#: po/rc.cpp:811 rc.cpp:811
 msgid "Dynamizer port:"
 msgstr ""
 
 #. i18n: file: gui/serversettings.ui:168
 #. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
-#: po/rc.cpp:659 rc.cpp:659
+#: po/rc.cpp:814 rc.cpp:814
 msgid "HTTP stream URL:"
 msgstr ""
 
 #. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:662 rc.cpp:662
+#: po/rc.cpp:817 rc.cpp:817
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art "
 "(either the value specified above, or <code>cover.jpg / cover.png</code> if "
@@ -4692,7 +5108,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:277
 #. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
-#: po/rc.cpp:668 rc.cpp:668
+#: po/rc.cpp:823 rc.cpp:823
 msgid ""
 "<i><b>NOTE:</b> 'HTTP Stream URL' is only of use if you have MPD configured "
 "to output to a HTTP stream, and you wish Cantata to be able to play that "
@@ -4701,7 +5117,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:677 rc.cpp:677
+#: po/rc.cpp:832 rc.cpp:832
 msgid ""
 "<i><b>NOTE:</b> If you change the 'Music folder' setting, then you will need "
 "to manually update the music database. This can be performed by pressing the "
@@ -4710,7 +5126,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:379
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel_2)
-#: po/rc.cpp:680 rc.cpp:680
+#: po/rc.cpp:835 rc.cpp:835
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -4718,19 +5134,13 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:683 rc.cpp:683
+#: po/rc.cpp:838 rc.cpp:838
 msgid "Network interface:"
 msgstr ""
 
-#. i18n: file: http/httpserversettings.ui:38
-#. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:686 rc.cpp:686
-msgid "Current URL:"
-msgstr ""
-
-#. i18n: file: http/httpserversettings.ui:73
+#. i18n: file: http/httpserversettings.ui:57
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:689 rc.cpp:689
+#: po/rc.cpp:841 rc.cpp:841
 msgid ""
 "<i><b>NOTE:</b> MPD usually only plays songs that are stored within its "
 "folders. Cantata contains a minimal HTTP server that can be used to serve "
@@ -4742,33 +5152,31 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:693 rc.cpp:693
+#: po/rc.cpp:845 rc.cpp:845
 msgid "Mode:"
 msgstr ""
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:699 rc.cpp:699
+#: po/rc.cpp:851 rc.cpp:851
 msgid "HTTP Proxy"
 msgstr ""
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:702 rc.cpp:702
+#: po/rc.cpp:854 rc.cpp:854
 msgid "SOCKS Proxy"
 msgstr ""
 
 #. i18n: file: online/onlinesettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:717 rc.cpp:717
-msgid ""
-"The following is a list of online providers, to hide a provider simply un-"
-"check its entry in this list."
+#: po/rc.cpp:869 rc.cpp:869
+msgid "Use the checkboxes below to configure the list of active services."
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:723 rc.cpp:723
+#: po/rc.cpp:875 rc.cpp:875
 msgid ""
 "You can listen for free without an account, but Premium members can listen "
 "to higher quality streams without advertisements. Visit <a href=\"http://www."
@@ -4778,38 +5186,38 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:726 rc.cpp:726
+#: po/rc.cpp:878 rc.cpp:878
 msgid "Premium Account"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:735 rc.cpp:735
+#: po/rc.cpp:887 rc.cpp:887
 msgid "Stream type:"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:738 rc.cpp:738
+#: po/rc.cpp:890 rc.cpp:890
 msgid "Status:"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:109
 #. i18n: ectx: property (text), widget (QPushButton, loginButton)
-#: po/rc.cpp:741 streams/digitallyimportedsettings.cpp:130
-#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
+#: po/rc.cpp:893 streams/digitallyimportedsettings.cpp:131
+#: streams/digitallyimportedsettings.cpp:137 rc.cpp:893
 msgid "Login"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:747 rc.cpp:747
+#: po/rc.cpp:899 rc.cpp:899
 msgid "Session expiry:"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:151
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:750 rc.cpp:750
+#: po/rc.cpp:902 rc.cpp:902
 msgid ""
 "<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
 "RockRadio.com, and Sky.fm</i>"
@@ -4817,7 +5225,7 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:161
 #. i18n: ectx: property (text), widget (QLabel, note2Label)
-#: po/rc.cpp:753 rc.cpp:753
+#: po/rc.cpp:905 rc.cpp:905
 msgid ""
 "<i><b>NOTE:</b> If you enter account details, then a 'DI' status item will "
 "appear under the list of streams. This will indicate if you are logged in or "
@@ -4826,27 +5234,25 @@ msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:756 rc.cpp:756
-msgid ""
-"The following is a list of the top-level stream categories, to hide a "
-"category simply un-check its entry in this list."
+#: po/rc.cpp:908 rc.cpp:908
+msgid "Use the checkboxes below to configure the list of active providers."
 msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: po/rc.cpp:759 rc.cpp:759
+#: po/rc.cpp:911 rc.cpp:911
 msgid "Configure Provider"
 msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, installButton)
-#: po/rc.cpp:762 rc.cpp:762
+#: po/rc.cpp:914 rc.cpp:914
 msgid "Install"
 msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:80
 #. i18n: ectx: property (text), widget (QLabel, note)
-#: po/rc.cpp:768 rc.cpp:768
+#: po/rc.cpp:920 rc.cpp:920
 msgid ""
 "<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
 "removed.</i>"
@@ -4854,184 +5260,178 @@ msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:771 rc.cpp:771
+#: po/rc.cpp:923 rc.cpp:923
 msgid "Search:"
 msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:65
 #. i18n: ectx: property (title), widget (QGroupBox, actionBox)
-#: po/rc.cpp:774 rc.cpp:774
+#: po/rc.cpp:926 rc.cpp:926
 msgid "Shortcut for Selected Action"
 msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:71
 #. i18n: ectx: property (text), widget (QRadioButton, useDefault)
-#: po/rc.cpp:777 rc.cpp:777
+#: po/rc.cpp:929 rc.cpp:929
 msgid "Default:"
 msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:85
 #. i18n: ectx: property (text), widget (QRadioButton, useCustom)
-#: po/rc.cpp:783 rc.cpp:783
+#: po/rc.cpp:935 rc.cpp:935
 msgid "Custom:"
 msgstr ""
 
-#. i18n: file: tags/tageditor.ui:25
-#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:786 rc.cpp:786
-msgid "Track:"
-msgstr ""
-
 #. i18n: file: tags/tageditor.ui:64
 #. i18n: ectx: property (text), widget (StateLabel, albumArtistLabel)
-#: po/rc.cpp:795 rc.cpp:795
+#: po/rc.cpp:947 rc.cpp:947
 msgid "Album artist:"
 msgstr ""
 
 #. i18n: file: tags/tageditor.ui:103
 #. i18n: ectx: property (text), widget (StateLabel, trackLabel)
-#: po/rc.cpp:804 rc.cpp:804
+#: po/rc.cpp:956 rc.cpp:956
 msgid "Track number:"
 msgstr ""
 
 #. i18n: file: tags/tageditor.ui:116
 #. i18n: ectx: property (text), widget (StateLabel, discLabel)
-#: po/rc.cpp:807 rc.cpp:807
+#: po/rc.cpp:959 rc.cpp:959
 msgid "Disc number:"
 msgstr ""
 
-#. i18n: file: tags/trackorganiser.ui:155
+#. i18n: file: tags/trackorganiser.ui:115
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:834 rc.cpp:834
+#: po/rc.cpp:989 rc.cpp:989
 msgid "Original Name"
 msgstr ""
 
-#. i18n: file: tags/trackorganiser.ui:160
+#. i18n: file: tags/trackorganiser.ui:120
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:837 rc.cpp:837
+#: po/rc.cpp:992 rc.cpp:992
 msgid "New Name"
 msgstr ""
 
-#: po/rc.cpp:838 rc.cpp:838
+#: po/rc.cpp:996 rc.cpp:996
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr ""
 
-#: po/rc.cpp:839 rc.cpp:839
+#: po/rc.cpp:997 rc.cpp:997
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:121
+#: replaygain/rgdialog.cpp:116
 msgid "Show All Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:122
+#: replaygain/rgdialog.cpp:117
 msgid "Show Untagged Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:124 tags/trackorganiser.cpp:79
 msgid "Remove From List"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:136
+#: replaygain/rgdialog.cpp:131
 msgid "Album Gain"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:137
+#: replaygain/rgdialog.cpp:132
 msgid "Track Gain"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:138
+#: replaygain/rgdialog.cpp:133
 msgid "Album Peak"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:139
+#: replaygain/rgdialog.cpp:134
 msgid "Track Peak"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
+#: replaygain/rgdialog.cpp:154 replaygain/rgdialog.cpp:283
 msgid "Scan"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:238
+#: replaygain/rgdialog.cpp:233
 msgid "Update ReplayGain tags in tracks?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
+#: replaygain/rgdialog.cpp:233 replaygain/rgdialog.cpp:234
 msgid "Update Tags"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:252
+#: replaygain/rgdialog.cpp:247
 msgid "Abort scanning of tracks?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:261
+#: replaygain/rgdialog.cpp:256
 msgid "Abort reading of existing tags?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:287
+#: replaygain/rgdialog.cpp:282
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:289
+#: replaygain/rgdialog.cpp:284
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "Untagged Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "All Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:300
+#: replaygain/rgdialog.cpp:295
 msgid "Scanning tracks..."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:367
+#: replaygain/rgdialog.cpp:362
 msgid "Reading existing tags..."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+#: replaygain/rgdialog.cpp:414 tags/tageditor.cpp:798
 msgctxt "filename (Timeout)"
 msgid "%1 (Timeout)"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:802
 msgctxt "filename (Corrupt tags?)"
 msgid "%1 (Corrupt tags?)"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
+#: replaygain/rgdialog.cpp:432 tags/tageditor.cpp:812
 msgid "Failed to update the tags of the following tracks:"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
-#: tags/trackorganiser.cpp:451
+#: replaygain/rgdialog.cpp:473 tags/tageditor.cpp:885
+#: tags/trackorganiser.cpp:483
 msgid "Device is not connected."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
-#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
+#: replaygain/rgdialog.cpp:513 replaygain/rgdialog.cpp:520
+#: replaygain/rgdialog.cpp:599 replaygain/rgdialog.cpp:601
 msgid "%1 dB"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:520 replaygain/rgdialog.cpp:521
-#: replaygain/rgdialog.cpp:527 replaygain/rgdialog.cpp:528
-#: replaygain/rgdialog.cpp:579 replaygain/rgdialog.cpp:580
-#: replaygain/rgdialog.cpp:581 replaygain/rgdialog.cpp:582
+#: replaygain/rgdialog.cpp:516 replaygain/rgdialog.cpp:517
+#: replaygain/rgdialog.cpp:523 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:575 replaygain/rgdialog.cpp:576
+#: replaygain/rgdialog.cpp:577 replaygain/rgdialog.cpp:578
 msgid "Failed"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
+#: replaygain/rgdialog.cpp:651 tags/trackorganiser.cpp:428
 msgid "Remove the selected tracks from the list?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
+#: replaygain/rgdialog.cpp:652 tags/trackorganiser.cpp:429
 msgid "Remove Tracks"
 msgstr ""
 
@@ -5051,19 +5451,19 @@ msgstr ""
 msgid "AAC 128k"
 msgstr ""
 
-#: streams/digitallyimportedsettings.cpp:109
+#: streams/digitallyimportedsettings.cpp:110
 msgid "Logged out"
 msgstr ""
 
-#: streams/digitallyimportedsettings.cpp:112
+#: streams/digitallyimportedsettings.cpp:113
 msgid "Logging in..."
 msgstr ""
 
-#: streams/digitallyimportedsettings.cpp:136
+#: streams/digitallyimportedsettings.cpp:137
 msgid "Logout"
 msgstr ""
 
-#: streams/streamdialog.cpp:71
+#: streams/streamdialog.cpp:72
 msgid "URL:"
 msgstr ""
 
@@ -5087,7 +5487,7 @@ msgstr ""
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr ""
 
-#: streams/streamfetcher.cpp:205
+#: streams/streamfetcher.cpp:209
 msgid "Fetching %1"
 msgstr ""
 
@@ -5103,89 +5503,89 @@ msgstr ""
 msgid "Add New Stream To Favorites"
 msgstr ""
 
-#: streams/streamspage.cpp:124
+#: streams/streamspage.cpp:125
 msgctxt "Service name"
 msgid "Digitally Imported"
 msgstr ""
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:243
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
+#: streams/streamspage.cpp:243 streams/streamspage.cpp:245
 msgid "Import Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:245
+#: streams/streamspage.cpp:246
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr ""
 
-#: streams/streamspage.cpp:253
+#: streams/streamspage.cpp:254
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr ""
 
-#: streams/streamspage.cpp:265
+#: streams/streamspage.cpp:266
 msgid "*.xml|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
+#: streams/streamspage.cpp:266 streams/streamspage.cpp:268
 msgid "Export Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:267
+#: streams/streamspage.cpp:268
 msgid "XML Streams (*.xml)"
 msgstr ""
 
-#: streams/streamspage.cpp:279
+#: streams/streamspage.cpp:280
 msgid "Failed to create <b>%1</b>!"
 msgstr ""
 
-#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
+#: streams/streamspage.cpp:297 streams/streamspage.cpp:493
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr ""
 
-#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
+#: streams/streamspage.cpp:299 streams/streamspage.cpp:495
 msgid "A stream named <b>%1</b> already exists!"
 msgstr ""
 
-#: streams/streamspage.cpp:318
+#: streams/streamspage.cpp:319
 msgid "Bookmark added"
 msgstr ""
 
-#: streams/streamspage.cpp:320
+#: streams/streamspage.cpp:321
 msgid "Already bookmarked"
 msgstr ""
 
-#: streams/streamspage.cpp:366
+#: streams/streamspage.cpp:367
 msgid "Added to favorites"
 msgstr ""
 
-#: streams/streamspage.cpp:368
+#: streams/streamspage.cpp:369
 msgid "Already in favorites"
 msgstr ""
 
-#: streams/streamspage.cpp:393
+#: streams/streamspage.cpp:394
 msgid "Reload <b>%1</b> streams?"
 msgstr ""
 
-#: streams/streamspage.cpp:411
+#: streams/streamspage.cpp:412
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr ""
 
-#: streams/streamspage.cpp:417
+#: streams/streamspage.cpp:418
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr ""
 
-#: streams/streamspage.cpp:445
+#: streams/streamspage.cpp:446
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr ""
 
-#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
+#: streams/streamspage.cpp:450 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr ""
 
-#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+#: streams/streamspage.cpp:561 streams/streamspage.cpp:577
 msgid "Search %1:"
 msgstr ""
 
@@ -5225,139 +5625,90 @@ msgstr ""
 msgid "Failed to remove streams folder!"
 msgstr ""
 
-#: support/dialog.cpp:89
+#: support/dialog.cpp:73
 msgid "&OK"
 msgstr ""
 
-#: support/dialog.cpp:90
+#: support/dialog.cpp:74
 msgid "&Cancel"
 msgstr ""
 
-#: support/dialog.cpp:91
+#: support/dialog.cpp:75
 msgid "&Yes"
 msgstr ""
 
-#: support/dialog.cpp:92
+#: support/dialog.cpp:76
 msgid "&No"
 msgstr ""
 
-#: support/dialog.cpp:93
+#: support/dialog.cpp:77
 msgid "&Discard"
 msgstr ""
 
-#: support/dialog.cpp:94
+#: support/dialog.cpp:78
 msgid "&Save"
 msgstr ""
 
-#: support/dialog.cpp:95
+#: support/dialog.cpp:79
 msgid "&Apply"
 msgstr ""
 
-#: support/dialog.cpp:96
+#: support/dialog.cpp:80
 msgid "&Close"
 msgstr ""
 
-#: support/dialog.cpp:98
+#: support/dialog.cpp:82
 msgid "&Overwrite"
 msgstr ""
 
-#: support/dialog.cpp:99
+#: support/dialog.cpp:83
 msgid "&Reset"
 msgstr ""
 
-#: support/dialog.cpp:100
+#: support/dialog.cpp:84
 msgid "&Continue"
 msgstr ""
 
-#: support/dialog.cpp:101
+#: support/dialog.cpp:85
 msgid "&Delete"
 msgstr ""
 
-#: support/dialog.cpp:102
+#: support/dialog.cpp:86
 msgid "&Stop"
 msgstr ""
 
-#: support/dialog.cpp:103
+#: support/dialog.cpp:87
 msgid "&Remove"
 msgstr ""
 
-#: support/dialog.cpp:104
+#: support/dialog.cpp:88
 msgid "&Previous"
 msgstr ""
 
-#: support/dialog.cpp:105
+#: support/dialog.cpp:89
 msgid "&Next"
 msgstr ""
 
-#: support/fancytabwidget.cpp:957
-msgid "Icons Only"
-msgstr ""
-
-#: support/fancytabwidget.cpp:958
-msgid "Style"
-msgstr ""
-
-#: support/fancytabwidget.cpp:959
-msgid "Large Sidebar"
-msgstr ""
-
-#: support/fancytabwidget.cpp:960
-msgid "Small Sidebar"
-msgstr ""
-
-#: support/fancytabwidget.cpp:961
-msgid "Top Bar"
-msgstr ""
-
-#: support/fancytabwidget.cpp:962
-msgid "Bottom Bar"
-msgstr ""
-
-#: support/fancytabwidget.cpp:963
-msgid "Tabs On Side"
-msgstr ""
-
-#: support/fancytabwidget.cpp:964
-msgid "Tabs On Top"
-msgstr ""
-
-#: support/fancytabwidget.cpp:965
-msgid "Tabs On Bottom"
-msgstr ""
-
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Password"
 msgstr ""
 
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Please enter password:"
 msgstr ""
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:123
+#: support/messagebox.cpp:50 support/messagebox.cpp:124
 msgid "Warning"
 msgstr ""
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:118
+#: support/messagebox.cpp:50 support/messagebox.cpp:119
 msgid "Question"
 msgstr ""
 
-#: support/messagebox.cpp:107 support/messagebox.cpp:113
-#: support/messagebox.h:62
-msgid "Error"
-msgstr ""
-
 #: support/messagebox.h:65
 msgid "Information"
 msgstr ""
 
-#: support/onoffbutton.cpp:47
-msgid "ON"
-msgstr ""
-
-#: support/onoffbutton.cpp:48
-msgid "OFF"
-msgstr ""
-
 #: support/pathrequester.cpp:50
 msgid "Select Folder"
 msgstr ""
@@ -5400,133 +5751,137 @@ msgid_plural "%1 days %2"
 msgstr[0] ""
 msgstr[1] ""
 
-#: tags/tageditor.cpp:134
+#: tags/tageditor.cpp:147
 msgid "Tags"
 msgstr ""
 
-#: tags/tageditor.cpp:147
+#: tags/tageditor.cpp:160
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr ""
 
-#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
+#: tags/tageditor.cpp:261 tags/tageditor.cpp:592
 msgid "All tracks"
 msgstr ""
 
-#: tags/tageditor.cpp:295
+#: tags/tageditor.cpp:323
 msgid "(Various)"
 msgstr ""
 
-#: tags/tageditor.cpp:336
+#: tags/tageditor.cpp:368
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:378
+#: tags/tageditor.cpp:410
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:428
+#: tags/tageditor.cpp:460
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:429
+#: tags/tageditor.cpp:461
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr ""
 
-#: tags/tageditor.cpp:430
+#: tags/tageditor.cpp:462
 msgid "Album Artist from Artist"
 msgstr ""
 
-#: tags/tageditor.cpp:463
+#: tags/tageditor.cpp:495
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:496
+#: tags/tageditor.cpp:528
 msgid "Adjust the value of each track number by:"
 msgstr ""
 
-#: tags/tageditor.cpp:554
+#: tags/tageditor.cpp:586
 msgid "All tracks [modified]"
 msgstr ""
 
-#: tags/tageditor.cpp:556
+#: tags/tageditor.cpp:588
 msgid "%1 [modified]"
 msgstr ""
 
-#: tags/tageditor.cpp:783
+#: tags/tageditor.cpp:827
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr ""
 
-#: tags/tageditor.cpp:784
+#: tags/tageditor.cpp:828
 msgid "Rename Files"
 msgstr ""
 
-#: tags/trackorganiser.cpp:150
+#: tags/trackorganiser.cpp:164
 msgid "Abort renaming of files?"
 msgstr ""
 
-#: tags/trackorganiser.cpp:263
+#: tags/trackorganiser.cpp:279
 msgid "Source file does not exist!<br/>%1"
 msgstr ""
 
-#: tags/trackorganiser.cpp:282
+#: tags/trackorganiser.cpp:298
 msgid "Destination file already exists!<br/>%1"
 msgstr ""
 
-#: tags/trackorganiser.cpp:304
+#: tags/trackorganiser.cpp:320
 msgid "Failed to create destination folder!<br/>%1"
 msgstr ""
 
-#: tags/trackorganiser.cpp:325
+#: tags/trackorganiser.cpp:341
 msgid "Failed to rename %1 to %2"
 msgstr ""
 
-#: widgets/coverwidget.cpp:267
+#: widgets/coverwidget.cpp:280
 msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
 msgstr ""
 
-#: widgets/coverwidget.cpp:269
+#: widgets/coverwidget.cpp:282
 msgid ""
 "<tr><td align=\"right\"><b>Artist:</b></td><td>%1</td></tr><tr><td align="
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Year:"
 "</b></td><td>%3</td></tr>"
 msgstr ""
 
-#: widgets/genrecombo.cpp:54
+#: widgets/genrecombo.cpp:44
+msgid "Filter On Genre"
+msgstr ""
+
+#: widgets/genrecombo.cpp:66
 msgid "All Genres"
 msgstr ""
 
-#: widgets/groupedview.cpp:267
+#: widgets/groupedview.cpp:265
 msgctxt "album (albumYear)"
 msgid "%1 (%2)"
 msgstr ""
 
-#: widgets/groupedview.cpp:269
+#: widgets/groupedview.cpp:267
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr ""
 
-#: widgets/itemview.cpp:480
+#: widgets/itemview.cpp:561
 msgid "Go Back"
 msgstr ""
 
-#: widgets/itemview.cpp:485
+#: widgets/itemview.cpp:566
 msgid "Go Home"
 msgstr ""
 
-#: widgets/menubutton.cpp:36
+#: widgets/menubutton.cpp:39
 msgid "Menu"
 msgstr ""
 
-#: widgets/searchwidget.cpp:62
+#: widgets/searchwidget.cpp:63
 msgid "Search..."
 msgstr ""
 
-#: widgets/searchwidget.cpp:66
+#: widgets/searchwidget.cpp:67
 msgid "Close Search Bar"
 msgstr ""
 
@@ -5538,40 +5893,36 @@ msgstr ""
 msgid "<b>NOT</b> logged into %1"
 msgstr ""
 
-#: widgets/songdialog.cpp:48
+#: widgets/songdialog.cpp:49
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
 "\" setting, and MPD's \"music_directory\" setting.</p>"
 msgstr ""
 
-#: widgets/songdialog.cpp:51
+#: widgets/songdialog.cpp:52
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check that the device is still "
 "attached.</p>"
 msgstr ""
 
-#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:115 widgets/volumeslider.cpp:230
+#: widgets/volumeslider.cpp:237
 msgid "Mute"
 msgstr ""
 
-#: widgets/volumeslider.cpp:199
+#: widgets/volumeslider.cpp:198
 msgid "Muted"
 msgstr ""
 
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:237
 msgid "Unmute"
 msgstr ""
 
-#: widgets/volumeslider.cpp:276
-msgid "Volume Disabled"
-msgstr ""
-
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1% (Muted)"
 msgstr ""
 
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1%"
 msgstr ""
  
diff --git a/po/cs.po b/po/cs.po
index 2c2d090..45c7c4f 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -1,14 +1,14 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 #
-# Pavel Fric <pavelfric at seznam.cz>, 2011, 2012, 2013.
+# Pavel Fric <pavelfric at seznam.cz>, 2011, 2012, 2013, 2014.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-14 20:26+0000\n"
-"PO-Revision-Date: 2013-11-22 22:25+0100\n"
-"Last-Translator: Pavel Fric <pavelfric at seznam.cz>\n"
+"POT-Creation-Date: 2014-02-02 20:02+0000\n"
+"PO-Revision-Date: 2014-02-07 16:49+0100\n"
+"Last-Translator: Pavel\n"
 "Language-Team: Czech <kde-i18n-doc at kde.org>\n"
 "Language: cs\n"
 "MIME-Version: 1.0\n"
@@ -23,14 +23,13 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "Obnovit informace o albu"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:307
-#: gui/cachesettings.cpp:262
+#: context/albumview.cpp:71 gui/cachesettings.cpp:269
 msgid "Album Information"
 msgstr "Informace o albu"
 
-#. i18n: file: devices/albumdetails.ui:143
+#. i18n: file: devices/albumdetails.ui:136
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
+#: context/albumview.cpp:175 po/rc.cpp:107 rc.cpp:107
 msgid "Tracks"
 msgstr "Skladby"
 
@@ -38,22 +37,22 @@ msgstr "Skladby"
 msgid "Refresh Artist Information"
 msgstr "Obnovit informace o umělci"
 
-#: context/artistview.cpp:92 context/contextwidget.cpp:306
-#: gui/cachesettings.cpp:260
+#: context/artistview.cpp:92 gui/cachesettings.cpp:267
 msgid "Artist Information"
 msgstr "Informace o umělci"
 
-#. i18n: file: gui/interfacesettings.ui:137
+#. i18n: file: gui/interfacesettings.ui:272
 #. i18n: ectx: attribute (title), widget (QWidget, tab_2)
-#: context/artistview.cpp:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
+#: context/artistview.cpp:314 gui/interfacesettings.cpp:106
+#: gui/mainwindow.cpp:308 po/rc.cpp:588 rc.cpp:588
 msgid "Albums"
 msgstr "Alba"
 
-#: context/artistview.cpp:333
+#: context/artistview.cpp:337
 msgid "Web Links"
 msgstr "Internetové odkazy"
 
-#: context/artistview.cpp:419
+#: context/artistview.cpp:424
 msgid "Similar Artists"
 msgstr "Podobní umělci"
 
@@ -61,23 +60,30 @@ msgstr "Podobní umělci"
 msgid "Lyrics Providers"
 msgstr "Poskytovatelé textů písní"
 
-#: context/contextsettings.cpp:37
+#: context/contextsettings.cpp:37 gui/cachesettings.cpp:278
 msgid "Wikipedia Languages"
 msgstr "Jazyky Wikipedie"
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
-#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1388
+#: models/streamsmodel.cpp:1434 models/streamsmodel.cpp:1642
 msgid "Other"
 msgstr "Jiné"
 
-#: context/contextwidget.cpp:98
+#: context/contextwidget.cpp:293
 msgid "Reset Spacing"
 msgstr "Nastavit znovu řádkování"
 
-#: context/contextwidget.cpp:308 context/songview.cpp:105
-#: gui/cachesettings.cpp:259
-msgid "Lyrics"
-msgstr "Slova písně"
+#: context/contextwidget.cpp:506
+msgid "&Artist"
+msgstr "&Umělec"
+
+#: context/contextwidget.cpp:507
+msgid "Al&bum"
+msgstr "&Album"
+
+#: context/contextwidget.cpp:508
+msgid "&Lyrics"
+msgstr "&Slova písně"
 
 #: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
@@ -101,37 +107,38 @@ msgstr ""
 "Pokud toto vyhledávání nenalezne nová slova, tato pořád budou spojena s "
 "původním názvem písně a umělcem, jak je zobrazen v Cantatě."
 
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#: context/lyricsdialog.cpp:64 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
-#: rc.cpp:61 rc.cpp:304 rc.cpp:789
+#: context/lyricsdialog.cpp:64 gui/searchpage.cpp:204 po/rc.cpp:92
+#: po/rc.cpp:377 po/rc.cpp:941 rc.cpp:92 rc.cpp:377 rc.cpp:941
 msgid "Title:"
 msgstr "Název:"
 
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#: context/lyricsdialog.cpp:66 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
-#: rc.cpp:55 rc.cpp:292 rc.cpp:792
+#: context/lyricsdialog.cpp:66 devices/actiondialog.cpp:800
+#: gui/searchpage.cpp:197 po/rc.cpp:86 po/rc.cpp:362 po/rc.cpp:944 rc.cpp:86
+#: rc.cpp:362 rc.cpp:944
 msgid "Artist:"
 msgstr "Umělec:"
 
@@ -143,95 +150,123 @@ msgstr "Hledat slova písně"
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "Vyberte stránky, které chcete použít při hledání textů písní."
 
-#: context/lyricsettings.cpp:66
-msgid "(Polish Translations)"
-msgstr "Polština"
+#: context/othersettings.cpp:45 gui/coverdialog.cpp:877
+#: gui/interfacesettings.cpp:174
+msgid "Images (*.png *.jpg)"
+msgstr "Obrázky (*.png *.jpg)"
 
-#: context/lyricsettings.cpp:67
-msgid "(Portuguese Translations)"
-msgstr "Portugalština"
+#: context/othersettings.cpp:47 gui/interfacesettings.cpp:176
+msgctxt "pixels"
+msgid "10px"
+msgstr "10 px"
+
+#: context/othersettings.cpp:102 gui/interfacesettings.cpp:524
+msgctxt "value%"
+msgid "%1%"
+msgstr "%1%"
+
+#: context/othersettings.cpp:107 gui/interfacesettings.cpp:529
+#, c-format
+msgctxt "pixels"
+msgid "%1px"
+msgstr "%1px"
 
-#: context/songview.cpp:89
+#: context/songview.cpp:90
 msgid "Refresh Lyrics"
 msgstr "Obnovit slova písně"
 
-#: context/songview.cpp:90
+#: context/songview.cpp:91
 msgid "Edit Lyrics"
 msgstr "Upravit slova písně"
 
-#: context/songview.cpp:91
+#: context/songview.cpp:92
 msgid "Save Lyrics"
 msgstr "Uložit slova písně"
 
-#: context/songview.cpp:92
+#: context/songview.cpp:93
 msgid "Cancel Editing Lyrics"
 msgstr "Zrušit upravování slov písně"
 
-#: context/songview.cpp:93
+#: context/songview.cpp:94
 msgid "Delete Lyrics File"
 msgstr "Smazat soubor se slovy písně"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:106 gui/cachesettings.cpp:266
+msgid "Lyrics"
+msgstr "Slova písně"
+
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort editing of lyrics?"
 msgstr "Přerušit upravování slov písně?"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort Editing"
 msgstr "Přerušit upravování"
 
-#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
-#: replaygain/rgdialog.cpp:252 replaygain/rgdialog.cpp:253
-#: replaygain/rgdialog.cpp:261 replaygain/rgdialog.cpp:262
-#: tags/trackorganiser.cpp:150
+#: context/songview.cpp:120 context/songview.cpp:139 context/songview.cpp:198
+#: replaygain/rgdialog.cpp:247 replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:256 replaygain/rgdialog.cpp:257
+#: tags/trackorganiser.cpp:164
 msgid "Abort"
 msgstr "Přerušit"
 
-#: context/songview.cpp:121
+#: context/songview.cpp:122
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr "Smazat uloženou kopii slov písně a stáhnout znovu?"
 
-#: context/songview.cpp:121 context/songview.cpp:122
-#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
+#: context/songview.cpp:122 context/songview.cpp:123
+#: online/onlineservicespage.cpp:458 online/onlineservicespage.cpp:459
 msgid "Re-download"
 msgstr "Stáhnout znovu"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Current playing song has changed, still perform search?"
 msgstr "Nyní hrající píseň se změnila. Pořád ještě provést hledání?"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Song Changed"
 msgstr "Píseň změněna"
 
-#: context/songview.cpp:148
+#: context/songview.cpp:149
 msgid "Perform Search"
 msgstr "Provést hledání"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save updated lyrics?"
 msgstr "Uložit obnovená slova písně?"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save"
 msgstr "Uložit"
 
-#: context/songview.cpp:185
+#: context/songview.cpp:186
 msgid "Failed to save lyrics."
 msgstr "Nepodařilo se uložit slova písně"
 
-#: context/songview.cpp:207
+#: context/songview.cpp:208
 msgid "Delete lyrics file?"
 msgstr "Smazat soubor se slovy písně?"
 
-#: context/songview.cpp:207 gui/mainwindow.cpp:292
-#: widgets/messageoverlay.cpp:43
-msgid "Cancel"
-msgstr "Zrušit"
+#: context/songview.cpp:208
+msgid "Delete File"
+msgstr "Smazat soubor"
 
-#: context/songview.cpp:431
+#: context/songview.cpp:462
 msgid "Fetching lyrics via %1"
 msgstr "Natahují se slova písně přes %1"
 
+#: context/ultimatelyricsprovider.cpp:200
+msgid "(Polish Translations)"
+msgstr "Polština"
+
+#: context/ultimatelyricsprovider.cpp:201
+msgid "(Portuguese Translations)"
+msgstr "Portugalština"
+
+#: context/view.cpp:91 gui/mainwindow.cpp:328 widgets/messageoverlay.cpp:44
+msgid "Cancel"
+msgstr "Zrušit"
+
 #: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "Seznam skladeb"
@@ -254,7 +289,7 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "album|hudba|zvukový záznam"
 
-#: context/wikipediasettings.cpp:99
+#: context/wikipediasettings.cpp:114
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
@@ -262,8 +297,8 @@ msgstr ""
 "Vyberte jazyky na Wikipedii, které chcete použít při hledání umělců a "
 "informací o albech"
 
-#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
-#: online/podcastsearchdialog.cpp:393
+#: context/wikipediasettings.cpp:115 models/streamsmodel.cpp:598
+#: online/podcastsearchdialog.cpp:404
 msgid "Reload"
 msgstr "Nahrát znovu"
 
@@ -271,37 +306,54 @@ msgstr "Nahrát znovu"
 msgid "Cantata is playing a track"
 msgstr "Cantata přehrává skladbu"
 
-#: devices/actiondialog.cpp:76
+#: devices/actiondialog.cpp:83
 msgid "Songs To Be Copied"
 msgstr "Písně ke zkopírování"
 
-#: devices/actiondialog.cpp:146
+#: devices/actiondialog.cpp:153
 msgid "<b>INVALID</b>"
 msgstr "<b>NEPLATNÝ</b>"
 
-#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
+#: devices/actiondialog.cpp:167 devices/actiondialog.cpp:170
 msgid "<i>(When different)</i>"
 msgstr "<i>(Když jiný)</i>"
 
-#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:185 tags/tageditor.cpp:713
+#: tags/trackorganiser.cpp:444
+msgid ""
+"Cantata has detected that you are connected to a Mopidy server.\n"
+"\n"
+"Currently it is not possible for Cantata to force Mopidy to refresh its "
+"local music listing. Therefore, you will need to stop Cantata, manually "
+"refresh Mopidy's database, and restart Cantata for any changes to be active."
+msgstr ""
+"Cantata zjistila, že jste se spojil se serverem Mopidy.\n"
+"\n"
+"V současnosti není pro Cantatu možné přinutit Mopidy k obnově svého "
+"seznamu s místní hudbou. Z toho důvodu je třeba, abyste Cantatu zastavil, "
+"ručně "
+"obnovil databázi Mopidy a spustil Cantatu znovu, aby se změny uvedly v "
+"činnost."
+
+#: devices/actiondialog.cpp:211 devices/synccollectionwidget.cpp:274
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "Umělci:%1, Alba:%2, Písně:%3"
 
-#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
-#: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
+#: devices/actiondialog.cpp:271 devices/mtpdevice.cpp:1622
+#: devices/remotefsdevice.cpp:571 devices/umsdevice.cpp:103
 msgid "%1 free"
 msgstr "%1 volno"
 
-#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
+#: devices/actiondialog.cpp:284 devices/actiondialog.cpp:288
 msgid "Local Music Library"
 msgstr "Místní hudební knihovna"
 
-#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
+#: devices/actiondialog.cpp:286 devices/albumdetailsdialog.cpp:104
+#: gui/preferencesdialog.cpp:115 widgets/groupedview.cpp:251
 msgid "Audio CD"
 msgstr "Audio CD"
 
-#: devices/actiondialog.cpp:293
+#: devices/actiondialog.cpp:309
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -313,7 +365,7 @@ msgstr ""
 "Písně bude třeba překódovat na menší velikost souborů, aby mohly být úspěšně "
 "zkopírovány."
 
-#: devices/actiondialog.cpp:300
+#: devices/actiondialog.cpp:316
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -321,32 +373,32 @@ msgstr ""
 "V cíli nezbývá dost místa.\n"
 "Vybrané písně zabírají %1, ale zbývá jen %2."
 
-#: devices/actiondialog.cpp:349
+#: devices/actiondialog.cpp:365
 msgid "Copy Songs"
 msgstr "Kopírovat písně"
 
-#: devices/actiondialog.cpp:349 devices/devicespage.cpp:503
-#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: devices/actiondialog.cpp:365 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:214 gui/folderpage.cpp:270 gui/librarypage.cpp:257
 #: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "Smazat písně"
 
-#: devices/actiondialog.cpp:380
+#: devices/actiondialog.cpp:402
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
 msgstr ""
 "<p>Nenastavil jste cílové zařízení.<br/>Pokračovat s výchozím nastavením?</p>"
 
-#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
+#: devices/actiondialog.cpp:403 devices/actiondialog.cpp:407
 msgid "Not Configured"
 msgstr "Nenastaveno"
 
-#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
+#: devices/actiondialog.cpp:404 devices/actiondialog.cpp:408
 msgid "Use Defaults"
 msgstr "Použít výchozí nastavení"
 
-#: devices/actiondialog.cpp:384
+#: devices/actiondialog.cpp:406
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
@@ -354,224 +406,231 @@ msgstr ""
 "<p>Nenastavil jste zdrojové zařízení.<br/>Pokračovat s výchozím nastavením?</"
 "p>"
 
-#: devices/actiondialog.cpp:446
+#: devices/actiondialog.cpp:468
 msgid "Are you sure you wish to stop?"
 msgstr "Opravdu chcete zastavit?"
 
-#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
+#: devices/actiondialog.cpp:468 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "Zastavit"
 
-#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
-#: tags/trackorganiser.cpp:446
+#: devices/actiondialog.cpp:513 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:468 tags/tageditor.cpp:880
+#: tags/trackorganiser.cpp:478
 msgid "Device has been removed!"
 msgstr "Zařízení bylo odstraněno!"
 
-#: devices/actiondialog.cpp:491
+#: devices/actiondialog.cpp:515
 msgid "Device is not connected!"
 msgstr "Zařízení není připojeno!"
 
-#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
-#: tags/trackorganiser.cpp:456
+#: devices/actiondialog.cpp:517 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:478 tags/tageditor.cpp:890
+#: tags/trackorganiser.cpp:488
 msgid "Device is busy?"
 msgstr "Zařízení je zaneprázdněno?"
 
-#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:519 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "Zařízení bylo změněno?"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:586
 msgid "Clearing unused folders"
 msgstr "Uklízí se nepoužívané složky"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "Spočítat vyrovnání hlasitosti skladeb pro vytažené skladby?"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "ReplyGain"
 msgstr "Vyrovnání hlasitosti"
 
-#: devices/actiondialog.cpp:578
+#: devices/actiondialog.cpp:602
 msgid "Calculate"
 msgstr "Spočítat"
 
-#: devices/actiondialog.cpp:634
-msgid "The destination filename already exists!<hr/>%1"
-msgstr "Souborový název cíle již existuje!<hr/>%1"
+#: devices/actiondialog.cpp:661
+msgid "The destination filename already exists!"
+msgstr "Cílový souborový název již existuje!"
 
-#: devices/actiondialog.cpp:637
-msgid "Song already exists!<hr/>%1"
-msgstr "Píseň již existuje!<hr/>%1"
+#: devices/actiondialog.cpp:664
+msgid "Song already exists!"
+msgstr "Píseň již existuje!"
 
-#: devices/actiondialog.cpp:640
-msgid "Song does not exist!<hr/>%1"
-msgstr "Píseň neexistuje!<hr/>%1"
+#: devices/actiondialog.cpp:667
+msgid "Song does not exist!"
+msgstr "Píseň neexistuje!"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:670
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
-"permissions.<hr/>%1"
+"permissions."
 msgstr ""
 "Nepodařilo se vytvořit cílovou složku!<br/>Prověřte, prosím, zda máte "
-"dostatečná oprávnění.<hr/>%1"
+"dostatečná oprávnění."
 
-#: devices/actiondialog.cpp:646
-msgid "Source file no longer exists?<br/><br/<hr/>%1"
-msgstr "Zdrojový soubor už neexistuje?<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:673
+msgid "Source file no longer exists?"
+msgstr "Zdrojový soubor už neexistuje?"
 
-#: devices/actiondialog.cpp:649
-msgid "Failed to copy.<hr/>%1"
-msgstr "Nepodařilo se zkopírovat.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to copy."
+msgstr "Nepodařilo se zkopírovat."
 
-#: devices/actiondialog.cpp:650
-msgid "Failed to delete.<hr/>%1"
-msgstr "Nepodařilo se smazat.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to delete."
+msgstr "Nepodařilo se smazat."
 
-#: devices/actiondialog.cpp:653
-msgid "Not connected to device.<hr/>%1"
-msgstr "Nepřipojeno k zařízení.<hr/>%1"
+#: devices/actiondialog.cpp:679
+msgid "Not connected to device."
+msgstr "Nepřipojeno k zařízení."
 
-#: devices/actiondialog.cpp:656
-msgid "Selected codec is not available.<hr/>%1"
-msgstr "Vybraný kodek není dostupný.<hr/>%1"
+#: devices/actiondialog.cpp:682
+msgid "Selected codec is not available."
+msgstr "Vybraný kodek není dostupný."
 
-#: devices/actiondialog.cpp:659
-msgid "Transcoding failed.<br/><br/<hr/>%1"
-msgstr "Překódování se nezdařilo.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:685
+msgid "Transcoding failed."
+msgstr "Překódování se nezdařilo."
 
-#: devices/actiondialog.cpp:662
+#: devices/actiondialog.cpp:688
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
-"devices.)<hr/>%1"
+"devices.)"
 msgstr ""
 "Nepodařilo se vytvořit dočasný soubor.<br/>(Požadováno pro překódování na "
-"zařízení MTP.)<hr/>%1"
+"zařízení MTP.)"
 
-#: devices/actiondialog.cpp:665
-msgid "Failed to read source file.<br/><br/<hr/>%1"
-msgstr "Nepodařilo se přečíst zdrojový soubor.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:691
+msgid "Failed to read source file."
+msgstr "Nepodařilo se přečíst zdrojový soubor."
 
-#: devices/actiondialog.cpp:668
-msgid "Failed to write to destination file.<br/><br/<hr/>%1"
-msgstr "Nepodařilo se  zapsat do cílového souboru.<br/>%1"
+#: devices/actiondialog.cpp:694
+msgid "Failed to write to destination file."
+msgstr "Nepodařilo se  zapsat do cílového souboru."
 
-#: devices/actiondialog.cpp:671
-msgid "No space left on device.<br/><br/<hr/>%1"
-msgstr "Na zařízení není žádné místo.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:697
+msgid "No space left on device."
+msgstr "Na zařízení není žádné místo."
 
-#: devices/actiondialog.cpp:674
-msgid "Failed to update metadata.<br/><br/<hr/>%1"
-msgstr "Nepodařilo se zaktualizovat popisná data.<hr/>%1"
+#: devices/actiondialog.cpp:700
+msgid "Failed to update metadata."
+msgstr "Nepodařilo se zaktualizovat popisná data."
 
-#: devices/actiondialog.cpp:677
-msgid "Failed to download track.<br/><br/<hr/>%1"
-msgstr "Nepodařilo se stáhnout skladbu.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:703
+msgid "Failed to download track."
+msgstr "Nepodařilo se stáhnout skladbu."
 
-#: devices/actiondialog.cpp:680
-msgid "Failed to lock device.<hr/>%1"
-msgstr "Nepodařilo se uzamknout zařízení.<hr/>%1"
+#: devices/actiondialog.cpp:706
+msgid "Failed to lock device."
+msgstr "Nepodařilo se uzamknout zařízení."
 
-#: devices/actiondialog.cpp:709
+#: devices/actiondialog.cpp:735
 msgid "Local Music Library Properties"
 msgstr "Vlastnosti místní hudební knihovny"
 
-#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
-msgid "<b>Error</b><br/>"
-msgstr "<b>Chyba</b><br/>"
+#: devices/actiondialog.cpp:776 devices/actiondialog.cpp:790
+#: support/messagebox.cpp:108 support/messagebox.cpp:114
+#: support/messagebox.h:62
+msgid "Error"
+msgstr "Chyba"
 
-#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:780 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Skip"
 msgstr "Přeskočit"
 
-#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:781 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Auto Skip"
 msgstr "Automaticky přeskočit"
 
-#: devices/actiondialog.cpp:759
+#: devices/actiondialog.cpp:785
 msgid "Retry"
 msgstr "Zkusit znovu"
 
-#: devices/actiondialog.cpp:774
-msgid ""
-"<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
-"td></tr>"
-msgstr ""
-"<tr><td align=\"right\">Umělec:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Skladba:</td><td>%3</"
-"td></tr>"
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#: devices/actiondialog.cpp:801 gui/searchpage.cpp:203 po/rc.cpp:374
+#: po/rc.cpp:953 rc.cpp:374 rc.cpp:953
+msgid "Album:"
+msgstr "Album:"
 
-#: devices/actiondialog.cpp:781
-msgid ""
-"<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
-"\"right\">Destination file:</td><td>%2</td></tr>"
-msgstr ""
-"<tr><td align=\"right\">Zdrojový soubor:</td><td>%1</td></tr><tr><td align="
-"\"right\">Cílový soubor:</td><td>%2</td></tr>"
+#. i18n: file: tags/tageditor.ui:25
+#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
+#: devices/actiondialog.cpp:802 po/rc.cpp:938 rc.cpp:938
+msgid "Track:"
+msgstr "Skladba:"
 
-#: devices/actiondialog.cpp:786
-msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
-msgstr "<tr><td align=\"right\">Soubor:</td><td>%1</td></tr>"
+#: devices/actiondialog.cpp:806
+msgid "Source file:"
+msgstr "Zdrojový soubor:"
 
-#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
-#: gui/cachesettings.cpp:230
+#: devices/actiondialog.cpp:807
+msgid "Destination file:"
+msgstr "Cílový soubor:"
+
+#: devices/actiondialog.cpp:809 gui/searchpage.cpp:207
+msgid "File:"
+msgstr "Soubor:"
+
+#: devices/actiondialog.cpp:815 gui/cachesettings.cpp:179
+#: gui/cachesettings.cpp:235
 msgid "Calculating..."
-msgstr "Připojuje se..."
+msgstr "Počítá se..."
 
-#: devices/actiondialog.cpp:799
+#: devices/actiondialog.cpp:822
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (odhadováno)"
 
-#: devices/actiondialog.cpp:802
-msgid ""
-"<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
-"i></tr>"
-msgstr ""
-"<tr><i><td align=\"right\"><i>Zbývající čas:</i></td><td><i>%5</i></td></i></"
-"tr>"
+#: devices/actiondialog.cpp:824
+msgid "Time remaining:"
+msgstr "Zbývající čas:"
 
-#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: devices/actiondialog.cpp:847 devices/fsdevice.cpp:762
 #: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "Ukládá se vyrovnávací paměť"
 
-#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
+#: devices/albumdetailsdialog.cpp:139 devices/albumdetailsdialog.cpp:236
+#: tags/tageditor.cpp:158 tags/tageditor.cpp:373
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "Použít zařazení pod Různí umělci"
 
-#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
+#: devices/albumdetailsdialog.cpp:140 devices/albumdetailsdialog.cpp:260
+#: tags/tageditor.cpp:159 tags/tageditor.cpp:418
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "Zvrátit zařazení pod Různí umělci"
 
-#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
-#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
+#: devices/albumdetailsdialog.cpp:141 devices/albumdetailsdialog.cpp:278
+#: tags/tageditor.cpp:161 tags/tageditor.cpp:499
 msgid "Capitalize"
 msgstr "Psát velkými písmeny"
 
-#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
-#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
+#: devices/albumdetailsdialog.cpp:142 devices/albumdetailsdialog.cpp:295
+#: tags/tageditor.cpp:162 tags/tageditor.cpp:528
 msgid "Adjust Track Numbers"
 msgstr "Upravit čísla skladeb"
 
-#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
+#: devices/albumdetailsdialog.cpp:144 tags/tageditor.cpp:156
 msgid "Tools"
 msgstr "Nástroje"
 
-#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:369
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "Použít zařazení pod Různí umělci?"
 
-#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
+#: devices/albumdetailsdialog.cpp:234 tags/tageditor.cpp:371
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -579,11 +638,11 @@ msgstr ""
 "<i>Toto nastaví Umělce alba a Umělce na Různí umělci, a nastaví Název na "
 "\"Umělec skladby - Název skladby\"</i>"
 
-#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:411
 msgid "Revert \"Various Artists\" workaround"
 msgstr "Zvrátit zařazení pod Různí umělci"
 
-#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
+#: devices/albumdetailsdialog.cpp:255 tags/tageditor.cpp:413
 msgid ""
 "<i>Where the 'Album artist' is the same as 'Artist' and the 'Title' is of "
 "the format \"TrackArtist - TrackTitle\", 'Artist' will be taken from 'Title' "
@@ -596,36 +655,26 @@ msgstr ""
 "nastaví na prostý Název. Např. <br/><br/>Pokud je Název \"Wibble - Wobble\", "
 "pak Umělec se nastaví na \"Wibble\" a Název na \"Wobble\"</i>"
 
-#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
+#: devices/albumdetailsdialog.cpp:261 tags/tageditor.cpp:419
 msgid "Revert"
 msgstr "Vrátit"
 
-#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
+#: devices/albumdetailsdialog.cpp:277 tags/tageditor.cpp:497
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr "Psát velkým písmenem první písmeno Názvu, Umělce, Umělce alba a Alba"
 
-#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
+#: devices/albumdetailsdialog.cpp:295 tags/tageditor.cpp:529
 msgid "Adjust track number by:"
 msgstr "Upravit číslo skladby o:"
 
-#: devices/albumdetailsdialog.cpp:335 devices/cddbinterface.cpp:143
-#: devices/deviceoptions.cpp:358 devices/musicbrainz.cpp:202
-#: devices/musicbrainz.cpp:324 gui/mainwindow.cpp:1771 gui/mainwindow.cpp:1784
-#: models/musiclibraryitemroot.cpp:362 models/musiclibraryitemroot.cpp:520
-#: models/playqueuemodel.cpp:325 mpd/mpdparseutils.cpp:249
-#: mpd/mpdparseutils.cpp:409 mpd/song.cpp:228 mpd/song.cpp:233
-#: mpd/song.cpp:272 mpd/song.cpp:299 widgets/groupedview.cpp:260
-msgid "Unknown"
-msgstr "Neznámý"
-
 #: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "Čte se disk"
 
-#: devices/audiocddevice.cpp:353 gui/mainwindow.cpp:2199
-#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
-#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
+#: devices/audiocddevice.cpp:358 gui/mainwindow.cpp:2345
+#: gui/searchpage.cpp:220 models/albumsmodel.cpp:245 models/musicmodel.cpp:217
+#: models/playlistsmodel.cpp:309 models/playlistsmodel.cpp:324
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "Jedna skladba (%2)"
@@ -649,7 +698,7 @@ msgid "Failed to open CD device"
 msgstr "Nepodařilo se otevřít zařízení CD"
 
 #: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
-#: devices/musicbrainz.cpp:217
+#: devices/musicbrainz.cpp:216
 msgid "Track %1"
 msgstr "Stopa %1"
 
@@ -670,19 +719,19 @@ msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr ""
 "Bylo nalezeno více shod. Vyberte, prosím, náležitou shodu z uvedených níže:"
 
-#. i18n: file: devices/albumdetails.ui:170
+#. i18n: file: devices/albumdetails.ui:163
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:66
-#: models/playqueuemodel.cpp:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
-#: rc.cpp:82
+#: models/playqueuemodel.cpp:106 po/rc.cpp:113 replaygain/rgdialog.cpp:128
+#: rc.cpp:113
 msgid "Artist"
 msgstr "Umělec"
 
-#. i18n: file: devices/albumdetails.ui:175
+#. i18n: file: devices/albumdetails.ui:168
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:76
-#: models/playqueuemodel.cpp:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
-#: rc.cpp:85
+#: models/playqueuemodel.cpp:105 po/rc.cpp:116 replaygain/rgdialog.cpp:130
+#: rc.cpp:116
 msgid "Title"
 msgstr "Název"
 
@@ -759,7 +808,7 @@ msgstr ""
 "skutečného umělce ze značky 'Název' a odstranit umělcovo jméno ze značky "
 "'Název'.</p>"
 
-#: devices/devicepropertieswidget.cpp:99
+#: devices/devicepropertieswidget.cpp:98
 msgid ""
 "<p>If you enable this, then Cantata will create a cache of the device's "
 "music library. This will help to speed up subsequent library scans (as the "
@@ -778,19 +827,19 @@ msgstr ""
 "odstranění souboru s vyrovnávací pamětí a opětovné znovuprohledání obsahu "
 "zařízení.</p>"
 
-#: devices/devicepropertieswidget.cpp:204
+#: devices/devicepropertieswidget.cpp:209
 msgid "Do not transcode"
 msgstr "Nepřekódovat"
 
-#: devices/devicepropertieswidget.cpp:212
+#: devices/devicepropertieswidget.cpp:216
 msgid "Encoder"
 msgstr "Kodér"
 
-#: devices/devicepropertieswidget.cpp:228
+#: devices/devicepropertieswidget.cpp:231
 msgid "Transcode to %1"
 msgstr "Překódovat do %1"
 
-#: devices/devicepropertieswidget.cpp:259
+#: devices/devicepropertieswidget.cpp:262
 msgctxt "name (size free)"
 msgid "%1 (%2 free)"
 msgstr "%1 (%2 volné)"
@@ -803,11 +852,11 @@ msgstr "Kopírovat do knihovny"
 msgid "Sync"
 msgstr "Seřídit"
 
-#: devices/devicespage.cpp:71
+#: devices/devicespage.cpp:70
 msgid "Forget Device"
 msgstr "Zapomenout zařízení"
 
-#: devices/devicespage.cpp:114 devices/remotedevicepropertiesdialog.cpp:60
+#: devices/devicespage.cpp:113 devices/remotedevicepropertiesdialog.cpp:60
 msgid "Add Device"
 msgstr "Přidat zařízení"
 
@@ -816,7 +865,7 @@ msgid "Lookup album and track details?"
 msgstr "Vyhledat podrobnosti alba a skladby?"
 
 #: devices/devicespage.cpp:433 devices/devicespage.cpp:445
-#: devices/devicespage.cpp:455
+#: devices/devicespage.cpp:455 gui/mainwindow.cpp:589
 msgid "Refresh"
 msgstr "Obnovit"
 
@@ -846,8 +895,8 @@ msgstr "Částečný"
 msgid "Full"
 msgstr "Úplný"
 
-#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
-#: gui/librarypage.cpp:257
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:213 gui/folderpage.cpp:269
+#: gui/librarypage.cpp:256
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -875,11 +924,11 @@ msgstr "Opravdu chcete odpojit <b>%1</b>?"
 msgid "Disconnect"
 msgstr "Odpojit"
 
-#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1220
 msgid "Please close other dialogs first."
 msgstr "Nejprve, prosím, zavřete další dialogy"
 
-#: devices/encoders.cpp:77
+#: devices/encoders.cpp:78
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -895,7 +944,7 @@ msgstr ""
 "MP3. Je rozumnou volbou pro iPod a některé další přenosné přehrávače hudby. "
 "Provedení není zdarma."
 
-#: devices/encoders.cpp:82
+#: devices/encoders.cpp:83
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>AAC</b> encoder used by Cantata supports a <a "
@@ -923,24 +972,25 @@ msgstr ""
 "dobu skladby.<br>Z tohoto důvodu je měřítko datového toku v tomto posuvníku "
 "jen odhadem <a href=http://www.ffmpeg.org/faq.html#SEC21>průměrného datového "
 "toku</a> kódované skladby.<br><b>150 kb/s</b> je dobrou volbou pro poslech "
-"hudby v přenosném přehrávači.<br/>Cokoli pod <b>120 kb/s</b> může být hudebně "
-"neuspokojivé a cokoli nad <b>200 kb/s</b> je pravděpodobně až přespříliš."
+"hudby v přenosném přehrávači.<br/>Cokoli pod <b>120 kb/s</b> může být "
+"hudebně neuspokojivé a cokoli nad <b>200 kb/s</b> je pravděpodobně až "
+"přespříliš."
 
-#: devices/encoders.cpp:100 devices/encoders.cpp:140
+#: devices/encoders.cpp:101 devices/encoders.cpp:141
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr "Očekávaný datový tok pro kódování proměnlivého datového toku"
 
-#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
-#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:293 devices/encoders.cpp:329
 msgid "Smaller file"
 msgstr "Menší soubor"
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:233 devices/encoders.cpp:329
+#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
+#: devices/encoders.cpp:234 devices/encoders.cpp:330
 msgid "Better sound quality"
 msgstr "Lepší kvalita zvuku"
 
-#: devices/encoders.cpp:119
+#: devices/encoders.cpp:120
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -956,7 +1006,7 @@ msgstr ""
 "spotřebitelské ukládání zvuku a je široce podporován v přenosných "
 "přehrávačích hudby."
 
-#: devices/encoders.cpp:123
+#: devices/encoders.cpp:124
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>MP3</b> encoder used by Cantata supports a <a "
@@ -984,11 +1034,11 @@ msgstr ""
 "přenosném přehrávači.<br/>Cokoli pod <b>120 kb/s</b> může být hudebně "
 "neuspokojivé a cokoli nad <b>205 kb/s</b> je pravděpodobně až přespříliš."
 
-#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
+#: devices/encoders.cpp:156 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:158
+#: devices/encoders.cpp:159
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1004,7 +1054,7 @@ msgstr ""
 "skvělou, výbornou, znamenitou a prvotřídní volbou pro přenosné přehrávače "
 "hudby, které jej podporují."
 
-#: devices/encoders.cpp:163
+#: devices/encoders.cpp:164
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Vorbis</b> encoder used by Cantata supports a "
@@ -1038,15 +1088,15 @@ msgstr ""
 "poslech hudby v přenosném přehrávači.<br/>Cokoli pod <b>-q3</b> může být "
 "hudebně neuspokojivé a cokoli nad <b>-q8</b> je pravděpodobně až přespříliš."
 
-#: devices/encoders.cpp:183
+#: devices/encoders.cpp:184
 msgid "Quality rating"
 msgstr "Hodnocení jakosti"
 
-#: devices/encoders.cpp:200
+#: devices/encoders.cpp:201
 msgid "Opus"
 msgstr "Opus"
 
-#: devices/encoders.cpp:203
+#: devices/encoders.cpp:204
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1057,7 +1107,7 @@ msgstr ""
 "<a href=http://en.wikipedia.org/wiki/Opus_(audio_format)>Opus</a> digitální "
 "audio kodek nezatížený patenty používající ztrátovou kompresi dat."
 
-#: devices/encoders.cpp:205
+#: devices/encoders.cpp:206
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Opus</b> encoder used by Cantata supports a <a "
@@ -1074,27 +1124,26 @@ msgid ""
 msgstr ""
 "Datový tok je měřítkem pro množství dat použitých na vyjádření sekundy zvuku "
 "skladby.<br>Kodér <b>Opus</b></b> používaný Cantatou podporuje nastavení<a "
-"href=http://en.wikipedia.org/wiki/Variable_bitrate>proměnlivého datového toku "
-"(VBR)</"
-"a>, což znamená, že hodnota datového toku kolísá podle skladby vycházejíc ze "
-"složitosti zvukového obsahu. Složitější úseky dat jsou kódovány s větším "
-"datovým tokem, než jsou kódovány ty méně složité; tento přístup přináší "
-"úhrnně lepší jakost a menší soubor než stálý datový tok po celou dobu "
-"skladby.<br>Z tohoto důvodu je měřítko datového toku v tomto posuvníku jen "
-"odhadem průměrného datového toku "
-"kódované skladby.<br><b>128 kb/s</b> je dobrou volbou pro poslech hudby v "
-"přenosném přehrávači.<br/>Cokoli pod <b>100 kb/s</b> může být hudebně "
-"neuspokojivé a cokoli nad <b>256 kb/s</b> je pravděpodobně až přespříliš."
-
-#: devices/encoders.cpp:222 devices/encoders.cpp:319
+"href=http://en.wikipedia.org/wiki/Variable_bitrate>proměnlivého datového "
+"toku (VBR)</a>, což znamená, že hodnota datového toku kolísá podle skladby "
+"vycházejíc ze složitosti zvukového obsahu. Složitější úseky dat jsou "
+"kódovány s větším datovým tokem, než jsou kódovány ty méně složité; tento "
+"přístup přináší úhrnně lepší jakost a menší soubor než stálý datový tok po "
+"celou dobu skladby.<br>Z tohoto důvodu je měřítko datového toku v tomto "
+"posuvníku jen odhadem průměrného datového toku kódované skladby.<br><b>128 "
+"kb/s</b> je dobrou volbou pro poslech hudby v přenosném přehrávači.<br/"
+">Cokoli pod <b>100 kb/s</b> může být hudebně neuspokojivé a cokoli nad "
+"<b>256 kb/s</b> je pravděpodobně až přespříliš."
+
+#: devices/encoders.cpp:223 devices/encoders.cpp:320
 msgid "Bitrate"
 msgstr "Datový tok"
 
-#: devices/encoders.cpp:241
+#: devices/encoders.cpp:242
 msgid "Apple Lossless"
 msgstr "Apple Lossless"
 
-#: devices/encoders.cpp:244
+#: devices/encoders.cpp:245
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1109,11 +1158,11 @@ msgstr ""
 "<br>Doporučováno pouze pro hudební přehrávače od firmy Apple a přehrávače "
 "nepodporující FLAC."
 
-#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:260 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:262
+#: devices/encoders.cpp:263
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1129,7 +1178,7 @@ msgstr ""
 "bez ústupků, co se týče jakosti zvuku, FLAC je prostě excelentní, tedy "
 "vynikající, skvělou, výbornou, znamenitou a prvotřídní volbou."
 
-#: devices/encoders.cpp:266
+#: devices/encoders.cpp:267
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1154,19 +1203,19 @@ msgstr ""
 "úroveň zhuštění.<br/>Úrovně nad <b>5</b> kromě toho napínavě zvyšují čas "
 "zhuštění, ale vytvářejí jen nepatrně menší soubor, a nedoporučují se."
 
-#: devices/encoders.cpp:281
+#: devices/encoders.cpp:282
 msgid "Compression level"
 msgstr "Úroveň zhuštění"
 
-#: devices/encoders.cpp:291
+#: devices/encoders.cpp:292
 msgid "Faster compression"
 msgstr "Rychlejší zhuštění"
 
-#: devices/encoders.cpp:298
+#: devices/encoders.cpp:299
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:301
+#: devices/encoders.cpp:302
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1181,7 +1230,7 @@ msgstr ""
 "Microsoft pro ztrátové zhuštění zvuku.<br>Doporučován jen pro přenosné "
 "přehrávače hudby, jež nepodporují formát Ogg Vorbis."
 
-#: devices/encoders.cpp:305
+#: devices/encoders.cpp:306
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>Due to the limitations of the proprietary <b>WMA</b> "
@@ -1204,177 +1253,111 @@ msgstr ""
 "v přenosném přehrávači.<br/>Cokoli pod <b>112kb/s</b> může být hudebně "
 "neuspokojivé a cokoli nad <b>182kb/s</b> je pravděpodobně až přespříliš."
 
-#: devices/filenameschemedialog.cpp:33
+#: devices/filenameschemedialog.cpp:34
 msgid "Filename Scheme"
 msgstr "Schéma názvu souboru"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:62
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "Různí umělci"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:63
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Wibble"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:64
 msgctxt "Example composer"
 msgid "Vivaldi"
 msgstr "Vivaldi"
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:65
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "Nyní 5001"
 
-#: devices/filenameschemedialog.cpp:56
+#: devices/filenameschemedialog.cpp:66
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "Výkyv"
 
-#: devices/filenameschemedialog.cpp:57
+#: devices/filenameschemedialog.cpp:67
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Tanec"
 
-#: devices/filenameschemedialog.cpp:101
+#: devices/filenameschemedialog.cpp:121
 msgid ""
 "<p>The following variables will be replaced with their corresponding meaning "
 "for each track name.</p>"
 msgstr ""
-"<p>Následující proměnné budou nahrazeny jejich odpovídajícím významem "
-"pro každý název skladby.</p>"
+"<p>Následující proměnné budou nahrazeny jejich odpovídajícím významem pro "
+"každý název skladby.</p>"
 
-#: devices/filenameschemedialog.cpp:103
+#: devices/filenameschemedialog.cpp:123
 msgid ""
-"<tr><th><em>Button</em></th><th><em>Variable</em></th><th><em>Description</"
+"<tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</"
 "em></th></tr>"
 msgstr ""
-"<tr><th><em>Tlačítko</em></th><th><em>Proměnná</em></th><th><em>Popis</"
-"em></th></tr>"
-
-#: devices/filenameschemedialog.cpp:104
-msgid ""
-"<tr><td>%albumartist%</td><td>%1</td><td>The artist of the album. For most "
-"albums, this will be the same as the <i>Track Artist.</i> For compilations, "
-"this will often be <i>Various Artists.</i> </td></tr>"
-msgstr ""
-"<tr><td>%albumartist%</td><td>%1</td><td>Umělec alba. U většiny alb "
-"je totožný s <i>umělcem skladby.</i> U sbírek "
-"půjde často o <i>různé umělce.</i> </td></tr>"
-
-#: devices/filenameschemedialog.cpp:106
-msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
-msgstr "<tr><td>%album%</td><td>%1</td><td>Název alba.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:107
-msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
-msgstr "<tr><td>%composer%</td><td>%1</td><td>Skladatel.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:108
-msgid "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
-msgstr "<tr><td>%artist%</td><td>%1</td><td>Umělec každé skladby.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:109
-msgid ""
-"<tr><td>%title%</td><td>%1</td><td>The track title (without <i>Track Artist</"
-"i>).</td></tr>"
-msgstr ""
-"<tr><td>%title%</td><td>%1</td><td>Název skladby (bez <i>umělce skladby</"
-"i>).</td></tr>"
-
-#: devices/filenameschemedialog.cpp:110
-msgid ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>The track title (with <i>Track "
-"Artist</i>, if different to <i>Album Artist</i>).</td></tr>"
-msgstr ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>Název skladby (s <i>umělcem "
-"skladby</i>, pokud se liší od <i>umělce alba</i>).</td></tr>"
-
-#: devices/filenameschemedialog.cpp:111
-msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
-msgstr "<tr><td>%track%</td><td>%1</td><td>Číslo skladby.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:112
-msgid ""
-"<tr><td>%discnumber%</td><td>%1</td><td>The album number of a multi-album "
-"album. Often compilations consist of several albums.</td></tr>"
-msgstr ""
-"<tr><td>%discnumber%</td><td>%1</td><td>Číslo alba v případě alba složeného z "
-"více alb. "
-"album. Often compilations consist of several albums.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:113
-msgid ""
-"<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></tr>"
-msgstr "<tr><td>%year%</td><td>%1</td><td>Rok vydání alba.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:114
-msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
-msgstr "<tr><td>%genre%</td><td>%1</td><td>Žánr alba.</td></tr>"
+"<tr><th><em>Proměnná</em></th><th><em>Tlačítko</em></th><th><em>Popis</em></"
+"th></tr>"
 
-#: devices/fsdevice.cpp:668
+#: devices/fsdevice.cpp:675 gui/albumspage.cpp:287 gui/folderpage.cpp:304
+#: gui/librarypage.cpp:414
 msgid "Updating..."
 msgstr "Obnovuje se..."
 
-#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: devices/fsdevice.cpp:757 online/onlineservice.cpp:94
 #: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "Čte se vyrovnávací paměť"
 
-#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
+#: devices/fsdevice.cpp:769 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
 
-#: devices/mtpdevice.cpp:137
+#: devices/mtpdevice.cpp:153
 msgid "Connecting to device..."
 msgstr "Připojuje se k zařízení..."
 
-#: devices/mtpdevice.cpp:139 devices/mtpdevice.cpp:161
+#: devices/mtpdevice.cpp:155 devices/mtpdevice.cpp:202
 msgid "No devices found"
 msgstr "Nenalezeno žádné zařízení"
 
-#: devices/mtpdevice.cpp:173
+#: devices/mtpdevice.cpp:217
 msgid "Connected to device"
 msgstr "Připojeno k zařízení"
 
-#: devices/mtpdevice.cpp:183
+#: devices/mtpdevice.cpp:230
 msgid "Disconnected from device"
 msgstr "Odpojeno od zařízení"
 
-#: devices/mtpdevice.cpp:250
+#: devices/mtpdevice.cpp:304
 msgid "Updating folders..."
 msgstr "Obnovují se složky..."
 
-#: devices/mtpdevice.cpp:257
+#: devices/mtpdevice.cpp:320
 msgid "Updating files..."
 msgstr "Obnovují se soubory..."
 
-#: devices/mtpdevice.cpp:262 devices/remotefsdevice.cpp:465
-#: devices/remotefsdevice.cpp:485
+#: devices/mtpdevice.cpp:334 devices/remotefsdevice.cpp:461
+#: devices/remotefsdevice.cpp:481
 msgid "Updating tracks..."
 msgstr "Obnovují se skladby..."
 
-#: devices/mtpdevice.cpp:281 devices/mtpdevice.cpp:383
-#: models/musiclibraryitemroot.cpp:78 models/musiclibraryitemroot.cpp:117
-#: models/musiclibraryitemroot.cpp:171 models/musiclibraryitemroot.cpp:833
-#: models/musiclibraryitemroot.cpp:1012 mpd/song.cpp:371
-msgid "Various Artists"
-msgstr "Různí umělci"
-
-#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
-#: models/devicesmodel.cpp:140
+#: devices/mtpdevice.cpp:1619 devices/remotefsdevice.cpp:564
+#: devices/umsdevice.cpp:100 gui/initialsettingswizard.cpp:57
+#: models/devicesmodel.cpp:157
 msgid "Not Connected"
 msgstr "Nepřipojeno"
 
-#: devices/musicbrainz.cpp:320
+#: devices/musicbrainz.cpp:319
 msgid "%1 (Disc %2)"
 msgstr "%1 (Disk %2)"
 
-#: devices/musicbrainz.cpp:408
+#: devices/musicbrainz.cpp:407
 msgid "No matches found in MusicBrainz"
 msgstr "V MusicBrainz nenalezeny žádné shody"
 
@@ -1382,7 +1365,7 @@ msgstr "V MusicBrainz nenalezeny žádné shody"
 msgid "Connection"
 msgstr "Spojení"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:261
 msgid "Music Library"
 msgstr "Hudební knihovna"
 
@@ -1410,31 +1393,31 @@ msgstr "Bezpečný shell (sshfs)"
 msgid "Locally Mounted Folder"
 msgstr "Místně připojená složka"
 
-#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:612
+#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:608
 msgid "Available"
 msgstr "Dostupné"
 
-#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:610
+#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:606
 msgid "Not Available"
 msgstr "Nedostupné"
 
-#: devices/remotefsdevice.cpp:315
+#: devices/remotefsdevice.cpp:313
 msgid "Failed to resolve connection details for %1"
 msgstr "Nepodařilo se vyřešit podrobnosti připojení pro %1"
 
-#: devices/remotefsdevice.cpp:330 devices/remotefsdevice.cpp:345
-#: devices/remotefsdevice.cpp:403
+#: devices/remotefsdevice.cpp:328 devices/remotefsdevice.cpp:343
+#: devices/remotefsdevice.cpp:399
 msgid "Connecting..."
 msgstr "Připojuje se..."
 
-#: devices/remotefsdevice.cpp:358
+#: devices/remotefsdevice.cpp:356
 msgid ""
 "Password prompting does not work when cantata is started from the "
 "commandline."
 msgstr ""
 "Výzva k zadání hesla nepracuje, když je Cantata spuštěna z příkazového řádku."
 
-#: devices/remotefsdevice.cpp:379
+#: devices/remotefsdevice.cpp:375
 msgid ""
 "No suitable ssh-askpass application installed! This is required for entering "
 "passwords."
@@ -1442,50 +1425,50 @@ msgstr ""
 "Žádný vhodný program ssh-askpass není nainstalován! Toto je vyžadováno pro "
 "zadávání hesel"
 
-#: devices/remotefsdevice.cpp:386
+#: devices/remotefsdevice.cpp:382
 msgid "Mount point (\"%1\") is not empty!"
 msgstr "Bod připojení (\"%1\") není prázdný!"
 
-#: devices/remotefsdevice.cpp:398
+#: devices/remotefsdevice.cpp:394
 msgid "\"sshfs\" is not installed!"
 msgstr "\"sshfs\" není nainstalován!"
 
-#: devices/remotefsdevice.cpp:426 devices/remotefsdevice.cpp:446
+#: devices/remotefsdevice.cpp:422 devices/remotefsdevice.cpp:442
 msgid "Disconnecting..."
 msgstr "Odpojuje se..."
 
-#: devices/remotefsdevice.cpp:440
+#: devices/remotefsdevice.cpp:436
 msgid "\"fusermount\" is not installed!"
 msgstr "\"fusermount\" není nainstalován!"
 
-#: devices/remotefsdevice.cpp:461 devices/remotefsdevice.cpp:482
+#: devices/remotefsdevice.cpp:457 devices/remotefsdevice.cpp:478
 msgid "Failed to connect to \"%1\""
 msgstr "Nepodařilo se připojit k \"%1\""
 
-#: devices/remotefsdevice.cpp:462 devices/remotefsdevice.cpp:497
+#: devices/remotefsdevice.cpp:458 devices/remotefsdevice.cpp:493
 msgid "Failed to disconnect from \"%1\""
 msgstr "Nepodařilo se odpojit od \"%1\""
 
-#: devices/remotefsdevice.cpp:573
+#: devices/remotefsdevice.cpp:569
 msgid "Capacity Unknown"
 msgstr "Neznámá velikost"
 
-#. i18n: file: gui/coverdialog.ui:30
+#. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (text), widget (QPushButton, search)
-#: devices/synccollectionwidget.cpp:53 gui/stdactions.cpp:92
-#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
+#: devices/synccollectionwidget.cpp:54 gui/mainwindow.cpp:323
+#: online/podcastsearchdialog.cpp:334 po/rc.cpp:404 rc.cpp:404
 msgid "Search"
 msgstr "Hledat"
 
-#: devices/synccollectionwidget.cpp:62
+#: devices/synccollectionwidget.cpp:63
 msgid "Check Items"
 msgstr "Zaškrtnout položky"
 
-#: devices/synccollectionwidget.cpp:64
+#: devices/synccollectionwidget.cpp:65
 msgid "Uncheck Items"
 msgstr "Zrušit zaškrtnutí položek"
 
-#: devices/synccollectionwidget.cpp:266
+#: devices/synccollectionwidget.cpp:272
 msgid "Nothing selected"
 msgstr "Nic nevybráno"
 
@@ -1509,7 +1492,7 @@ msgstr "Seřídit"
 msgid "Device and library are in sync."
 msgstr "Zařízení a knihovna jsou vzájemně seřízeny."
 
-#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:190
+#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:188
 msgid "Not Scanned"
 msgstr "Neprohledáno"
 
@@ -1517,22 +1500,22 @@ msgstr "Neprohledáno"
 msgid " (recommended)"
 msgstr " (doporučeno)"
 
-#: dynamic/dynamic.cpp:208
+#: dynamic/dynamic.cpp:215
 msgid "Start Dynamic Playlist"
 msgstr "Spustit dynamický seznam skladeb"
 
-#: dynamic/dynamic.cpp:209
+#: dynamic/dynamic.cpp:216
 msgid "Stop Dynamic Mode"
 msgstr "Zastavit dynamický režim"
 
-#: dynamic/dynamic.cpp:257
+#: dynamic/dynamic.cpp:264
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "1 pravidlo"
 msgstr[1] "%1 pravidla"
 msgstr[2] "%1 pravidel"
 
-#: dynamic/dynamic.cpp:396
+#: dynamic/dynamic.cpp:403
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
@@ -1540,71 +1523,71 @@ msgstr ""
 "Aby pracoval dynamický režim Cantaty, musíte do vašeho systému nainstalovat "
 "\"perl\"."
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:410
 msgid "Failed to locate rules file - %1"
 msgstr "Nepodařilo se najít soubor s pravidly - %1"
 
-#: dynamic/dynamic.cpp:411
+#: dynamic/dynamic.cpp:418
 msgid "Failed to remove previous rules file - %1"
 msgstr "Nepodařilo se odstranit předchozí soubor s pravidly - %1"
 
-#: dynamic/dynamic.cpp:416
+#: dynamic/dynamic.cpp:423
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "Nepodařilo se nainstalovat soubor s pravidly - %1 -> %2"
 
-#: dynamic/dynamic.cpp:729
+#: dynamic/dynamic.cpp:736
 msgid "Dynamizer has been terminated."
 msgstr "Dynamizátor byl ukončen."
 
-#: dynamic/dynamic.cpp:816
+#: dynamic/dynamic.cpp:823 mpd/mpdconnection.cpp:150
 msgid "Uknown"
 msgstr "Neznámý"
 
-#: dynamic/dynamic.cpp:818
+#: dynamic/dynamic.cpp:825
 msgid "Loading list of rules"
 msgstr "Nahrává se seznam pravidel"
 
-#: dynamic/dynamic.cpp:819
+#: dynamic/dynamic.cpp:826
 msgid "Saving rule"
 msgstr "Ukládá se pravidlo"
 
-#: dynamic/dynamic.cpp:820
+#: dynamic/dynamic.cpp:827
 msgid "Deleting rule"
 msgstr "Maže se pravidlo"
 
-#: dynamic/dynamic.cpp:821
+#: dynamic/dynamic.cpp:828
 msgid "Setting active rule"
 msgstr "Nastavuje se činné pravidlo"
 
-#: dynamic/dynamic.cpp:822
+#: dynamic/dynamic.cpp:829
 msgid "Stopping dynamizer"
 msgstr "Zastavuje se dynamizátor"
 
-#: dynamic/dynamic.cpp:823
+#: dynamic/dynamic.cpp:830
 msgid "Requesting ID details"
 msgstr "Požadují se podrobnosti ID"
 
-#: dynamic/dynamic.cpp:826
+#: dynamic/dynamic.cpp:833
 msgid "Awaiting response for previous command. (%1)"
 msgstr "Očekává se odpověď na předchozí příkaz. (%1)"
 
-#: dynamic/dynamic.cpp:981
+#: dynamic/dynamic.cpp:988
 msgid "Dynamizer is not active"
 msgstr "Dynamizátor není činný"
 
-#: dynamic/dynamic.cpp:989
+#: dynamic/dynamic.cpp:996
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "Nepodařilo se získat seznam dynamických pravidel. (%1)"
 
-#: dynamic/dynamic.cpp:1020
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to delete rules file. (%1)"
 msgstr "Nepodařilo se smazat soubor s pravidly. (%1)"
 
-#: dynamic/dynamic.cpp:1027
+#: dynamic/dynamic.cpp:1034
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Nepodařilo se zkontrolovat stav dynamizátoru. (%1)"
 
-#: dynamic/dynamic.cpp:1036
+#: dynamic/dynamic.cpp:1043
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "Nepodařilo se nastavit nynější dynamická pravidla. (%1)"
 
@@ -1620,11 +1603,11 @@ msgstr "Přidat dynamická pravidla"
 msgid "Edit Dynamic Rules"
 msgstr "Upravit dynamická pravidla"
 
-#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:151
+#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:150
 msgid "Remove Dynamic Rules"
 msgstr "Odstranit dynamická pravidla"
 
-#: dynamic/dynamicpage.cpp:150
+#: dynamic/dynamicpage.cpp:149
 msgid ""
 "Are you sure you wish to remove the selected rules?\n"
 "This cannot be undone."
@@ -1638,15 +1621,15 @@ msgstr "Dynamické pravidlo"
 
 #. i18n: file: dynamic/dynamicrules.ui:53
 #. i18n: ectx: property (text), widget (QPushButton, addBtn)
-#: dynamic/dynamicruledialog.cpp:136 po/rc.cpp:280 rc.cpp:280
+#: dynamic/dynamicruledialog.cpp:145 po/rc.cpp:341 rc.cpp:341
 msgid "Add"
 msgstr "Přidat"
 
-#: dynamic/dynamicruledialog.cpp:202
+#: dynamic/dynamicruledialog.cpp:211
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr "<i><b>CHYBA</b>: 'Od roku' má být menší než 'Do roku'</i>"
 
-#: dynamic/dynamicruledialog.cpp:205
+#: dynamic/dynamicruledialog.cpp:214
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1662,27 +1645,27 @@ msgstr "Podobní umělci"
 msgid "AlbumArtist"
 msgstr "Umělec alba"
 
-#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: file: devices/filenameschemedialog.ui:102
 #. i18n: ectx: property (text), widget (QPushButton, composer)
-#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:212 rc.cpp:212
 msgid "Composer"
 msgstr "Skladatel"
 
-#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:48
+#: models/playqueuemodel.cpp:107 replaygain/rgdialog.cpp:129
 msgid "Album"
 msgstr "Album"
 
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:106
-#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:112
+#: po/rc.cpp:254 po/rc.cpp:380 rc.cpp:254 rc.cpp:380
 msgid "Genre"
 msgstr "Žánr"
 
@@ -1733,7 +1716,7 @@ msgstr ""
 "ale ne z alba Abc', budete potřebovat následující: <ul><li>Zahrnout Umělec "
 "alba=Wibble</li><li>Vyloučit Album=Abc</li></ul>Poté co byl vytvořen soubor "
 "písní vhodných k použití, Cantata náhodně vybere písně tak, udržela řadu "
-"přehrávaných skladeb naplněnou 10 záznamy.</p>"
+"skladeb k přehrání naplněnou 10 záznamy.</p>"
 
 #: dynamic/dynamicrulesdialog.cpp:309
 msgid "Failed to save %1"
@@ -1755,88 +1738,88 @@ msgstr "Přepsat pravidla"
 msgid "Saving %1"
 msgstr "Ukládá se %1"
 
-#: gui/cachesettings.cpp:168
+#: gui/cachesettings.cpp:173
 msgid "Deleting..."
 msgstr "Maže se..."
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Name"
 msgstr "Název"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Item Count"
 msgstr "Počet položek"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Space Used"
 msgstr "Použité místo"
 
-#: gui/cachesettings.cpp:234
+#: gui/cachesettings.cpp:239
 msgid "Total space used: %1"
 msgstr "Celkové použité místo: %1"
 
-#: gui/cachesettings.cpp:245
+#: gui/cachesettings.cpp:250
 msgid ""
-"To speed up loading of the music library, Cantata caches a local copy of the "
-"MPD listing. Cantata might also have cached covers, or lyrics, if these have "
-"been downloaded and could not be saved into the MPD folder (because Cantata "
-"cannot access it, or you have configured Cantata to not save these items "
-"there). Below is a summary of Cantata's cache usage."
+"Cantata caches a local copy of the MPD listing to speed up loading of the "
+"music library. Cantata might also have cached covers, lyrics, or artist "
+"images, if these have been downloaded and could not be saved into the MPD "
+"folder (because Cantata cannot access it, or you have configured Cantata to "
+"not save these items there). Below is a summary of Cantata's current cache "
+"usage."
 msgstr ""
 "Pro urychlení nahrávání hudební knihovny Cantata ukládá do vyrovnávací "
 "paměti místní kopii seznamu MPD. Cantata může do vyrovnávací paměti ukládat "
-"také obaly nebo slova písní, pokud byly staženy a nepodařilo se je uložit do "
+"také obaly, slova písní, nebo obrázky umělců, pokud byly staženy a nepodařilo "
+"se je uložit do "
 "složky MPD (protože Cantata k nim nemůže přistupovat, nebo jste Cantatu "
 "nastavil tak, aby tam položky neukládala). Níže je přehled o využití "
 "vyrovnávací paměti Cantaty."
 
-#: gui/cachesettings.cpp:257
+#: gui/cachesettings.cpp:263
 msgid "Covers"
 msgstr "Obaly"
 
-#: gui/cachesettings.cpp:258
+#: gui/cachesettings.cpp:264
+msgid "Scaled Covers"
+msgstr "Obaly se změněnou velikostí"
+
+#: gui/cachesettings.cpp:265
 msgid "Backdrops"
 msgstr "Pozadí"
 
-#: gui/cachesettings.cpp:263 gui/interfacesettings.cpp:167
-#: gui/mainwindow.cpp:283 gui/preferencesdialog.cpp:85
-#: widgets/groupedview.cpp:256
-msgid "Streams"
-msgstr "Proudy"
+#: gui/cachesettings.cpp:271
+msgid "Stream Listings"
+msgstr "Soupisy proudů"
 
-#: gui/cachesettings.cpp:264
+#: gui/cachesettings.cpp:274
 msgid "Jamendo"
 msgstr "Jamendo"
 
-#: gui/cachesettings.cpp:265
+#: gui/cachesettings.cpp:275
 msgid "Magnatune"
 msgstr "Magnatune"
 
-#: gui/cachesettings.cpp:266
+#: gui/cachesettings.cpp:276
 msgid "Podcast Directories"
 msgstr "Adresáře se záznamy (podcasty)"
 
-#: gui/cachesettings.cpp:273
+#: gui/cachesettings.cpp:285
 msgid "Delete All"
 msgstr "Smazat vše"
 
-#: gui/cachesettings.cpp:312
+#: gui/cachesettings.cpp:324
 msgid "Delete all '%1' items?"
 msgstr "Smazat všech '%1' položek?"
 
-#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
+#: gui/cachesettings.cpp:325 gui/cachesettings.cpp:335
 msgid "Delete Cache Items"
 msgstr "Smazat položky ve vyrovnávací paměti"
 
-#: gui/cachesettings.cpp:322
+#: gui/cachesettings.cpp:334
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr "<p>Smazat vše z následujícího?<ul>%1</ul></p>"
 
-#: gui/coverdialog.cpp:151 gui/main.cpp:231
-msgid "Last.fm"
-msgstr "Last.fm"
-
-#: gui/coverdialog.cpp:165
+#: gui/coverdialog.cpp:124
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1847,53 +1830,39 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:184
-msgctxt ""
-"Google\n"
-"width x height (file size)"
-msgid ""
-"Google\n"
-"%1 x %2 (%3)"
-msgstr ""
-"Google\n"
-"%1 x %2 (%3)"
-
-#: gui/coverdialog.cpp:204
+#: gui/coverdialog.cpp:126
 msgctxt ""
-"Discogs\n"
+"name\n"
 "width x height"
 msgid ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 msgstr ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 
-#: gui/coverdialog.cpp:238
-msgctxt ""
-"Current Cover\n"
-"width x height"
-msgid ""
-"Current Cover\n"
-"%1 x %2"
-msgstr ""
-"Nynější obal\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:162
+msgid "Current Cover"
+msgstr "Nynější obal"
+
+#: gui/coverdialog.cpp:211 gui/coverdialog.cpp:411
+msgid "CoverArt Archive"
+msgstr "Archiv obalů"
 
-#: gui/coverdialog.cpp:256
+#: gui/coverdialog.cpp:242
 msgid "Image"
 msgstr "Obrázek"
 
-#: gui/coverdialog.cpp:259
+#: gui/coverdialog.cpp:245
 msgid "Downloading..."
 msgstr "Stahuje se..."
 
-#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
+#: gui/coverdialog.cpp:290 gui/coverdialog.cpp:325
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "Obrázek (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:446
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
@@ -1901,7 +1870,7 @@ msgstr ""
 "<p>Obal pro tohoto umělce již existuje, a soubor není zapisovatelný.<p></"
 "p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:433
+#: gui/coverdialog.cpp:447
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
@@ -1909,13 +1878,16 @@ msgstr ""
 "<p>Obal pro toto album již existuje, a soubor není zapisovatelný.<p></p><i>"
 "%1</i></p>"
 
-#: gui/coverdialog.cpp:440 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:234
-msgctxt "Album by Artist"
-msgid "%1 by %2"
-msgstr "%1 od %2"
+#: gui/coverdialog.cpp:452
+msgid "'%1' Artist Image"
+msgstr "'%1' Obrázek umělce"
+
+#: gui/coverdialog.cpp:454
+msgctxt "'Artist - Album' Album Cover"
+msgid "'%1 - %2' Album Cover"
+msgstr "'%1 - %2' Obal alba"
 
-#: gui/coverdialog.cpp:579
+#: gui/coverdialog.cpp:582
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1923,27 +1895,23 @@ msgstr ""
 "Nepodařilo se nastavit obal!\n"
 "Nepodařilo se stáhnout do dočasného souboru!"
 
-#: gui/coverdialog.cpp:607
+#: gui/coverdialog.cpp:616
 msgid "Failed to download image!"
 msgstr "Nepodařilo se stáhnout obrázek!"
 
-#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
+#: gui/coverdialog.cpp:875 gui/coverdialog.cpp:877
 msgid "Load Local Cover"
 msgstr "Nahrát místní obal"
 
-#: gui/coverdialog.cpp:795
-msgid "Images (*.png *.jpg)"
-msgstr "Obrázky (*.png *.jpg)"
-
-#: gui/coverdialog.cpp:800
+#: gui/coverdialog.cpp:882
 msgid "File is already in list!"
 msgstr "Soubor je již v seznamu!"
 
-#: gui/coverdialog.cpp:804
+#: gui/coverdialog.cpp:886
 msgid "Failed to read image!"
 msgstr "Nepodařilo se přečíst obrázek!"
 
-#: gui/coverdialog.cpp:817
+#: gui/coverdialog.cpp:899
 msgid "Display"
 msgstr "Zobrazit"
 
@@ -1955,12 +1923,12 @@ msgstr "Zobrazit"
 #. i18n: ectx: property (text), widget (QPushButton, removeBtn)
 #. i18n: file: streams/streamssettings.ui:73
 #. i18n: ectx: property (text), widget (QPushButton, removeButton)
-#: gui/coverdialog.cpp:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
-#: rc.cpp:286 rc.cpp:765
+#: gui/coverdialog.cpp:900 gui/stdactions.cpp:90 po/rc.cpp:347 po/rc.cpp:917
+#: rc.cpp:347 rc.cpp:917
 msgid "Remove"
 msgstr "Odstranit"
 
-#: gui/coverdialog.cpp:1181
+#: gui/coverdialog.cpp:1333
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1968,7 +1936,7 @@ msgstr ""
 "Nepodařilo se nastavit obal!\n"
 "Nepodařilo se udělat kopii!"
 
-#: gui/coverdialog.cpp:1190
+#: gui/coverdialog.cpp:1342
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1976,7 +1944,7 @@ msgstr ""
 "Nepodařilo se nastavit obal!\n"
 "Nepodařilo se zazálohovat originál!"
 
-#: gui/coverdialog.cpp:1239
+#: gui/coverdialog.cpp:1391
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1984,163 +1952,251 @@ msgstr ""
 "Nepodařilo se nastavit obal!\n"
 "Nepodařilo se zkopírovat soubor do '%1'!"
 
-#: gui/folderpage.cpp:45
+#: gui/coverdialog.cpp:1449 models/onlineservicesmodel.cpp:157
+msgid "Searching..."
+msgstr "Hledá se..."
+
+#: gui/folderpage.cpp:44
 msgid "Open In File Manager"
 msgstr "Otevřít ve správci souborů"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Established"
 msgstr "Spojení navázáno"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Failed"
 msgstr "Spojení se nezdařilo"
 
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
+#. i18n: file: support/shortcutssettingswidget.ui:78
+#. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
 #. i18n: file: support/shortcutssettingswidget.ui:78
 #. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
-#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
-#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
+#: gui/interfacesettings.cpp:48 gui/playbacksettings.cpp:46
+#: online/magnatuneservice.cpp:159 po/rc.cpp:6 po/rc.cpp:660 po/rc.cpp:751
+#: po/rc.cpp:778 po/rc.cpp:932 rc.cpp:6 rc.cpp:660 rc.cpp:751 rc.cpp:778
+#: rc.cpp:932
 msgid "None"
 msgstr "Žádné"
 
-#: gui/interfacesettings.cpp:40
+#: gui/interfacesettings.cpp:49 gui/interfacesettings.cpp:160
 msgid "Small"
 msgstr "Malý"
 
-#: gui/interfacesettings.cpp:41
+#: gui/interfacesettings.cpp:50
 msgid "Medium"
 msgstr "Střední"
 
-#: gui/interfacesettings.cpp:42
+#: gui/interfacesettings.cpp:51 gui/interfacesettings.cpp:159
 msgid "Large"
 msgstr "Velký"
 
-#: gui/interfacesettings.cpp:43
+#: gui/interfacesettings.cpp:52
 msgid "Extra Large"
 msgstr "Hodně velký"
 
-#: gui/interfacesettings.cpp:48
+#: gui/interfacesettings.cpp:57
+msgid "Basic Tree (No Icons)"
+msgstr "Základní strom (žádné ikony)"
+
+#: gui/interfacesettings.cpp:58
 msgid "Simple Tree"
 msgstr "Jednoduchý strom"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:59
 msgid "Detailed Tree"
 msgstr "Podrobný strom"
 
-#. i18n: file: gui/interfacesettings.ui:329
+#. i18n: file: gui/interfacesettings.ui:449
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
+#: gui/interfacesettings.cpp:61 po/rc.cpp:639 rc.cpp:639
 msgid "Grouped Albums"
 msgstr "Seskupená alba"
 
-#: gui/interfacesettings.cpp:53
+#: gui/interfacesettings.cpp:63
 msgid "List"
 msgstr "Seznam"
 
-#: gui/interfacesettings.cpp:55
+#: gui/interfacesettings.cpp:65
 msgid "Icon/List"
 msgstr "Ikona/Seznam"
 
-#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+#. i18n: file: gui/interfacesettings.ui:454
+#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
+#: gui/interfacesettings.cpp:68 po/rc.cpp:642 rc.cpp:642
+msgid "Table"
+msgstr "Tabulka"
+
+#: gui/interfacesettings.cpp:104
+msgid "Play queue"
+msgstr "Řada"
+
+#. i18n: file: gui/interfacesettings.ui:182
+#. i18n: ectx: attribute (title), widget (QWidget, tab)
+#: gui/interfacesettings.cpp:105 gui/mainwindow.cpp:307 po/rc.cpp:569
+#: rc.cpp:569
+msgid "Artists"
+msgstr "Umělci"
+
+#: gui/interfacesettings.cpp:107 gui/interfacesettings.cpp:138
+#: gui/mainwindow.cpp:309
 msgid "Folders"
 msgstr "Složky"
 
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:337
+#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
+#: gui/interfacesettings.cpp:108 gui/mainwindow.cpp:310 po/rc.cpp:609
+#: rc.cpp:609
+msgid "Playlists"
+msgstr "Seznamy"
+
+#: gui/interfacesettings.cpp:110
+msgid "Dynamic Playlists"
+msgstr "Dynamické seznamy skladeb"
+
+#: gui/interfacesettings.cpp:114
+msgid "Streams (e.g. Radio Stations)"
+msgstr "Proudy (např. radiostanice)"
+
+#: gui/interfacesettings.cpp:121
+msgid "Online Services - Jamendo, Maganatune, SoundCloud, and Podcasts"
+msgstr ""
+"Internetové služby - Jamendo, Maganatune, SoundCloud, a zvukové záznamy"
+
+#: gui/interfacesettings.cpp:128
+msgid "Devices - UMS, MTP (e.g. Android), and AudioCDs"
+msgstr "Zařízení - UMS, MTP (např.  Android), a zvuková CD"
+
+#: gui/interfacesettings.cpp:134
+msgid "Search (via MPD)"
+msgstr "Hledání (přes MPD)"
+
+#: gui/interfacesettings.cpp:135
+msgid "Info - Current song information (artist, album, and lyrics)"
+msgstr "Informace - informace o nynější písni (umělec, album a slova písně)"
+
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#: gui/interfacesettings.cpp:165 gui/interfacesettings.cpp:168
-#: gui/interfacesettings.cpp:171 gui/interfacesettings.cpp:174 po/rc.cpp:472
-#: po/rc.cpp:491 po/rc.cpp:512 po/rc.cpp:536 rc.cpp:472 rc.cpp:491 rc.cpp:512
-#: rc.cpp:536
+#: gui/interfacesettings.cpp:139 po/rc.cpp:554 po/rc.cpp:572 po/rc.cpp:591
+#: po/rc.cpp:612 po/rc.cpp:636 rc.cpp:554 rc.cpp:572 rc.cpp:591 rc.cpp:612
+#: rc.cpp:636
 msgid "Style:"
 msgstr "Styl:"
 
-#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
-#: gui/preferencesdialog.cpp:89
-msgid "Online"
-msgstr "Internet"
+#: gui/interfacesettings.cpp:161
+msgid "Tab-bar"
+msgstr "Pruh s kartami"
 
-#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
-msgid "Devices"
-msgstr "Zařízení"
+#: gui/interfacesettings.cpp:162
+msgid "Left"
+msgstr "Vlevo"
+
+#: gui/interfacesettings.cpp:162
+msgid "Right"
+msgstr "Vpravo"
 
-#: gui/interfacesettings.cpp:178
-msgid "Grouped by 'Album Artist'"
-msgstr "Seskupeno podle Umělec alba"
+#: gui/interfacesettings.cpp:163
+msgid "Top"
+msgstr "Nahoře"
 
-#: gui/interfacesettings.cpp:179
-msgid "Grouped under 'Various Artists'"
-msgstr "Seskupeno podle Různí umělci"
+#: gui/interfacesettings.cpp:164
+msgid "Bottom"
+msgstr "Dole"
 
-#: gui/main.cpp:213 gui/mainwindow.cpp:1941 gui/trayitem.cpp:98
-#: gui/trayitem.cpp:100 gui/trayitem.cpp:135 gui/trayitem.cpp:199
-#: gui/trayitem.cpp:209 gui/trayitem.cpp:212 gui/trayitem.cpp:215
-#: gui/trayitem.cpp:228 gui/trayitem.cpp:230
+#: gui/interfacesettings.cpp:391
+msgid "System default"
+msgstr "Výchozí nastavení systému"
+
+#: gui/main.cpp:224 gui/mainwindow.cpp:2075 gui/trayitem.cpp:112
+#: gui/trayitem.cpp:118 gui/trayitem.cpp:153 gui/trayitem.cpp:217
+#: gui/trayitem.cpp:227 gui/trayitem.cpp:230 gui/trayitem.cpp:233
+#: gui/trayitem.cpp:246 gui/trayitem.cpp:248
 msgid "Cantata"
 msgstr "Cantata"
 
-#: gui/main.cpp:214
+#: gui/main.cpp:225
 msgid "A KDE client for MPD"
 msgstr "KDE klient pro MPD"
 
-#: gui/main.cpp:216
-msgid "Copyright (c) 2011–2013 Craig Drummond"
-msgstr "Autorské právo (c) 2011-2013 Craig Drummond"
+#: gui/main.cpp:227
+msgid "© 2011-2014 Craig Drummond"
+msgstr "© 2011-2014 Craig Drummond"
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Maintainer"
 msgstr "Správce"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "UI Improvements"
 msgstr "Vylepšení rozhraní"
 
-#: gui/main.cpp:222
+#: gui/main.cpp:233
 msgid "Sander Knopper"
 msgstr "Sander Knopper"
 
-#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
+#: gui/main.cpp:233 gui/main.cpp:234 gui/main.cpp:235 gui/main.cpp:236
 msgid "QtMPC author"
 msgstr "Autor QtMPC"
 
-#: gui/main.cpp:223
+#: gui/main.cpp:234
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:224
+#: gui/main.cpp:235
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:225
+#: gui/main.cpp:236
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
@@ -2148,101 +2204,105 @@ msgstr ""
 "Pozadí pohledu na souvislosti (zvažte, prosím, nahrání vašeho vlastního "
 "fanouškovského umění na fanart.tv)"
 
-#: gui/main.cpp:230
+#: gui/main.cpp:238
 msgid "Wikipedia"
 msgstr "Wikipedie"
 
-#: gui/main.cpp:230 gui/main.cpp:231
+#: gui/main.cpp:238 gui/main.cpp:239
 msgid "Context view metadata"
 msgstr "Popisná data pohledu na souvislosti"
 
-#: gui/main.cpp:235
+#: gui/main.cpp:239
+msgid "Last.fm"
+msgstr "Last.fm"
+
+#: gui/main.cpp:243
 msgid "URL to open"
 msgstr "Adresa (URL) k otevření"
 
-#: gui/mainwindow.cpp:238
+#: gui/mainwindow.cpp:269
 msgid "Quit"
 msgstr "Ukončit"
 
-#: gui/mainwindow.cpp:242
+#: gui/mainwindow.cpp:273
 msgid "Show Window"
 msgstr "Ukázat okno"
 
 #. i18n: file: gui/initialsettingswizard.ui:469
 #. i18n: ectx: property (text), widget (QPushButton, connectButton)
-#: gui/mainwindow.cpp:245 po/rc.cpp:418 rc.cpp:418
+#: gui/mainwindow.cpp:276 po/rc.cpp:482 rc.cpp:482
 msgid "Connect"
 msgstr "Spojit"
 
-#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
+#: gui/mainwindow.cpp:277 gui/preferencesdialog.cpp:83
 msgid "Collection"
 msgstr "Sbírka"
 
-#: gui/mainwindow.cpp:247
+#: gui/mainwindow.cpp:278
 msgid "Outputs"
 msgstr "Výstupy"
 
-#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
+#: gui/mainwindow.cpp:279 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "Zastavit po skladbě"
 
-#: gui/mainwindow.cpp:249
+#: gui/mainwindow.cpp:280
 msgid "Add To Stored Playlist"
 msgstr "Přidat do uloženého seznamu skladeb"
 
-#: gui/mainwindow.cpp:250
+#: gui/mainwindow.cpp:281
 msgid "Remove From Play Queue"
 msgstr "Odstranit z řady skladeb k přehrání"
 
-#: gui/mainwindow.cpp:251
+#: gui/mainwindow.cpp:282
 msgid "Copy Track Info"
 msgstr "Kopírovat informace o skladbě"
 
-#: gui/mainwindow.cpp:252
+#: gui/mainwindow.cpp:283
 msgid "Crop"
 msgstr "Oříznout"
 
-#: gui/mainwindow.cpp:253
+#: gui/mainwindow.cpp:284
 msgid "Shuffle Tracks"
 msgstr "Zamíchat skladby"
 
-#: gui/mainwindow.cpp:254
+#: gui/mainwindow.cpp:285
 msgid "Shuffle Albums"
 msgstr "Zamíchat alba"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:286
 msgid "Add Stream URL"
 msgstr "Přidat adresu proudu"
 
-#: gui/mainwindow.cpp:256
+#: gui/mainwindow.cpp:287
 msgid "Clear"
 msgstr "Vyprázdnit"
 
-#: gui/mainwindow.cpp:257
+#: gui/mainwindow.cpp:288
 msgid "Expanded Interface"
 msgstr "Rozšířené rozhraní"
 
-#: gui/mainwindow.cpp:258
+#: gui/mainwindow.cpp:289
 msgid "Show Current Song Information"
 msgstr "Ukázat informace o nynější skladbě"
 
-#: gui/mainwindow.cpp:261
+#: gui/mainwindow.cpp:292
 msgid "Full Screen"
 msgstr "Na celou obrazovku"
 
-#: gui/mainwindow.cpp:263
+#: gui/mainwindow.cpp:294
 msgid "Random"
 msgstr "Náhodné"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:295
 msgid "Repeat"
 msgstr "Opakování"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid "Single"
 msgstr "Jednotlivé"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
@@ -2250,11 +2310,11 @@ msgstr ""
 "Když jsou zapnuty jednotlivé skladby, je přehrávání zastaveno po nynější "
 "písni, nebo je píseň opakována, pokud je povolen režim opakování."
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid "Consume"
 msgstr "Sníst"
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
@@ -2262,147 +2322,147 @@ msgstr ""
 "Když je zapnuto snězení, píseň je odstraněna z řady skladeb k přehrání, poté "
 "co byla přehrána"
 
-#: gui/mainwindow.cpp:267
-msgid "Search Play Queue"
-msgstr "Prohledat řadu přehrávaných skladeb"
-
-#: gui/mainwindow.cpp:269
+#: gui/mainwindow.cpp:298
 msgid "Set Priority"
 msgstr "Nastavit přednost"
 
-#: gui/mainwindow.cpp:271
+#: gui/mainwindow.cpp:300
 msgid "Play Stream"
 msgstr "Přehrát proud"
 
-#: gui/mainwindow.cpp:273
+#: gui/mainwindow.cpp:302
 msgid "Locate In Library"
 msgstr "Najít v knihovně"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:304
 msgid "Edit Song Tags"
 msgstr "Upravit značky písně"
 
-#. i18n: file: gui/interfacesettings.ui:304
+#. i18n: file: gui/interfacesettings.ui:429
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
+#: gui/mainwindow.cpp:306 po/rc.cpp:633 rc.cpp:633
 msgid "Play Queue"
-msgstr "Přehrát pořadí"
-
-#. i18n: file: gui/interfacesettings.ui:27
-#. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
-msgid "Artists"
-msgstr "Umělci"
-
-#. i18n: file: gui/interfacesettings.ui:202
-#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
-#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
-msgid "Playlists"
-msgstr "Seznamy"
+msgstr "Řada"
 
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:312
 msgid "Dynamic"
 msgstr "Dynamický"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:315 gui/preferencesdialog.cpp:89
+#: widgets/groupedview.cpp:251
+msgid "Streams"
+msgstr "Proudy"
+
+#: gui/mainwindow.cpp:318 gui/preferencesdialog.cpp:94
+msgid "Online"
+msgstr "Internet"
+
+#: gui/mainwindow.cpp:321
+msgid "Devices"
+msgstr "Zařízení"
+
+#: gui/mainwindow.cpp:324
 msgid "Expand All"
 msgstr "Rozbalit vše"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:325
 msgid "Collapse All"
 msgstr "Složit vše"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:326
 msgid "Remove All Songs"
 msgstr "Odstranit všechny písně"
 
-#: gui/mainwindow.cpp:398
+#: gui/mainwindow.cpp:456
 msgid "Info"
 msgstr "Informace"
 
-#: gui/mainwindow.cpp:405
-msgid "Auto Hide"
-msgstr "Automatické skrývání"
-
-#: gui/mainwindow.cpp:411
-msgid "Monochrome Icons"
-msgstr "Jednobarevné ikony"
-
-#: gui/mainwindow.cpp:541
+#: gui/mainwindow.cpp:585
 msgid "Server information..."
 msgstr "Informace o serveru..."
 
-#: gui/mainwindow.cpp:552
+#: gui/mainwindow.cpp:588
+msgid "Refresh Database"
+msgstr "Obnovit databázi"
+
+#: gui/mainwindow.cpp:602
 msgid "Configure Cantata..."
 msgstr "Nastavit Cantatu..."
 
-#: gui/mainwindow.cpp:559
+#: gui/mainwindow.cpp:612
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "O programu Cantata"
 
-#: gui/mainwindow.cpp:571
+#: gui/mainwindow.cpp:624
 msgid "&File"
 msgstr "&Soubor"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:628
+msgid "&Edit"
+msgstr "Úp&ravy"
+
+#: gui/mainwindow.cpp:631
 msgid "&Settings"
 msgstr "&Nastavení"
 
-#: gui/mainwindow.cpp:589 support/dialog.cpp:97
+#: gui/mainwindow.cpp:646 support/dialog.cpp:81
 msgid "&Help"
 msgstr "Nápo&věda"
 
-#: gui/mainwindow.cpp:948
+#: gui/mainwindow.cpp:1035
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
 "Nepodařilo se najít žádné písně odpovídající pravidlům dynamického seznamu "
 "skladeb."
 
-#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
+#: gui/mainwindow.cpp:1157 mpd/mpdconnection.cpp:401
 msgid "Connecting to %1"
 msgstr "Připojuje se k %1"
 
-#: gui/mainwindow.cpp:1151
+#: gui/mainwindow.cpp:1189
+msgid "Refresh MPD Database?"
+msgstr "Obnovit databázi MPD?"
+
+#: gui/mainwindow.cpp:1257
 msgid ""
 "Podcasts are currently being downloaded\n"
 "\n"
 "Quiting now will abort all downloads."
 msgstr ""
-"Záznamy se nyní stahují.\n"
+"Zvukové záznamy se nyní stahují.\n"
 "\n"
-"Pokud bude stahování přerušeno "
-"nyní, budou zrušena všechna stahování."
+"Pokud bude stahování přerušeno nyní, budou zrušena všechna stahování."
 
-#: gui/mainwindow.cpp:1152
+#: gui/mainwindow.cpp:1258
 msgid "Abort downloads and quit"
 msgstr "Zrušit stahování a ukončit."
 
-#: gui/mainwindow.cpp:1447
+#: gui/mainwindow.cpp:1577
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "O programu Cantata"
 
-#: gui/mainwindow.cpp:1448
+#: gui/mainwindow.cpp:1578
 msgctxt "Qt-only"
 msgid ""
-"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html"
-"\">GPLv3</a>"
+"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl."
+"html\">GPLv3</a>"
 msgstr ""
-"<b>Cantata %1</b><br/><br/>Klient pro MPD.<br/><br/>(c) Craig Drummond "
-"2011-2013.<br/>Vydáno pod <a href=\"http://www.gnu.org/licenses/gpl.html"
+"<b>Cantata %1</b><br/><br/>Klient pro MPD.<br/><br/>© Craig Drummond "
+"2011-2014.<br/>Vydáno pod <a href=\"http://www.gnu.org/licenses/gpl.html"
 "\">GPLv3</a>"
 
-#: gui/mainwindow.cpp:1450
+#: gui/mainwindow.cpp:1580
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
-"QtMPC Authors<br/>"
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"The QtMPC Authors<br/>"
 msgstr ""
-"<a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010  Autoři QtMPC<br/"
-">"
+"Založeno na <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010  "
+"Autoři QtMPC<br/>"
 
-#: gui/mainwindow.cpp:1451
+#: gui/mainwindow.cpp:1581
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
@@ -2411,7 +2471,7 @@ msgstr ""
 "Pozadí pohledu na souvislosti díky laskavosti <a href=\"http://www.fanart.tv"
 "\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1452
+#: gui/mainwindow.cpp:1582
 msgctxt "Qt-only"
 msgid ""
 "Context view metadata courtesy of <a href=\"http://www.wikipedia.org"
@@ -2420,7 +2480,7 @@ msgstr ""
 "Popisná data pohledu na souvislosti díky laskavosti <a href=\"http://www."
 "wikipedia.org\">Wikipedia</a> and <a href=\"http://www.last.fm\">Last.fm</a>"
 
-#: gui/mainwindow.cpp:1453
+#: gui/mainwindow.cpp:1583
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
@@ -2428,137 +2488,153 @@ msgstr ""
 "Zvažte, prosím, nahrání vašeho vlastního fanouškovského umění na <a href="
 "\"http://www.fanart.tv\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1594
 msgid ""
-"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Uptime:</td><td>%4</td></"
-"tr><tr><td align=\"right\">Time playing:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right"
+"\">Protocol version: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Uptime: </td><td>%4</td></tr><tr><td align=\"right"
+"\">Time playing: </td><td>%5</td></tr>"
 msgstr ""
-"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Verze:</"
-"td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Doba provozu:</td><td>%4</"
-"td></tr><tr><td align=\"right\">Doba přehrávání:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right"
+"\">Protokol verze: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Doba provozu:</td><td>%4</"
+"td></tr><tr><td align=\"right\">Doba přehrávání: </td><td>%5</td><"
+"/tr>"
 
-#: gui/mainwindow.cpp:1472
+#: gui/mainwindow.cpp:1602
 msgid ""
 "<tr><td colspan=\"2\"><b>Database</b></td></tr><tr><td align=\"right"
-"\">Artists:</td><td>%1</td></tr><tr><td align=\"right\">Albums:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Songs:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL handlers:</td><td>%4</td></tr><tr><td align=\"right\">Total "
-"duration:</td><td>%5</td></tr><tr><td align=\"right\">Last update:</td><td>"
-"%6</td></tr></table></p>"
+"\">Artists: </td><td>%1</td></tr><tr><td align=\"right\">Albums: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Songs: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Total duration: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Last update: </td><td>%6</td></tr></"
+"table></p>"
 msgstr ""
 "<tr><td colspan=\"2\"><b>Databáze</b></td></tr><tr><td align=\"right"
-"\">Artists:</td><td>%1</td></tr><tr><td align=\"right\">Alba:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Písně:</td><td>%3</td></tr><tr><td align="
-"\"right\">Zacházení s adresou (URL):</td><td>%4</td></tr><tr><td align="
-"\"right\">Celková doba trvání:</td><td>%5</td></tr><tr><td align=\"right"
-"\">Poslední aktualizace:</td><td>%6</td></tr></table></p>"
-
-#: gui/mainwindow.cpp:1481
+"\">Umělci:</td><td>%1</td></tr><tr><td align=\"right\">Alba: </td><td>%"
+"2</"
+"td></tr><tr><td align=\"right\">Písně: </td><td>%3</td></tr><tr><td "
+"align="
+"\"right\">Zacházení s adresou  (URL): </td><td>%4</td></tr><tr><td "
+"align="
+"\"right\">Celková  doba trvání: </td><td>%5</td></tr><tr><td "
+"align=\"right"
+"\">Poslední  aktualizace: </td><td>%6</td></tr></table></p>"
+
+#: gui/mainwindow.cpp:1611
 msgid "Server Information"
 msgstr "Informace o serveru"
 
-#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
+#: gui/mainwindow.cpp:1859 gui/mainwindow.cpp:1866
 msgid "Cantata (%1)"
 msgstr "Cantata (%1)"
 
-#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
+#: gui/mainwindow.cpp:1862 gui/mainwindow.cpp:1869
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: Cantata (%2)"
 
-#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
+#: gui/mainwindow.cpp:1863 gui/mainwindow.cpp:1870
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: Cantata"
 
-#: gui/mainwindow.cpp:1728
+#: gui/mainwindow.cpp:1874
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: Cantata (%3)"
 
-#: gui/mainwindow.cpp:1730
+#: gui/mainwindow.cpp:1876
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: Cantata"
 
-#: gui/mainwindow.cpp:1773
+#: gui/mainwindow.cpp:1919
 msgid "(Stream)"
 msgstr "(Proud)"
 
-#: gui/mainwindow.cpp:1775
+#: gui/mainwindow.cpp:1921
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
+#: gui/mainwindow.cpp:1939 widgets/groupedview.cpp:278
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1843
+#: gui/mainwindow.cpp:1989 mpd/mpdconnection.cpp:543 mpd/mpdconnection.cpp:550
 msgid "MPD reported the following error: %1"
 msgstr "MPD nahlásilo následující chybu: %1"
 
-#: gui/mainwindow.cpp:1990
+#: gui/mainwindow.cpp:2119
 msgid "Remove all songs from play queue?"
 msgstr "Odstranit všechny písně z řady skladeb k přehrání?"
 
-#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
+#: gui/mainwindow.cpp:2210 models/playqueuemodel.cpp:113
 msgid "Priority"
 msgstr "Přednost"
 
-#: gui/mainwindow.cpp:2080
+#: gui/mainwindow.cpp:2210
 msgid "Enter priority (0..255):"
 msgstr "Zadejte přednost (0..255):"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Playlist Name"
 msgstr "Název seznamu skladeb"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Enter a name for the playlist:"
 msgstr "Zadejte název pro seznam skladeb:"
 
-#: gui/mainwindow.cpp:2106
+#: gui/mainwindow.cpp:2236
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr ""
 "Seznam skladeb pojmenovaný <b>%1</b> již existuje!<br/>Přidat do tohoto "
 "seznamu skladeb?"
 
-#: gui/mainwindow.cpp:2107
+#: gui/mainwindow.cpp:2237
 msgid "Existing Playlist"
 msgstr "Existující seznam skladeb"
 
-#: gui/playbacksettings.cpp:42
-msgid "Do not fadeout"
-msgstr "Nezeslabovat"
+#: gui/mainwindow.cpp:2303
+msgid "Stream URL"
+msgstr "Adresa proudu"
 
-#: gui/playbacksettings.cpp:43
-msgid " ms"
-msgstr " ms"
+#: gui/mainwindow.cpp:2303
+msgid "Enter URL of stream:"
+msgstr "Zadejte adresu proudu (URL):"
+
+#: gui/mainwindow.cpp:2306
+msgid "Invalid, or unsupported, URL!"
+msgstr "Neplatná nebo nepodporovaná adresa (URL)!"
+
+#: gui/mainwindow.cpp:2889
+msgid "Can only edit tags of songs within MPD's music collection."
+msgstr "Značky písní je možné upravovat jen v hudební sbírce MPD."
 
-#. i18n: file: devices/albumdetails.ui:165
+#. i18n: file: devices/albumdetails.ui:158
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
-#: gui/playbacksettings.cpp:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
-#: rc.cpp:79
+#: gui/playbacksettings.cpp:47 models/playqueuemodel.cpp:108 po/rc.cpp:110
+#: rc.cpp:110
 msgid "Track"
 msgstr "Skladba"
 
-#: gui/playbacksettings.cpp:51
+#: gui/playbacksettings.cpp:49
 msgid "Auto"
 msgstr "Automaticky"
 
-#: gui/playbacksettings.cpp:164
+#: gui/playbacksettings.cpp:161
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
 msgstr ""
 "<i>Připojeno k %1.<br/>Záznamy níže použít na nyní připojenou sbírku MPD.</i>"
 
-#. i18n: file: gui/playbacksettings.ui:26
+#. i18n: file: gui/playbacksettings.ui:114
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
+#: gui/playbacksettings.cpp:164 po/rc.cpp:769 rc.cpp:769
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
@@ -2566,7 +2642,7 @@ msgstr ""
 "<i>Nepřipojeno.<br/>Záznamy níže nelze změnit, protože Cantata není "
 "připojena k MPD.</i>"
 
-#: gui/playbacksettings.cpp:174
+#: gui/playbacksettings.cpp:171
 msgid ""
 "<p>Replay Gain is a proposed standard published in 2001 to normalize the "
 "perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It "
@@ -2591,135 +2667,201 @@ msgstr ""
 "vyrovnání hlasitosti u skladby, v případě že je zapnuto náhodné přehrávání, "
 "jinak se použijí značky u alba.</li></ul></p>"
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:95 widgets/playqueueview.cpp:160
+msgid "Stretch Columns To Fit Window"
+msgstr "Roztáhnout sloupce tak, aby se vešly do okna"
+
+#: gui/playlistspage.cpp:146 tags/tageditor.cpp:828 tags/trackorganiser.cpp:72
 msgid "Rename"
 msgstr "Přejmenovat"
 
-#: gui/playlistspage.cpp:190
+#: gui/playlistspage.cpp:147 models/playqueuemodel.cpp:156
+msgid "Remove Duplicates"
+msgstr "Odstranit zdvojené"
+
+#: gui/playlistspage.cpp:309
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
 msgstr ""
-"Opravdu chcete odstranit vybraný seznam skladeb?\n"
+"Opravdu chcete odstranit vybrané seznamy skladeb?\n"
 "Tento krok nelze vrátit zpět."
 
-#: gui/playlistspage.cpp:191
+#: gui/playlistspage.cpp:310
 msgid "Remove Playlists"
 msgstr "Odstranit seznamy skladeb"
 
-#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
+#: gui/playlistspage.cpp:330 gui/playlistspage.cpp:357
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr "Seznam skladeb pojmenovaný <b>%1</b> již existuje!<br/>Přepsat?"
 
-#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
+#: gui/playlistspage.cpp:331 gui/playlistspage.cpp:358
 msgid "Overwrite Playlist"
 msgstr "Přepsat seznam skladeb"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Rename Playlist"
 msgstr "Přejmenovat seznam skladeb"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Enter new name for playlist:"
 msgstr "Zadejte nový název pro seznam skladeb:"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/playlistspage.cpp:446
+msgid "Cannot add songs from '%1' to '%2'"
+msgstr "Nelze přidat písně z '%1' do '%2'"
+
+#: gui/preferencesdialog.cpp:83
 msgid "Collection Settings"
 msgstr "Nastavení sbírky"
 
-#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: file: gui/playbacksettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
+#: gui/preferencesdialog.cpp:84 po/rc.cpp:742 rc.cpp:742
 msgid "Playback"
 msgstr "Přehrávání"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:84
 msgid "Playback Settings"
 msgstr "Nastavení přehrávání"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "Files"
 msgstr "Soubory"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "File Settings"
 msgstr "Nastavení souborů"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface"
 msgstr "Rozhraní"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface Settings"
 msgstr "Nastavení rozhraní"
 
-#: gui/preferencesdialog.cpp:85
+#: gui/preferencesdialog.cpp:89
 msgid "Streams Settings"
 msgstr "Nastavení proudů"
 
-#: gui/preferencesdialog.cpp:89
+#: gui/preferencesdialog.cpp:94
 msgid "Online Providers"
 msgstr "Internetoví poskytovatelé"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context"
 msgstr "Souvislosti"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context View Settings"
 msgstr "Nastavení pohledu na souvislosti"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server"
 msgstr "Server HTTP"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server Settings"
 msgstr "Nastavení serveru HTTP"
 
-#: gui/preferencesdialog.cpp:103
+#: gui/preferencesdialog.cpp:115
 msgid "Audio CD Settings"
 msgstr "Nastavení zvukového CD"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgid "Proxy"
 msgstr "Proxy"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "Nastavení proxy"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "Zkratky"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "Nastavení klávesových zkratek"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cache"
 msgstr "Vyrovnávací paměť"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cached Items"
 msgstr "Položky ve vyrovnávací paměti"
 
-#: gui/preferencesdialog.cpp:116
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#: gui/preferencesdialog.cpp:128 po/rc.cpp:53 po/rc.cpp:65 po/rc.cpp:410
+#: rc.cpp:53 rc.cpp:65 rc.cpp:410
 msgid "Configure"
 msgstr "Nastavit"
 
-#: gui/serversettings.cpp:87
-msgid ""
-"<i> This folder will also be used to locate music files for transferring to "
-"(and from) devices.</i>"
-msgstr ""
-"<i> Tato složka se také použije na umístění hudebních souborů pro přenos na "
-"(a ze) zařízení.</i>"
-
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#: gui/searchpage.cpp:200 po/rc.cpp:89 po/rc.cpp:371 po/rc.cpp:950 rc.cpp:89
+#: rc.cpp:371 rc.cpp:950
+msgid "Composer:"
+msgstr "Skladatel:"
+
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#: gui/searchpage.cpp:205 po/rc.cpp:95 po/rc.cpp:962 rc.cpp:95 rc.cpp:962
+msgid "Genre:"
+msgstr "Žánr:"
+
+#: gui/searchpage.cpp:206
+msgid "Date:"
+msgstr "Datum:"
+
+#: gui/searchpage.cpp:208
+msgid "Any:"
+msgstr "Jakékoli:"
+
+#: gui/searchpage.cpp:215
+msgid "No tracks found."
+msgstr "Nenalezeny žádné skladby"
+
+#: gui/serversettings.cpp:87
+msgid ""
+"<i> This folder will also be used to locate music files for transferring to "
+"(and from) devices.</i>"
+msgstr ""
+"<i> Tato složka se také použije na umístění hudebních souborů pro přenos na "
+"(a ze) zařízení.</i>"
+
 #: gui/serversettings.cpp:100
 msgid "Not used"
 msgstr "Nepoužíváno"
@@ -2736,8 +2878,8 @@ msgstr "Nepoužíváno"
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
-#: gui/serversettings.cpp:103 po/rc.cpp:208 po/rc.cpp:247 po/rc.cpp:705
-#: rc.cpp:208 rc.cpp:247 rc.cpp:705
+#: gui/serversettings.cpp:103 po/rc.cpp:269 po/rc.cpp:308 po/rc.cpp:857
+#: rc.cpp:269 rc.cpp:308 rc.cpp:857
 msgid "Host:"
 msgstr "Server:"
 
@@ -2785,7 +2927,7 @@ msgstr ""
 "% bude nahrazen umělcem alba současné písně, a %album% bude nahrazeno názvem "
 "alba.</i></p>"
 
-#: gui/serversettings.cpp:252
+#: gui/serversettings.cpp:257
 msgid ""
 "Which type of collection do you wish to connect to?<br/><ul><li>Standard - "
 "music collection may be shared, is on another machine, or is already setup</"
@@ -2797,81 +2939,65 @@ msgstr ""
 "hudební sbírka není sdílena s ostatními, a Cantata nastaví a bude řídit "
 "instanci MPD</li></ul>"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Add Collection"
 msgstr "Přidat sbírku"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Standard"
 msgstr "Obvyklý"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Basic"
 msgstr "Základní"
 
-#: gui/serversettings.cpp:297
+#: gui/serversettings.cpp:302
 msgid "Delete <b>%1</b>?"
 msgstr "Smazat <b>%1</b>?"
 
-#: gui/serversettings.cpp:298
+#: gui/serversettings.cpp:303
 msgid "Delete"
 msgstr "Smazat"
 
-#: gui/serversettings.cpp:336
+#: gui/serversettings.cpp:341
 msgid "New Collection %1"
 msgstr "Nová sbírka %1"
 
-#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
+#: gui/serversettings.cpp:357 mpd/mpdconnection.cpp:173
 msgid "Default"
 msgstr "Výchozí"
 
-#: gui/shortcutssettingspage.cpp:74
+#: gui/shortcutssettingspage.cpp:76
 msgid "Multi-Media Keys"
 msgstr "Multimediální klávesy"
 
-#: gui/shortcutssettingspage.cpp:80
+#: gui/shortcutssettingspage.cpp:82
 msgid "Do not use media keys to control Cantata"
 msgstr "Nepoužívat multimediální klávesy pro ovládání Cantaty"
 
-#: gui/shortcutssettingspage.cpp:81
+#: gui/shortcutssettingspage.cpp:83 gui/shortcutssettingspage.cpp:97
 msgid "Use media keys to control Cantata"
 msgstr "Používat multimediální klávesy pro ovládání Cantaty"
 
-#: gui/shortcutssettingspage.cpp:84
+#: gui/shortcutssettingspage.cpp:86 gui/shortcutssettingspage.cpp:104
 msgid "Use media keys, as configured in desktop settings, to control Cantata"
 msgstr ""
 "Používat multimediální klávesy, jak jsou nastaveny v nastavení pracovního "
 "prostředí, pro ovládání Cantaty"
 
-#: gui/shortcutssettingspage.cpp:85
+#: gui/shortcutssettingspage.cpp:87 gui/shortcutssettingspage.cpp:105
 msgid ""
 "Use media keys, as configured in GNOME/Unity settings, to control Cantata"
 msgstr ""
 "Používat multimediální klávesy, jak jsou nastaveny v nastavení GNOME/Unity, "
 "pro ovládání Cantaty"
 
-#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
-#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+#: gui/shortcutssettingspage.cpp:90 gui/shortcutssettingspage.cpp:107
+#: online/onlineservicespage.cpp:99 streams/streamspage.cpp:99
+#: support/fancytabwidget.cpp:825
 msgid "Configure..."
 msgstr "Nastavit..."
 
-#: gui/shortcutssettingspage.cpp:95
-msgid "Use media keys to control Cantata:"
-msgstr "Používat multimediální klávesy pro ovládání Cantaty:"
-
-#: gui/shortcutssettingspage.cpp:106
-msgid "Use media keys, as configured in desktop settings, to control Cantata:"
-msgstr ""
-"Používat multimediální klávesy, jak jsou nastaveny v nastavení pracovního "
-"prostředí, pro ovládání Cantaty:"
-
-#: gui/shortcutssettingspage.cpp:107
-msgid ""
-"Use media keys, as configured in GNOME/Unity settings, to control Cantata:"
-msgstr ""
-"Používat multimediální klávesy, jak jsou nastaveny v nastavení GNOME/Unity, "
-"pro ovládání Cantaty:"
-
 #: gui/stdactions.cpp:55
 msgid "Previous Track"
 msgstr "Předchozí skladba"
@@ -2902,7 +3028,7 @@ msgstr "Uložit jako"
 
 #: gui/stdactions.cpp:64
 msgid "Add To Play Queue"
-msgstr "Přidat do řady přehrávaných skladeb"
+msgstr "Přidat do řady skladeb k přehrání"
 
 #: gui/stdactions.cpp:65
 msgid "Add Albums In Random Order"
@@ -2910,7 +3036,7 @@ msgstr "Přidat alba v náhodném pořadí"
 
 #: gui/stdactions.cpp:66
 msgid "Replace Play Queue"
-msgstr "Nahradit řadu přehrávaných skladeb"
+msgstr "Nahradit řadu skladeb k přehrání"
 
 #: gui/stdactions.cpp:67
 msgid "Add With Priority"
@@ -2944,7 +3070,7 @@ msgstr "Vlastní přednost..."
 msgid "Add To Playlist"
 msgstr "Přidat do seznamu skladeb"
 
-#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:66
 msgid "Organize Files"
 msgstr "Uspořádat soubory"
 
@@ -2952,7 +3078,7 @@ msgstr "Uspořádat soubory"
 msgid "Edit Tags"
 msgstr "Upravit značky"
 
-#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:106
 msgid "ReplayGain"
 msgstr "Vyrovnání hlasitosti"
 
@@ -2965,88 +3091,89 @@ msgid "Set Image"
 msgstr "Nastavit obrázek"
 
 #: gui/stdactions.cpp:88
-msgid "Refresh Database"
-msgstr "Obnovit databázi"
-
-#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "Zpět"
 
-#: gui/trayitem.cpp:192
+#: gui/stdactions.cpp:91
+msgid "Find"
+msgstr "Najít"
+
+#: gui/trayitem.cpp:210
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%1 na %2"
 
-#: gui/trayitem.cpp:193
+#: gui/trayitem.cpp:211
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%1 na %2 (%3)"
 
-#: gui/trayitem.cpp:195
+#: gui/trayitem.cpp:213
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%1 od %2 na %3"
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:214
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr "%1 od %2 na %3 (%4)"
 
-#: gui/trayitem.cpp:223
+#: gui/trayitem.cpp:241
 msgid "Now playing"
 msgstr "Nyní se hraje"
 
-#: http/httpserversettings.cpp:40
+#: http/httpserversettings.cpp:39
 msgid "Local loopback (%1)"
 msgstr "Místní smyčka (%1)"
 
-#: http/httpserversettings.cpp:43
+#: http/httpserversettings.cpp:42
 msgid "Wired (%1)"
 msgstr "Drátové (%1)"
 
-#: http/httpserversettings.cpp:46
+#: http/httpserversettings.cpp:45
 msgid "Wireless (%1)"
 msgstr "Bezdrátové (%1)"
 
-#: http/httpserversettings.cpp:53
+#: http/httpserversettings.cpp:52
 msgid "First active interface"
-msgstr "První činné rozhraní"
+msgstr "První činné"
 
-#: http/httpserversettings.cpp:98
-msgid "Inactive"
-msgstr "Nečinné"
+#: models/albumsmodel.cpp:260 models/musicmodel.cpp:254
+msgctxt "Album by Artist"
+msgid "%1 by %2"
+msgstr "%1 od %2"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:221
+#: models/musicmodel.cpp:133
 msgid "Cue Sheet"
 msgstr "List CUE"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:220
+#: models/musicmodel.cpp:133
 msgid "Playlist"
 msgstr "Seznam skladeb"
 
-#: models/devicesmodel.cpp:108
+#: models/devicesmodel.cpp:116
 msgid "Configure Device"
 msgstr "Nastavit zařízení"
 
-#: models/devicesmodel.cpp:109
+#: models/devicesmodel.cpp:117
 msgid "Refresh Device"
 msgstr "Obnovit zařízení"
 
-#: models/devicesmodel.cpp:110
+#: models/devicesmodel.cpp:118
 msgid "Connect Device"
 msgstr "Připojit zařízení"
 
-#: models/devicesmodel.cpp:111
+#: models/devicesmodel.cpp:119
 msgid "Disconnect Device"
 msgstr "Odpojit zařízení"
 
-#: models/devicesmodel.cpp:113
+#: models/devicesmodel.cpp:121
 msgid "Edit CD Details"
 msgstr "Upravit podrobnosti CD"
 
-#: models/devicesmodel.cpp:690
+#: models/devicesmodel.cpp:730
 msgid "No Devices Attached"
 msgstr "Nepřipojeno žádné zařízení"
 
@@ -3078,46 +3205,46 @@ msgstr "Přihlášen (vypršení: %1)"
 msgid "Session expired"
 msgstr "Sezení vypršelo"
 
-#: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
+#: models/dirviewmodel.cpp:204 models/dirviewmodel.cpp:212
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:696
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "Jedna položka"
 msgstr[1] "%1 položky"
 msgstr[2] "%1 položek"
 
-#: models/dirviewmodel.cpp:190
+#: models/dirviewmodel.cpp:219
 msgid "Audio File"
 msgstr "Zvukový soubor"
 
-#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
-#: models/musiclibraryitemroot.cpp:844
+#: models/musiclibraryitemartist.cpp:248 models/musiclibraryitemartist.cpp:261
+#: models/musiclibraryitemroot.cpp:840
 msgid "Single Tracks"
 msgstr "Jednotlivé skladby"
 
-#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
-#: widgets/groupedview.cpp:366
+#: models/musicmodel.cpp:190 models/onlineservicesmodel.cpp:167
+#: widgets/groupedview.cpp:364
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "Jedna skladba"
 msgstr[1] "%1 skladby"
 msgstr[2] "%1 skladeb"
 
-#: models/musicmodel.cpp:185
+#: models/musicmodel.cpp:196
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "Jeden umělec"
 msgstr[1] "%1 umělci"
 msgstr[2] "%1 umělců"
 
-#: models/musicmodel.cpp:192
+#: models/musicmodel.cpp:203
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "Jedno album"
 msgstr[1] "%1 alba"
 msgstr[2] "%1 alb"
 
-#: models/musicmodel.cpp:198
+#: models/musicmodel.cpp:209
 msgid "1 Episode"
 msgid_plural "%1 Episodes"
 msgstr[0] "Jeden díl"
@@ -3126,188 +3253,195 @@ msgstr[2] "%1 dílů"
 
 #. i18n: file: online/onlinesettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: models/onlineservicesmodel.cpp:83 po/rc.cpp:720 rc.cpp:720
+#: models/onlineservicesmodel.cpp:91 po/rc.cpp:872 rc.cpp:872
 msgid "Configure Service"
 msgstr "Nastavit službu"
 
-#: models/onlineservicesmodel.cpp:84
+#: models/onlineservicesmodel.cpp:92
 msgid "Refresh Service"
 msgstr "Obnovit službu"
 
-#: models/onlineservicesmodel.cpp:85
+#: models/onlineservicesmodel.cpp:93
 msgid "Add Subscription"
 msgstr "Přidat odběr"
 
-#: models/onlineservicesmodel.cpp:86
+#: models/onlineservicesmodel.cpp:94
 msgid "Remove Subscription"
 msgstr "Odstranit odběr"
 
-#: models/onlineservicesmodel.cpp:87
+#: models/onlineservicesmodel.cpp:95
 msgid "Refresh Subscription"
 msgstr "Obnovit odběr"
 
-#: models/onlineservicesmodel.cpp:137
+#: models/onlineservicesmodel.cpp:145
 msgid "Last Search:%1"
 msgstr "Poslední hledání: %1"
 
-#: models/onlineservicesmodel.cpp:149
-msgid "Searching..."
-msgstr "Hledá se..."
-
-#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
-#: models/streamsmodel.cpp:670
+#: models/onlineservicesmodel.cpp:160 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:691
 msgid "Not Loaded"
 msgstr "Nenahráno"
 
-#: models/onlineservicesmodel.cpp:155
+#: models/onlineservicesmodel.cpp:163
 msgid "Use search to locate tracks"
 msgstr "Použít hledání k nalezení skladeb"
 
-#: models/onlineservicesmodel.cpp:166
+#: models/onlineservicesmodel.cpp:174
 msgid "1 Podcast"
 msgid_plural "%1 Podcasts"
 msgstr[0] "Jeden záznam"
 msgstr[1] "%1 záznamy"
 msgstr[2] "%1 záznamů"
 
-#: models/onlineservicesmodel.cpp:177
+#: models/onlineservicesmodel.cpp:185
 msgid "(Downloading: %1%)"
 msgstr "(Stahuje se: %1%)"
 
-#: models/onlineservicesmodel.cpp:235
+#: models/onlineservicesmodel.cpp:243
 msgctxt "podcast name (num unplayed episodes)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: models/playlistsmodel.cpp:77
+#: models/playlistsmodel.cpp:105
 msgid "New Playlist..."
 msgstr "Nový seznam skladeb..."
 
-#: models/playqueuemodel.cpp:102
-msgctxt "Track Number (#)"
-msgid "#"
-msgstr "#"
+#: models/playlistsmodel.cpp:321
+msgid "Smart Playlist"
+msgstr "Chytrý seznam skladeb"
 
-#: models/playqueuemodel.cpp:103
+#: models/playqueuemodel.cpp:109
 msgid "Length"
 msgstr "Délka"
 
-#: models/playqueuemodel.cpp:104
+#: models/playqueuemodel.cpp:110
 msgid "Disc"
 msgstr "Disk"
 
-#. i18n: file: devices/filenameschemedialog.ui:138
+#. i18n: file: devices/filenameschemedialog.ui:174
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
+#: models/playqueuemodel.cpp:111 po/rc.cpp:248 rc.cpp:248
 msgid "Year"
 msgstr "Rok"
 
-#: models/playqueuemodel.cpp:360
+#: models/playqueuemodel.cpp:158
+msgid "Undo"
+msgstr "Zpět"
+
+#: models/playqueuemodel.cpp:160
+msgid "Redo"
+msgstr "Znovu"
+
+#: models/playqueuemodel.cpp:404
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(Přednost: %1)</b>"
 
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:693
 msgid "Loading..."
 msgstr "Nahrává se..."
 
-#: models/streamsmodel.cpp:286
+#: models/streamsmodel.cpp:302
 msgid "Bookmarks"
 msgstr "Záložky"
 
-#: models/streamsmodel.cpp:560
+#: models/streamsmodel.cpp:576
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:563
+#: models/streamsmodel.cpp:579
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:564
+#: models/streamsmodel.cpp:580
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:567
+#: models/streamsmodel.cpp:583
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:568
+#: models/streamsmodel.cpp:584
+msgid "Radio GFM"
+msgstr "Rádio GFM"
+
+#: models/streamsmodel.cpp:585
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: models/streamsmodel.cpp:569
+#: models/streamsmodel.cpp:586
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:570
+#: models/streamsmodel.cpp:587
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:571
+#: models/streamsmodel.cpp:588
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:572
+#: models/streamsmodel.cpp:589
 msgid "Favorites"
 msgstr "Oblíbené"
 
-#: models/streamsmodel.cpp:573
+#: models/streamsmodel.cpp:590
 msgid "Listen Live"
 msgstr "Poslouchat živě"
 
-#: models/streamsmodel.cpp:578
+#: models/streamsmodel.cpp:595
 msgid "Bookmark Category"
 msgstr "Skupina záložky"
 
-#: models/streamsmodel.cpp:579
+#: models/streamsmodel.cpp:596
 msgid "Add Stream To Favorites"
 msgstr "Přidat proud do oblíbených"
 
-#: models/streamsmodel.cpp:580
+#: models/streamsmodel.cpp:597
 msgid "Configure Streams"
 msgstr "Nastavit proudy"
 
-#: models/streamsmodel.cpp:660
+#: models/streamsmodel.cpp:681
 msgid "%1 (Read-Only)"
 msgstr "%1 (Pouze pro čtení)"
 
-#: models/streamsmodel.cpp:1241
+#: models/streamsmodel.cpp:1261
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr ""
 "Nepodařilo se uložit seznam proudu. Prověřte, prosím, že je %1 zapisovatelný."
 
-#: models/streamsmodel.cpp:1639
+#: models/streamsmodel.cpp:1659
 msgid "All"
 msgstr "Vše"
 
-#: mpd/mpdconnection.cpp:154
+#: mpd/mpdconnection.cpp:179
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "\"%1\""
 
-#: mpd/mpdconnection.cpp:156
+#: mpd/mpdconnection.cpp:181
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr "\"%1\" (%2:%3)"
 
-#: mpd/mpdconnection.cpp:372 mpd/mpdconnection.cpp:415
-#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
-#: mpd/mpdconnection.cpp:1036
+#: mpd/mpdconnection.cpp:406 mpd/mpdconnection.cpp:451
+#: mpd/mpdconnection.cpp:501 mpd/mpdconnection.cpp:1137
+#: mpd/mpdconnection.cpp:1164
 msgid "Connection to %1 failed"
 msgstr "Nepodařilo se připojit k %1"
 
-#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
+#: mpd/mpdconnection.cpp:412 mpd/mpdconnection.cpp:455
 msgid "Connection to %1 failed - incorrect password"
 msgstr "Nepodařilo se připojit k %1 - nesprávné heslo"
 
-#: mpd/mpdconnection.cpp:455
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to send command to %1 - not connected"
 msgstr "Nepodařilo se poslat příkaz %1 - nepřipojeno"
 
-#: mpd/mpdconnection.cpp:491
+#: mpd/mpdconnection.cpp:539
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr "Nepodařilo se nahrát. Ověřte, prosím, zda má mpd oprávnění ke čtení."
 
-#: mpd/mpdconnection.cpp:493
+#: mpd/mpdconnection.cpp:541
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
@@ -3315,23 +3449,23 @@ msgstr ""
 "Nepodařilo se nahrát. MPD může přehrát jen místní soubory, pokud je připojen "
 "přes místní zásuvku."
 
-#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
+#: mpd/mpdconnection.cpp:547 mpd/mpdconnection.cpp:558
 msgid "Failed to send command. Disconnected from %1"
 msgstr "Nepodařilo se poslat příkaz. Odpojeno od %1"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1306
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr "Nepodařilo se přejmenovat <b>%1</b> na <b>%2</b>"
 
-#: mpd/mpdconnection.cpp:1183
+#: mpd/mpdconnection.cpp:1318
 msgid "Failed to save <b>%1</b>"
 msgstr "Nepodařilo se uložit <b>%1</b>!"
 
-#: mpd/mpdconnection.cpp:1196
+#: mpd/mpdconnection.cpp:1331
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr "Nelze přidat části seznamu v souboru CUE do seznamu skladeb!"
 
-#: mpd/mpdconnection.cpp:1199
+#: mpd/mpdconnection.cpp:1334
 msgid "You cannot add a playlist to another playlist!"
 msgstr "Nelze přidat seznam skladeb do jiného seznamu skladeb!"
 
@@ -3339,7 +3473,15 @@ msgstr "Nelze přidat seznam skladeb do jiného seznamu skladeb!"
 msgid "Personal"
 msgstr "Osobní"
 
-#: mpd/song.cpp:343
+#: mpd/song.cpp:62
+msgid "Unknown"
+msgstr "Neznámý"
+
+#: mpd/song.cpp:63
+msgid "Various Artists"
+msgstr "Různí umělci"
+
+#: mpd/song.cpp:427
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3409,8 +3551,8 @@ msgstr "Nastavení pro Magnatune"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
-#: rc.cpp:711 rc.cpp:729
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:863 po/rc.cpp:881
+#: rc.cpp:863 rc.cpp:881
 msgid "Username:"
 msgstr "Uživatelské jméno:"
 
@@ -3438,9 +3580,9 @@ msgstr "Uživatelské jméno:"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPasswordLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:220 po/rc.cpp:238
-#: po/rc.cpp:412 po/rc.cpp:647 po/rc.cpp:714 po/rc.cpp:732 rc.cpp:220
-#: rc.cpp:238 rc.cpp:412 rc.cpp:647 rc.cpp:714 rc.cpp:732
+#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:281 po/rc.cpp:299
+#: po/rc.cpp:476 po/rc.cpp:802 po/rc.cpp:866 po/rc.cpp:884 rc.cpp:281
+#: rc.cpp:299 rc.cpp:476 rc.cpp:802 rc.cpp:866 rc.cpp:884
 msgid "Password:"
 msgstr "Heslo:"
 
@@ -3480,155 +3622,179 @@ msgstr "Nepodařilo se stáhnout"
 msgid "Download To Library"
 msgstr "Stáhnout do knihovny"
 
-#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
-msgid "Search For Podcasts"
-msgstr "Hledat záznamy"
-
-#: online/onlineservicespage.cpp:63
+#: online/onlineservicespage.cpp:62
 msgid "Download Podcast Episodes"
 msgstr "Stáhnout díly záznamů"
 
-#: online/onlineservicespage.cpp:64
+#: online/onlineservicespage.cpp:63
 msgid "Delete Downloaded Podcast Episodes"
 msgstr "Smazat stažené díly záznamů"
 
-#: online/onlineservicespage.cpp:329
+#: online/onlineservicespage.cpp:320
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "Hledání %1:"
 
-#: online/onlineservicespage.cpp:464
+#: online/onlineservicespage.cpp:458
 msgid "Re-download music listing for %1?"
 msgstr "Stáhnout znovu seznam hudby pro %1?"
 
-#: online/onlineservicespage.cpp:532
-msgid "Subscribe to Podcast"
-msgstr "Přihlásit se k odběru záznamu"
-
-#: online/onlineservicespage.cpp:532
-msgid "Enter podcast URL:"
-msgstr "Zadejte adresu záznamu (URL):"
-
-#: online/onlineservicespage.cpp:541
-msgid "Invalid URL!"
-msgstr "Neplatná adresa (URL)!"
-
-#: online/onlineservicespage.cpp:546
-msgid "You are already subscribed to this URL!"
-msgstr "Již jste přihlášen k odběru z této adresy (URL)!"
-
-#: online/onlineservicespage.cpp:550
-msgid "Already downloading this URL!"
-msgstr "Již se stahuje z této adresy (URL)!"
-
-#: online/onlineservicespage.cpp:579
+#: online/onlineservicespage.cpp:544
 msgid "Unsubscribe from <b>%1</b>?"
 msgstr "Odhlásit odběr z <b>%1</b>?"
 
-#: online/onlineservicespage.cpp:600
+#: online/onlineservicespage.cpp:565
 msgid "Refresh all podcast listings?"
-msgstr "Obnovit všechny soupisy záznamů?"
+msgstr "Obnovit všechny soupisy zvukových záznamů?"
 
-#: online/onlineservicespage.cpp:621
+#: online/onlineservicespage.cpp:586
 msgid "Refresh episode listing from <b>%1</b>?"
 msgstr "Obnovit soupis dílů z <b>%1</b>?"
 
-#: online/onlineservicespage.cpp:695
+#: online/onlineservicespage.cpp:652
 msgid "All selected podcasts have already been downloaded!"
-msgstr "Všechny vybrané záznamy již byly staženy!"
+msgstr "Všechny vybrané zvukové záznamy již byly staženy!"
 
-#: online/onlineservicespage.cpp:699
+#: online/onlineservicespage.cpp:656
 msgid "Do you wish to download the following podcast episode?"
-msgstr "Chcete stáhnout následující díl záznamu?"
+msgstr "Chcete stáhnout následující díl zvukového záznamu?"
 
-#: online/onlineservicespage.cpp:702
+#: online/onlineservicespage.cpp:659
 msgid "Do you wish to download the following podcast episodes?"
-msgstr "Chcete stáhnout následující díly záznamu?"
+msgstr "Chcete stáhnout následující díly zvukového záznamu?"
 
-#: online/onlineservicespage.cpp:705
+#: online/onlineservicespage.cpp:662
 msgid "Do you wish to download the selected podcast episodes?"
-msgstr "Chcete stáhnout vybrané díly záznamu?"
+msgstr "Chcete stáhnout vybrané díly zvukového záznamu?"
 
-#: online/onlineservicespage.cpp:753
+#: online/onlineservicespage.cpp:710
 msgid "All selected downloaded podcast episodes have already been deleted!"
 msgstr "Všechny vybrané stažené díly záznamu již byly smazány!"
 
-#: online/onlineservicespage.cpp:757
+#: online/onlineservicespage.cpp:714
 msgid ""
 "Do you wish to delete the downloaded file of the following podcast episode?"
-msgstr "Chcete smazat stažený soubor následujícího dílu záznamu?"
+msgstr "Chcete smazat stažený soubor následujícího dílu zvukového záznamu?"
 
-#: online/onlineservicespage.cpp:760
+#: online/onlineservicespage.cpp:717
 msgid ""
 "Do you wish to the delete downloaded files of the following podcast episodes?"
-msgstr "Chcete smazat stažené soubory následujících dílů záznamu?"
+msgstr "Chcete smazat stažené soubory následujících dílů zvukového záznamu?"
 
-#: online/onlineservicespage.cpp:763
+#: online/onlineservicespage.cpp:720
 msgid ""
 "Do you wish to the delete downloaded files of the selected podcast episodes?"
-msgstr "Chcete smazat stažené soubory vybraných dílů záznamu?"
+msgstr "Chcete smazat stažené soubory vybraných dílů zvukového záznamu?"
 
-#: online/podcastsearchdialog.cpp:243
+#: online/podcastsearchdialog.cpp:253
 msgid "RSS:"
 msgstr "RSS:"
 
-#: online/podcastsearchdialog.cpp:245
+#: online/podcastsearchdialog.cpp:255
 msgid "Website:"
 msgstr "Stránky:"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Podcast details"
 msgstr "Podrobnosti záznamu"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Select a podcast to display its details"
 msgstr "Vybrat záznam pro zobrazení jeho podrobností"
 
-#: online/podcastsearchdialog.cpp:322
+#: online/podcastsearchdialog.cpp:333
 msgid "Enter search term..."
 msgstr "Zadat hledaný pojem..."
 
-#: online/podcastsearchdialog.cpp:372
+#: online/podcastsearchdialog.cpp:383
 msgid "Failed to fetch podcasts from %1"
-msgstr "Nepodařilo se natáhnout záznamy z %1"
+msgstr "Nepodařilo se natáhnout zvukové záznamy z %1"
 
-#: online/podcastsearchdialog.cpp:378
+#: online/podcastsearchdialog.cpp:389
 msgid "There was a problem parsing the response from %1"
 msgstr "Nastaly potíže se zpracováním odpovědi z %1"
 
-#: online/podcastsearchdialog.cpp:439
+#: online/podcastsearchdialog.cpp:450
 msgid "Failed to download directory listing"
 msgstr "Nepodařilo se stáhnout soupis adresáře"
 
-#: online/podcastsearchdialog.cpp:447
+#: online/podcastsearchdialog.cpp:458
 msgid "Failed to parse directory listing"
 msgstr "Nepodařilo se zpracovat soupis adresáře"
 
 #: online/podcastsearchdialog.cpp:508
+msgid "URL"
+msgstr "Adresa (URL)"
+
+#: online/podcastsearchdialog.cpp:517
+msgid "Enter podcast URL..."
+msgstr "Zadejte adresu zvukového záznamu (URL)..."
+
+#: online/podcastsearchdialog.cpp:518
+msgid "Load"
+msgstr "Nahrát"
+
+#: online/podcastsearchdialog.cpp:525
+msgid "Enter podcast URL below, and press 'Load'"
+msgstr "Zadejte adresu zvukového záznamu (URL) níže a stiskněte Nahrát"
+
+#: online/podcastsearchdialog.cpp:552
+msgid "Invalid URL!"
+msgstr "Neplatná adresa (URL)!"
+
+#: online/podcastsearchdialog.cpp:562
+msgid "Failed to fetch podcast!"
+msgstr "Nepodařilo se natáhnout zvukový záznam!"
+
+#: online/podcastsearchdialog.cpp:567
+msgid "Failed to parse podcast."
+msgstr "Nepodařilo se zpracovat zvukový záznam."
+
+#: online/podcastsearchdialog.cpp:571
+msgid ""
+"Cantata only supports audio podcasts! The URL entered contains only video "
+"podcasts."
+msgstr ""
+"Cantata podporuje pouze záznamy zvuku! Zadaná adresa (URL) obsahuje jen "
+"záznamy obrazu."
+
+#: online/podcastsearchdialog.cpp:589
 msgid "Subscribe"
 msgstr "Odebírat"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:607
+msgid "Enter URL"
+msgstr "Zadat adresu (URL)"
+
+#: online/podcastsearchdialog.cpp:607
+msgid "Manual podcast URL"
+msgstr "Ruční adresa zvukového záznamu (URL)"
+
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search %1"
 msgstr "Hledat %1"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search for podcasts on %1"
-msgstr "Hledat záznamy na %1"
+msgstr "Hledat zvukové záznamy na %1"
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1"
 msgstr "Procházet %1"
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1 podcasts"
-msgstr "Procházet %1 záznamů"
+msgstr "Procházet %1 zvukových záznamů"
+
+#: online/podcastsearchdialog.cpp:639
+msgid "Add Podcast Subscription"
+msgstr "Přidat odběr zvukového záznamu"
 
-#: online/podcastsearchdialog.cpp:602
+#: online/podcastsearchdialog.cpp:695
 msgid "Subscription added"
 msgstr "Odběr přidán"
 
-#: online/podcastsearchdialog.cpp:604
+#: online/podcastsearchdialog.cpp:697
 msgid "You are already subscribed to this podcast!"
 msgstr "Již jste přihlášen k odběru tohoto záznamu!"
 
@@ -3636,91 +3802,170 @@ msgstr "Již jste přihlášen k odběru tohoto záznamu!"
 msgid "Podcasts"
 msgstr "Záznamy"
 
-#: online/podcastservice.cpp:284
+#: online/podcastservice.cpp:288
 msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
 msgstr "Cantata podporuje pouze záznamy zvuku! %1 obsahuje jen záznamy obrazu."
 
-#: online/podcastservice.cpp:286
+#: online/podcastservice.cpp:290
 msgid "Failed to parse %1"
 msgstr "Nepodařilo se zpracovat %1"
 
-#: online/podcastservice.cpp:290
+#: online/podcastservice.cpp:294
 msgid "Failed to download %1"
 msgstr "Nepodařilo se stáhnout %1"
 
-#: online/podcastsettingsdialog.cpp:58
+#: online/podcastsettingsdialog.cpp:59
 msgid "Check for new episodes:"
 msgstr "Podívat se po nových dílech:"
 
-#: online/podcastsettingsdialog.cpp:59
+#: online/podcastsettingsdialog.cpp:60
 msgid "Download episodes to:"
 msgstr "Stáhnout díly do:"
 
-#: online/podcastsettingsdialog.cpp:60
-msgid "Automatically download new episodes:"
-msgstr "Stáhnout nové díly automaticky:"
+#: online/podcastsettingsdialog.cpp:67
+msgid "Automatically download new episodes"
+msgstr "Stáhnout nové díly automaticky"
 
-#: online/podcastsettingsdialog.cpp:82
+#: online/podcastsettingsdialog.cpp:80
 msgid "Podcast Settings"
 msgstr "Nastavení záznamu"
 
-#: online/podcastsettingsdialog.cpp:84
+#: online/podcastsettingsdialog.cpp:82
 msgid "Manually"
 msgstr "Ručně"
 
-#: online/podcastsettingsdialog.cpp:85
+#: online/podcastsettingsdialog.cpp:83
 msgid "Every 15 minutes"
 msgstr "Každých 15 minut"
 
-#: online/podcastsettingsdialog.cpp:86
+#: online/podcastsettingsdialog.cpp:84
 msgid "Every 30 minutes"
 msgstr "Každých 30 minut"
 
-#: online/podcastsettingsdialog.cpp:87
+#: online/podcastsettingsdialog.cpp:85
 msgid "Every hour"
 msgstr "Každou hodinu"
 
-#: online/podcastsettingsdialog.cpp:88
+#: online/podcastsettingsdialog.cpp:86
 msgid "Every 2 hours"
 msgstr "Každé 2 hodiny"
 
-#: online/podcastsettingsdialog.cpp:89
+#: online/podcastsettingsdialog.cpp:87
 msgid "Every 6 hours"
 msgstr "Každých 6 hodin"
 
-#: online/podcastsettingsdialog.cpp:90
+#: online/podcastsettingsdialog.cpp:88
 msgid "Every 12 hours"
 msgstr "Každých 12 hodin"
 
-#: online/podcastsettingsdialog.cpp:91
+#: online/podcastsettingsdialog.cpp:89
 msgid "Every day"
 msgstr "Každý den"
 
-#: online/podcastsettingsdialog.cpp:92
+#: online/podcastsettingsdialog.cpp:90
 msgid "Every week"
 msgstr "Každý týden"
 
-#. i18n: file: context/othersettings.ui:19
-#. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
-#: po/rc.cpp:3 rc.cpp:3
-msgid "Use backdrop:"
-msgstr "Použít pozadí:"
-
-#. i18n: file: context/othersettings.ui:32
-#. i18n: ectx: property (text), widget (BuddyLabel, contextDarkBackgroundLabel)
-#: po/rc.cpp:6 rc.cpp:6
-msgid "Dark background:"
-msgstr "Tmavé pozadí:"
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:3 po/rc.cpp:657 rc.cpp:3 rc.cpp:657
+msgid "Background Image"
+msgstr "Obrázek pozadí"
 
-#. i18n: file: context/othersettings.ui:45
-#. i18n: ectx: property (text), widget (BuddyLabel, wikipediaIntroOnlyLabel)
+#. i18n: file: context/othersettings.ui:36
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_artist)
 #: po/rc.cpp:9 rc.cpp:9
-msgid "Only show basic wikipedia text:"
-msgstr "Ukázat jen základní text:"
-
-#. i18n: file: context/othersettings.ui:86
+msgid "Artist image"
+msgstr "Obrázek umělce"
+
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#: po/rc.cpp:12 po/rc.cpp:666 rc.cpp:12 rc.cpp:666
+msgid "Custom image:"
+msgstr "Vlastní obrázek:"
+
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#: po/rc.cpp:15 po/rc.cpp:669 rc.cpp:15 rc.cpp:669
+msgid "Blur:"
+msgstr "Rozmazání:"
+
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#: po/rc.cpp:18 po/rc.cpp:672 rc.cpp:18 rc.cpp:672
+msgid "10px"
+msgstr "10 px"
+
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: po/rc.cpp:21 po/rc.cpp:675 rc.cpp:21 rc.cpp:675
+msgid "Opacity:"
+msgstr "Neprůhlednost:"
+
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#: po/rc.cpp:25 po/rc.cpp:679 rc.cpp:25 rc.cpp:679
+#, no-c-format
+msgid "40%"
+msgstr "40 %"
+
+#. i18n: file: context/othersettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, contextDarkBackground)
+#: po/rc.cpp:28 rc.cpp:28
+msgid "Dark background"
+msgstr "Tmavé pozadí"
+
+#. i18n: file: context/othersettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, wikipediaIntroOnly)
+#: po/rc.cpp:31 rc.cpp:31
+msgid "Only show basic wikipedia text"
+msgstr "Ukázat jen základní text na Wikipedii"
+
+#. i18n: file: context/othersettings.ui:178
+#. i18n: ectx: property (text), widget (QCheckBox, contextAlwaysCollapsed)
+#: po/rc.cpp:34 rc.cpp:34
+msgid "Always collapse into a single pane"
+msgstr "Vždy složit do jednoho pole"
+
+#. i18n: file: context/othersettings.ui:207
 #. i18n: ectx: property (text), widget (StateLabel, wikipediaIntroOnlyNote)
-#: po/rc.cpp:13 rc.cpp:13
+#: po/rc.cpp:38 rc.cpp:38
 #, no-c-format
 msgid ""
 "<i><b>NOTE:</b> Cantata does not show the full wikipedia pages (with images, "
@@ -3732,7 +3977,7 @@ msgid ""
 msgstr ""
 "<i><b>POZNÁMKA:</b> Cantata neukazuje stránky na Wikipedii celé (s obrázky, "
 "odkazy atd.), místo toho ukazuje ořezanou verzi. Toto ořezání není vždy 100 "
-"% přesné, z tohoto důvodu bude Cantata ve výchozím nastavení ukazovat jen "
+"% přesné. Z tohoto důvodu bude Cantata ve výchozím nastavení ukazovat jen "
 "základní úvod ke každému článku. Pokud bude vaší volbou zobrazení úplného "
 "článku, potom se mohou objevit chyby ve zpracování. Také budete muset "
 "odstranit všechny články, jež jsou nyní uloženy ve vyrovnávací paměti "
@@ -3740,188 +3985,174 @@ msgstr ""
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:16 rc.cpp:16
+#: po/rc.cpp:41 rc.cpp:41
 msgid "Available:"
 msgstr "Dostupné:"
 
 #. i18n: file: context/togglelist.ui:24
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:19 rc.cpp:19
+#: po/rc.cpp:44 rc.cpp:44
 msgid "Selected:"
 msgstr "Vybrané:"
 
-#. i18n: file: devices/actiondialog.ui:30
+#. i18n: file: devices/actiondialog.ui:33
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:22 rc.cpp:22
+#: po/rc.cpp:47 rc.cpp:47
 msgid "Copy songs from:"
 msgstr "Kopírovat písně z:"
 
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#: po/rc.cpp:25 po/rc.cpp:31 po/rc.cpp:49 po/rc.cpp:744 rc.cpp:25 rc.cpp:31
-#: rc.cpp:49 rc.cpp:744
+#: po/rc.cpp:50 po/rc.cpp:62 po/rc.cpp:896 rc.cpp:50 rc.cpp:62 rc.cpp:896
 msgid "TextLabel"
 msgstr "TextovýŠtítek"
 
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#: po/rc.cpp:28 po/rc.cpp:34 rc.cpp:28 rc.cpp:34
+#: po/rc.cpp:56 po/rc.cpp:68 rc.cpp:56 rc.cpp:68
 msgid "(Needs configuring)"
 msgstr "(Potřeba nastavit)"
 
-#. i18n: file: devices/actiondialog.ui:123
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:37 rc.cpp:37
-msgid "Overwrite songs:"
-msgstr "Přepsat písně:"
-
-#. i18n: file: devices/actiondialog.ui:150
+#. i18n: file: devices/actiondialog.ui:86
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:40 rc.cpp:40
+#: po/rc.cpp:59 rc.cpp:59
 msgid "Copy songs to:"
 msgstr "Kopírovat písně do:"
 
-#. i18n: file: devices/actiondialog.ui:157
+#. i18n: file: devices/actiondialog.ui:149
 #. i18n: ectx: property (text), widget (QLabel, codecLabel)
-#: po/rc.cpp:43 rc.cpp:43
+#: po/rc.cpp:71 rc.cpp:71
 msgid "Destination format:"
 msgstr "Cílový formát:"
 
-#. i18n: file: devices/actiondialog.ui:171
+#. i18n: file: devices/actiondialog.ui:163
+#. i18n: ectx: property (text), widget (QCheckBox, overwrite)
+#: po/rc.cpp:74 rc.cpp:74
+msgid "Overwrite songs"
+msgstr "Přepsat písně"
+
+#. i18n: file: devices/actiondialog.ui:170
 #. i18n: ectx: property (text), widget (QLabel, songCountLabel)
-#: po/rc.cpp:46 rc.cpp:46
+#: po/rc.cpp:77 rc.cpp:77
 msgid "To copy:"
 msgstr "Ke kopírování:"
 
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#: po/rc.cpp:80 po/rc.cpp:968 po/rc.cpp:995 rc.cpp:80 rc.cpp:968 rc.cpp:995
+msgid ""
+"<i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i>"
+msgstr ""
+"<i><b>POZNÁMKA:</b> Připojeno k serveru Mopidy (vyžadována ruční "
+"aktualizace).</i>"
+
 #. i18n: file: devices/albumdetails.ui:26
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:52 rc.cpp:52
+#: po/rc.cpp:83 rc.cpp:83
 msgid "Album Details"
 msgstr "Podrobnosti alba"
 
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#: po/rc.cpp:58 po/rc.cpp:298 po/rc.cpp:798 rc.cpp:58 rc.cpp:298 rc.cpp:798
-msgid "Composer:"
-msgstr "Skladatel:"
-
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
-msgid "Genre:"
-msgstr "Žánr:"
-
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#: po/rc.cpp:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
+#: po/rc.cpp:98 po/rc.cpp:965 rc.cpp:98 rc.cpp:965
 msgid "Year:"
 msgstr "Rok:"
 
-#. i18n: file: devices/albumdetails.ui:99
+#. i18n: file: devices/albumdetails.ui:102
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:70 rc.cpp:70
+#: po/rc.cpp:101 rc.cpp:101
 msgid "Disc:"
 msgstr "Disk:"
 
-#. i18n: file: devices/albumdetails.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:73 rc.cpp:73
-msgid "Single artist:"
-msgstr "Umělec písně:"
+#. i18n: file: devices/albumdetails.ui:115
+#. i18n: ectx: property (text), widget (QCheckBox, singleArtist)
+#: po/rc.cpp:104 rc.cpp:104
+msgid "Single artist"
+msgstr "Umělec písně"
 
-#. i18n: file: devices/audiocdsettings.ui:20
+#. i18n: file: devices/audiocdsettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:119 rc.cpp:119
 msgid "Album and Track Information Retrieval"
-msgstr "Vyhledání o albu a skladbě"
-
-#. i18n: file: devices/audiocdsettings.ui:26
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:91 rc.cpp:91
-msgid "Automatically lookup:"
-msgstr "Automaticky vyhledat:"
+msgstr "Vyhledání informací o albu a skladbě"
 
-#. i18n: file: devices/audiocdsettings.ui:39
+#. i18n: file: devices/audiocdsettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:122 rc.cpp:122
 msgid "Initially look up via:"
 msgstr "Zpočátku vyhledávat pomocí:"
 
-#. i18n: file: devices/audiocdsettings.ui:52
+#. i18n: file: devices/audiocdsettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:125 rc.cpp:125
 msgid "CDDB Host:"
 msgstr "Server CDDB:"
 
-#. i18n: file: devices/audiocdsettings.ui:65
+#. i18n: file: devices/audiocdsettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:128 rc.cpp:128
 msgid "CDDB Port:"
 msgstr "Přípojka CDDB:"
 
-#. i18n: file: devices/audiocdsettings.ui:88
+#. i18n: file: devices/audiocdsettings.ui:84
+#. i18n: ectx: property (text), widget (QCheckBox, cdAuto)
+#: po/rc.cpp:131 rc.cpp:131
+msgid "Lookup information as soon as CD is inserted"
+msgstr "Vyhledat informace, jakmile je CD vloženo"
+
+#. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:134 rc.cpp:134
 msgid "Audio Extraction"
 msgstr "Vytažení zvuku"
 
-#. i18n: file: devices/audiocdsettings.ui:94
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:106 rc.cpp:106
-msgid "Full paranoia mode (best quality):"
+#. i18n: file: devices/audiocdsettings.ui:100
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaFull)
+#: po/rc.cpp:137 rc.cpp:137
+msgid "Full paranoia mode (best quality)"
 msgstr "Úplný režim paranoia (nejlepší kvalita):"
 
 #. i18n: file: devices/audiocdsettings.ui:107
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:109 rc.cpp:109
-msgid "Never skip on read error:"
-msgstr "Nikdy nepřeskakovat při chybě čtení:"
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaNeverSkip)
+#: po/rc.cpp:140 rc.cpp:140
+msgid "Never skip on read error"
+msgstr "Nikdy nepřeskakovat při chybě čtení"
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:112 rc.cpp:112
+#: po/rc.cpp:143 rc.cpp:143
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3949,188 +4180,260 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
 #. i18n: file: gui/serversettings.ui:325
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
-#: po/rc.cpp:115 po/rc.cpp:415 po/rc.cpp:433 po/rc.cpp:650 po/rc.cpp:671
-#: rc.cpp:115 rc.cpp:415 rc.cpp:433 rc.cpp:650 rc.cpp:671
+#: po/rc.cpp:146 po/rc.cpp:479 po/rc.cpp:497 po/rc.cpp:805 po/rc.cpp:826
+#: rc.cpp:146 rc.cpp:479 rc.cpp:497 rc.cpp:805 rc.cpp:826
 msgid "Music folder:"
 msgstr "Složka s hudbou:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:149 rc.cpp:149
 msgid "Copy album covers as:"
 msgstr "Kopírovat obaly alb jako:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: po/rc.cpp:152 rc.cpp:152
 msgid "Maximum cover size:"
 msgstr "Největší velikost obalu:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:82
-#. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:124 rc.cpp:124
-msgid "'Various Artists' workaround:"
-msgstr "Ošetření pro 'Různí umělci':"
-
-#. i18n: file: devices/devicepropertieswidget.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, autoScanLabel)
-#: po/rc.cpp:127 rc.cpp:127
-msgid "Automatically scan music when attached:"
-msgstr "Automaticky prohledat hudbu při připojení:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:108
-#. i18n: ectx: property (text), widget (BuddyLabel, useCacheLabel)
-#: po/rc.cpp:130 rc.cpp:130
-msgid "Use cache:"
-msgstr "Použít vyrovnávací paměť:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:121
+#. i18n: file: devices/devicepropertieswidget.ui:85
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:133 rc.cpp:133
+#: po/rc.cpp:155 rc.cpp:155
 msgid "Default volume:"
 msgstr "Výchozí svazek:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, fixVariousArtists)
+#: po/rc.cpp:158 rc.cpp:158
+msgid "'Various Artists' workaround"
+msgstr "Ošetření pro Různí umělci"
+
+#. i18n: file: devices/devicepropertieswidget.ui:99
+#. i18n: ectx: property (text), widget (QCheckBox, autoScan)
+#: po/rc.cpp:161 rc.cpp:161
+msgid "Automatically scan music when attached"
+msgstr "Automaticky prohledat hudbu při připojení"
+
+#. i18n: file: devices/devicepropertieswidget.ui:106
+#. i18n: ectx: property (text), widget (QCheckBox, useCache)
+#: po/rc.cpp:164 rc.cpp:164
+msgid "Use cache"
+msgstr "Použít vyrovnávací paměť"
+
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#: po/rc.cpp:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
+#: po/rc.cpp:167 po/rc.cpp:971 rc.cpp:167 rc.cpp:971
 msgid "Filenames"
 msgstr "Názvy souborů"
 
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
-msgid "Use only ASCII characters:"
-msgstr "Použít pouze znaky ASCII:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
-msgid "Replace spaces with underscores:"
-msgstr "Nahradit mezery podtržítky:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
-msgid "Ignore 'The' in artist names:"
-msgstr "Nevšímat si 'The' ve jménech umělců:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
+#: po/rc.cpp:170 po/rc.cpp:974 rc.cpp:170 rc.cpp:974
 msgid "Filename scheme:"
 msgstr "Schéma názvu souboru:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
-msgid "VFAT safe:"
-msgstr "VFAT bezpečný:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:250
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#: po/rc.cpp:173 po/rc.cpp:977 rc.cpp:173 rc.cpp:977
+msgid "VFAT safe"
+msgstr "VFAT bezpečný"
+
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#: po/rc.cpp:176 po/rc.cpp:980 rc.cpp:176 rc.cpp:980
+msgid "Use only ASCII characters"
+msgstr "Použít pouze znaky ASCII"
+
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#: po/rc.cpp:179 po/rc.cpp:983 rc.cpp:179 rc.cpp:983
+msgid "Replace spaces with underscores"
+msgstr "Nahradit mezery podtržítky"
+
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#: po/rc.cpp:182 po/rc.cpp:986 rc.cpp:182 rc.cpp:986
+msgid "Ignore 'The' in artist names"
+msgstr "Nevšímat si The ve jménech umělců"
+
+#. i18n: file: devices/devicepropertieswidget.ui:192
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:185 rc.cpp:185
 msgid "Transcoding"
 msgstr "Překódování"
 
-#. i18n: file: devices/devicepropertieswidget.ui:261
-#. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:157 rc.cpp:157
-msgid "Only transcode if source file is of a different format:"
-msgstr "Překódovat pouze, když zdrojový soubor je v jiném formátu:"
+#. i18n: file: devices/devicepropertieswidget.ui:201
+#. i18n: ectx: property (text), widget (QCheckBox, transcoderWhenDifferent)
+#: po/rc.cpp:188 rc.cpp:188
+msgid "Only transcode if source file is of a different format"
+msgstr "Překódovat pouze, když zdrojový soubor je v jiném formátu"
 
-#. i18n: file: devices/filenameschemedialog.ui:29
+#. i18n: file: devices/filenameschemedialog.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:191 rc.cpp:191
 msgid "Example:"
 msgstr "Příklad:"
 
-#. i18n: file: devices/filenameschemedialog.ui:58
+#. i18n: file: devices/filenameschemedialog.ui:67
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:194 rc.cpp:194
 msgid "About filename schemes"
 msgstr "O schématech pro názvy souborů"
 
-#. i18n: file: devices/filenameschemedialog.ui:70
+#. i18n: file: devices/filenameschemedialog.ui:79
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumArtist)
+#: po/rc.cpp:197 rc.cpp:197
+msgid ""
+"The artist of the album. For most albums, this will be the same as the "
+"<i>Track Artist.</i> For compilations, this will often be <i>Various Artists."
+"</i>"
+msgstr ""
+"Umělec alba. U většiny alb je totožný s <i>umělcem skladby.</i> U sbírek "
+"půjde často o <i>různé umělce.</i>"
+
+#. i18n: file: devices/filenameschemedialog.ui:82
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:200 rc.cpp:200
 msgid "Album Artist"
 msgstr "Umělec alba"
 
-#. i18n: file: devices/filenameschemedialog.ui:77
+#. i18n: file: devices/filenameschemedialog.ui:89
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumTitle)
+#: po/rc.cpp:203 rc.cpp:203
+msgid "The name of the album."
+msgstr "Název alba."
+
+#. i18n: file: devices/filenameschemedialog.ui:92
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:206 rc.cpp:206
 msgid "Album Title"
 msgstr "Název alba"
 
-#. i18n: file: devices/filenameschemedialog.ui:91
+#. i18n: file: devices/filenameschemedialog.ui:99
+#. i18n: ectx: property (toolTip), widget (QPushButton, composer)
+#: po/rc.cpp:209 rc.cpp:209
+msgid "The composer."
+msgstr "Skladatel."
+
+#. i18n: file: devices/filenameschemedialog.ui:109
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtist)
+#: po/rc.cpp:215 rc.cpp:215
+msgid "The artist of each track."
+msgstr "Umělec každé skladby."
+
+#. i18n: file: devices/filenameschemedialog.ui:112
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:218 rc.cpp:218
 msgid "Track Artist"
 msgstr "Umělec skladby"
 
-#. i18n: file: devices/filenameschemedialog.ui:98
+#. i18n: file: devices/filenameschemedialog.ui:119
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackTitle)
+#: po/rc.cpp:221 rc.cpp:221
+msgid "The track title (without <i>Track Artist</i>)."
+msgstr "Název skladby (bez <i>umělce skladby</i>)."
+
+#. i18n: file: devices/filenameschemedialog.ui:122
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:224 rc.cpp:224
 msgid "Track Title"
 msgstr "Název skladby"
 
-#. i18n: file: devices/filenameschemedialog.ui:117
+#. i18n: file: devices/filenameschemedialog.ui:141
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtistAndTitle)
+#: po/rc.cpp:227 rc.cpp:227
+msgid ""
+"The track title (with <i>Track Artist</i>, if different to <i>Album Artist</"
+"i>)."
+msgstr ""
+"Název skladby (s <i>umělcem skladby</i>, pokud se liší od <i>umělce alba</i>)."
+
+#. i18n: file: devices/filenameschemedialog.ui:144
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:230 rc.cpp:230
 msgid "Track Title (+Artist)"
 msgstr "Název skladby (+Umělec)"
 
-#. i18n: file: devices/filenameschemedialog.ui:124
+#. i18n: file: devices/filenameschemedialog.ui:151
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackNo)
+#: po/rc.cpp:233 rc.cpp:233
+msgid "The track number."
+msgstr "Číslo skladby."
+
+#. i18n: file: devices/filenameschemedialog.ui:154
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:184 rc.cpp:184
+#: po/rc.cpp:236 rc.cpp:236
 msgid "Track #"
 msgstr "Skladba #"
 
-#. i18n: file: devices/filenameschemedialog.ui:131
+#. i18n: file: devices/filenameschemedialog.ui:161
+#. i18n: ectx: property (toolTip), widget (QPushButton, cdNo)
+#: po/rc.cpp:239 rc.cpp:239
+msgid ""
+"The album number of a multi-album album. Often compilations consist of "
+"several albums."
+msgstr ""
+"Číslo alba v případě alba složeného z více alb. Kompilace se často skládají z "
+"více alb."
+
+#. i18n: file: devices/filenameschemedialog.ui:164
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:187 rc.cpp:187
+#: po/rc.cpp:242 rc.cpp:242
 msgid "CD #"
 msgstr "CD #"
 
+#. i18n: file: devices/filenameschemedialog.ui:171
+#. i18n: ectx: property (toolTip), widget (QPushButton, year)
+#: po/rc.cpp:245 rc.cpp:245
+msgid "The year of the album's release."
+msgstr "Rok vydání alba."
+
+#. i18n: file: devices/filenameschemedialog.ui:181
+#. i18n: ectx: property (toolTip), widget (QPushButton, genre)
+#: po/rc.cpp:251 rc.cpp:251
+msgid "The genre of the album."
+msgstr "Žánr alba."
+
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:196 rc.cpp:196
+#: po/rc.cpp:257 rc.cpp:257
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -4140,17 +4443,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
-#: po/rc.cpp:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
+#: po/rc.cpp:260 po/rc.cpp:353 po/rc.cpp:848 rc.cpp:260 rc.cpp:353 rc.cpp:848
 msgid "Type:"
 msgstr "Typ:"
 
@@ -4162,14 +4465,16 @@ msgstr "Typ:"
 #. i18n: ectx: property (text), widget (BuddyLabel, nameLabel)
 #. i18n: file: gui/serversettings.ui:63
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
-#: rc.cpp:638
+#: po/rc.cpp:263 po/rc.cpp:793 streams/streamdialog.cpp:71 rc.cpp:263
+#: rc.cpp:793
 msgid "Name:"
 msgstr "Název:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:205 rc.cpp:205
+#. i18n: file: gui/interfacesettings.ui:122
+#. i18n: ectx: property (title), widget (QGroupBox, optionsGroup)
+#: po/rc.cpp:266 rc.cpp:266 po/rc.cpp:551 rc.cpp:551
 msgid "Options"
 msgstr "Volby"
 
@@ -4193,8 +4498,8 @@ msgstr "Volby"
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: network/proxysettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPortLabel)
-#: po/rc.cpp:211 po/rc.cpp:250 po/rc.cpp:409 po/rc.cpp:644 po/rc.cpp:708
-#: rc.cpp:211 rc.cpp:250 rc.cpp:409 rc.cpp:644 rc.cpp:708
+#: po/rc.cpp:272 po/rc.cpp:311 po/rc.cpp:473 po/rc.cpp:799 po/rc.cpp:860
+#: rc.cpp:272 rc.cpp:311 rc.cpp:473 rc.cpp:799 rc.cpp:860
 msgid "Port:"
 msgstr "Přípojka:"
 
@@ -4210,7 +4515,7 @@ msgstr "Přípojka:"
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2x)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:322
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel)
-#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
+#: po/rc.cpp:275 po/rc.cpp:293 po/rc.cpp:314 rc.cpp:275 rc.cpp:293 rc.cpp:314
 msgid "User:"
 msgstr "Uživatel:"
 
@@ -4222,7 +4527,7 @@ msgstr "Uživatel:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:218
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2x)
-#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:278 po/rc.cpp:296 rc.cpp:278 rc.cpp:296
 msgid "Domain:"
 msgstr "Doména:"
 
@@ -4234,7 +4539,7 @@ msgstr "Doména:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:248
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2)
-#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
+#: po/rc.cpp:284 po/rc.cpp:302 rc.cpp:284 rc.cpp:302
 msgid "Share:"
 msgstr "Sdílení:"
 
@@ -4246,7 +4551,7 @@ msgstr "Sdílení:"
 #. i18n: ectx: property (text), widget (QLabel, label_4)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:263
 #. i18n: ectx: property (text), widget (QLabel, label_4x)
-#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
+#: po/rc.cpp:287 po/rc.cpp:305 rc.cpp:287 rc.cpp:305
 msgid ""
 "<i><b>NOTE:</b> If you enter a password here, it will be stored "
 "<b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the "
@@ -4258,7 +4563,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:229 rc.cpp:229
+#: po/rc.cpp:290 rc.cpp:290
 msgid "Service name:"
 msgstr "Název služby:"
 
@@ -4270,19 +4575,19 @@ msgstr "Název služby:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:390
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
+#: po/rc.cpp:317 po/rc.cpp:326 rc.cpp:317 rc.cpp:326
 msgid "Folder:"
 msgstr "Složka:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:259 rc.cpp:259
+#: po/rc.cpp:320 rc.cpp:320
 msgid "Extra Options:"
 msgstr "Další volby:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:323 rc.cpp:323
 msgid ""
 "<i><b>NOTE:</b> Due to the way sshfs works, a suitable ssh-askpass "
 "application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter "
@@ -4294,7 +4599,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:329 rc.cpp:329
 msgid ""
 "<i><b>NOTE:</b> This dialog is only used to add remote devices (e.g. via "
 "Samba), or to access locally mounted folders. For normal media players, "
@@ -4308,112 +4613,100 @@ msgstr ""
 
 #. i18n: file: dynamic/dynamicpage.ui:26
 #. i18n: ectx: property (text), widget (StatusLabel, infoLabel)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:332 rc.cpp:332
 msgid "No dynamizer port defined in server settings."
 msgstr "V nastaveních serveru není stanoven žádná přípojka dynamizátora."
 
 #. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:274 rc.cpp:274
+#: po/rc.cpp:335 rc.cpp:335
 msgid "Remote dynamizer is not running."
 msgstr "Vzdálený dynamizátor neběží."
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:277 rc.cpp:277
+#: po/rc.cpp:338 rc.cpp:338
 msgid "Name of Dynamic Rules"
 msgstr "Název pro dynamická pravidla"
 
 #. i18n: file: dynamic/dynamicrules.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, editBtn)
-#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
+#: po/rc.cpp:344 streams/streamspage.cpp:62 rc.cpp:344
 msgid "Edit"
 msgstr "Upravit"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:350 rc.cpp:350
 msgid "About Rules"
 msgstr "O pravidlech"
 
-#. i18n: file: dynamic/dynamicrule.ui:38
+#. i18n: file: dynamic/dynamicrule.ui:37
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:356 rc.cpp:356
+msgid "Include songs that match the following:"
+msgstr "Zahrnout písně odpovídající následujícímu:"
+
+#. i18n: file: dynamic/dynamicrule.ui:42
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:359 rc.cpp:359
+msgid "Exclude songs that match the following:"
+msgstr "Vyloučit písně odpovídající následujícímu:"
+
+#. i18n: file: dynamic/dynamicrule.ui:63
+#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
+#: po/rc.cpp:365 rc.cpp:365
+msgid "Artists similar to:"
+msgstr "Umělci podobní:"
+
+#. i18n: file: dynamic/dynamicrule.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:295 rc.cpp:295
+#: po/rc.cpp:368 rc.cpp:368
 msgid "Album Artist:"
 msgstr "Umělec alba"
 
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
-msgid "Album:"
-msgstr "Album:"
-
-#. i18n: file: dynamic/dynamicrule.ui:103
+#. i18n: file: dynamic/dynamicrule.ui:141
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:310 rc.cpp:310
+#: po/rc.cpp:383 rc.cpp:383
 msgid "From Year:"
 msgstr "Od roku:"
 
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#: po/rc.cpp:386 po/rc.cpp:392 rc.cpp:386 rc.cpp:392
 msgid "Any"
 msgstr "Jakýkoli"
 
-#. i18n: file: dynamic/dynamicrule.ui:126
+#. i18n: file: dynamic/dynamicrule.ui:164
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:316 rc.cpp:316
+#: po/rc.cpp:389 rc.cpp:389
 msgid "To Year:"
 msgstr "Do roku:"
 
-#. i18n: file: dynamic/dynamicrule.ui:149
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:322 rc.cpp:322
-msgid "Exact match:"
-msgstr "Přesná shoda:"
-
-#. i18n: file: dynamic/dynamicrule.ui:173
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:328 rc.cpp:328
-msgid "Include songs that match the following:"
-msgstr "Zahrnout písně odpovídající následujícímu:"
-
-#. i18n: file: dynamic/dynamicrule.ui:178
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:331 rc.cpp:331
-msgid "Exclude songs that match the following:"
-msgstr "Vyloučit písně odpovídající následujícímu:"
-
-#. i18n: file: dynamic/dynamicrule.ui:186
-#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:334 rc.cpp:334
-msgid "Artists similar to:"
-msgstr "Umělci podobní:"
+#. i18n: file: dynamic/dynamicrule.ui:187
+#. i18n: ectx: property (text), widget (QCheckBox, exactCheck)
+#: po/rc.cpp:395 rc.cpp:395
+msgid "Exact match"
+msgstr "Přesná shoda"
 
-#. i18n: file: dynamic/dynamicrule.ui:236
+#. i18n: file: dynamic/dynamicrule.ui:231
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:337 rc.cpp:337
+#: po/rc.cpp:398 rc.cpp:398
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
 "<i><b>POZNÁMKA:</b> Zadejte hodnoty pouze pro značky, které si přejete "
 "hledat. </i>"
 
-#. i18n: file: dynamic/dynamicrule.ui:262
+#. i18n: file: dynamic/dynamicrule.ui:260
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:340 rc.cpp:340
+#: po/rc.cpp:401 rc.cpp:401
 msgid ""
 "<i><b>NOTE</b> For genre, end string with an asterisk to match various "
 "genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. </i>"
@@ -4421,71 +4714,63 @@ msgstr ""
 "<i><b>POZNÁMKA:</b> Když má žánr odpovídat různým žánrům, ukončete řetězec "
 "hvězdičkou. Např. 'rock*' odpovídá 'Hard Rock' a 'Rock and Roll'. </i>"
 
-#. i18n: file: gui/coverdialog.ui:23
-#. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:343 rc.cpp:343
-msgid "<html><head/><body><p>Cancel current query</p></body></html>"
-msgstr ""
-"<html><head/><body><p>Zrušit současnou řadu skladeb určených k přehrání</p></"
-"body></html>"
-
-#. i18n: file: gui/coverdialog.ui:37
+#. i18n: file: gui/coverdialog.ui:30
 #. i18n: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:349 rc.cpp:349
-msgid "<html><head/><body><p>Add a local file</p></body></html>"
-msgstr "<html><head/><body><p>Přidat místní soubor</p></body></html>"
-
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:352 po/rc.cpp:442 rc.cpp:352 rc.cpp:442
-msgid "Save downloaded covers in music folder:"
-msgstr "Uložit stažené obaly ve složce s hudbou:"
-
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:355 po/rc.cpp:445 rc.cpp:355 rc.cpp:445
-msgid "Save downloaded lyrics in music folder:"
-msgstr "Uložit stažená slova písně ve složce s hudbou:"
-
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#: po/rc.cpp:358 po/rc.cpp:448 rc.cpp:358 rc.cpp:448
-msgid "Save downloaded backdrops in music folder:"
-msgstr "Uložit stažená pozadí ve složce s hudbou:"
-
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:361 po/rc.cpp:451 rc.cpp:361 rc.cpp:451
-msgid "Save list of favorite streams in music folder:"
-msgstr "Uložit seznam oblíbených proudů ve složce s hudbou:"
-
-#. i18n: file: gui/filesettings.ui:110
+#: po/rc.cpp:407 rc.cpp:407
+msgid "Add a local file"
+msgstr "Přidat místní soubor"
+
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#: po/rc.cpp:413 po/rc.cpp:506 rc.cpp:413 rc.cpp:506
+msgid "Save downloaded covers in music folder"
+msgstr "Uložit stažené obaly ve složce s hudbou"
+
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#: po/rc.cpp:416 po/rc.cpp:509 rc.cpp:416 rc.cpp:509
+msgid "Save downloaded lyrics in music folder"
+msgstr "Uložit stažená slova písně ve složce s hudbou"
+
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#: po/rc.cpp:419 po/rc.cpp:512 rc.cpp:419 rc.cpp:512
+msgid "Save downloaded backdrops in music folder"
+msgstr "Uložit stažená pozadí ve složce s hudbou"
+
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#: po/rc.cpp:422 po/rc.cpp:515 rc.cpp:422 rc.cpp:515
+msgid "Save list of favorite streams in music folder"
+msgstr "Uložit seznam oblíbených proudů ve složce s hudbou"
+
+#. i18n: file: gui/filesettings.ui:79
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:425 rc.cpp:425
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, lyrics, or "
 "backdrops, within the music folder, and you do not have write access to this "
@@ -4496,19 +4781,31 @@ msgid ""
 "music folder, then these will be saved in your local config folder - and "
 "will only be accessible to yourself.</i>"
 msgstr ""
-"<i><b>POZNÁMKA:</b> Pokud zvolíte, aby Cantata ukládala obaly, texty "
-"písní nebo prospekty ve složce s hudbou, a nemáte k této složce oprávnění pro "
-"zápis, potom "
-"se Cantata vrátí k ukládání souborů do vaší osobní složky s vyrovnávací "
-"pamětí. Nicméně v případě proudů, pokud nemáte přístupová oprávnění pro "
-"zápis, budete pouze moci vidět (a přehrávat) proudy uložené ve složce s "
-"hudbou, a žádné proudy nebudete moci přidávat (nebo upravovat). Pokud "
-"zvolíte, aby se proudy do složky s hudbou neukládaly, budou uloženy do "
+"<i><b>POZNÁMKA:</b> Pokud zvolíte, aby Cantata ukládala obaly, texty písní "
+"nebo prospekty ve složce s hudbou, a nemáte k této složce oprávnění pro "
+"zápis, potom se Cantata vrátí k ukládání souborů do vaší osobní složky s "
+"vyrovnávací pamětí. Nicméně v případě proudů, pokud nemáte přístupová "
+"oprávnění pro zápis, budete pouze moci vidět (a přehrávat) proudy uložené ve "
+"složce s hudbou, a žádné proudy nebudete moci přidávat (nebo upravovat). "
+"Pokud zvolíte, aby se proudy do složky s hudbou neukládaly, budou uloženy do "
 "místní složky s nastavením a jen vy k nim budete moci přistupovat.</i>"
 
-#. i18n: file: gui/filesettings.ui:145
+#. i18n: file: gui/filesettings.ui:108
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:428 rc.cpp:428
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. (i.e. 'Artist/Album/Tracks')"
+"</i>"
+msgstr ""
+"<i><b>POZNÁMKA:</b> Cantata může pozadí a obrázky umělců ukládat ve složkách "
+"s hudbou a jejich podsložkách, pouze pokud tato hierarchie jde jen do dvou "
+"úrovní dolů. (např. 'Artist/Album/Tracks')"
+"</i>"
+
+#. i18n: file: gui/filesettings.ui:140
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:431 rc.cpp:431
 msgid ""
 "<i><b>NOTE:</b> If you change the location where streams are stored (i.e. "
 "you toggle the 'Save list of favorite streams in music folder' option), then "
@@ -4526,19 +4823,19 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:370 rc.cpp:370
+#: po/rc.cpp:434 rc.cpp:434
 msgid "Cantata First Run"
 msgstr "První spuštění Cantaty"
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:373 rc.cpp:373
+#: po/rc.cpp:437 rc.cpp:437
 msgid "Welcome to Cantata"
 msgstr "Vítejte v Cantatě"
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:440 rc.cpp:440
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4558,13 +4855,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:379 rc.cpp:379
+#: po/rc.cpp:443 rc.cpp:443
 msgid "<html><head/><body><p>Welcome to Cantata</p></body></html>"
 msgstr "<html><head/><body><p>Vítejte v Cantatě</p></body></html>"
 
 #. i18n: file: gui/initialsettingswizard.ui:128
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:382 rc.cpp:382
+#: po/rc.cpp:446 rc.cpp:446
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4580,13 +4877,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:166
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:385 rc.cpp:385
+#: po/rc.cpp:449 rc.cpp:449
 msgid "Standard multi-user/server setup"
 msgstr "Standardní nastavení pro více uživatelů/server"
 
 #. i18n: file: gui/initialsettingswizard.ui:179
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:388 rc.cpp:388
+#: po/rc.cpp:452 rc.cpp:452
 msgid ""
 "<i>Select this option if your music collection is shared between users, your "
 "MPD instance is running on another machine, or you already have a personal "
@@ -4602,13 +4899,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:211
 #. i18n: ectx: property (text), widget (QRadioButton, basic)
-#: po/rc.cpp:391 rc.cpp:391
+#: po/rc.cpp:455 rc.cpp:455
 msgid "Basic single user setup"
 msgstr "Základní nastavení pro jednoho uživatele"
 
 #. i18n: file: gui/initialsettingswizard.ui:224
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
-#: po/rc.cpp:394 rc.cpp:394
+#: po/rc.cpp:458 rc.cpp:458
 msgid ""
 "<i>Select this option if your music collection is not shared with others, "
 "and you wish Cantata to configure and control the MPD instance.</i>"
@@ -4618,7 +4915,7 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:397 rc.cpp:397
+#: po/rc.cpp:461 rc.cpp:461
 msgid ""
 "<html><head/><body><p>For more information on MPD itself, please refer to "
 "the MPD website <a href=\"http://www.musicpd.org\"><span style=\" text-"
@@ -4634,13 +4931,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:400 rc.cpp:400
+#: po/rc.cpp:464 rc.cpp:464
 msgid "Connection details"
 msgstr "Podrobnosti spojení"
 
 #. i18n: file: gui/initialsettingswizard.ui:341
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:403 rc.cpp:403
+#: po/rc.cpp:467 rc.cpp:467
 msgid ""
 "The settings below are the basic settings required by Cantata. Please enter "
 "the relevant details, and use the 'Connect' button to test the connection."
@@ -4656,19 +4953,22 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: gui/serversettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
-#: po/rc.cpp:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
+#: po/rc.cpp:470 po/rc.cpp:796 rc.cpp:470 rc.cpp:796
 msgid "Host (or local socket):"
 msgstr "Hostitel (nebo místní zásuvka):"
 
 #. i18n: file: gui/initialsettingswizard.ui:494
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:421 rc.cpp:421
+#: po/rc.cpp:485 rc.cpp:485
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
-"lyrics, etc.</i>"
+"lyrics, etc. If you're MPD instance is on a remote host, you may set this to "
+"a HTTP URL.</i>"
 msgstr ""
 "<i><b>POZNÁMKA:</b> Nastavení složky s hudbou je používáno k vyhledávání "
-"obalu alba, textu písně atd.</i>"
+"obalu alba, textu písně atd. Pokud se vaše instance MPD nachází na vzdáleném "
+"počítači, "
+"můžete tuto nastavit na adresu HTTP.</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:520
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
@@ -4678,7 +4978,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
 #. i18n: file: gui/serversettings.ui:225
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#: po/rc.cpp:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
+#: po/rc.cpp:488 po/rc.cpp:820 rc.cpp:488 rc.cpp:820
 msgid ""
 "<i><b>NOTE:</b> When using a local socket the full absolute path to the "
 "socket needs to be set. (Port number is not required.)</i>"
@@ -4688,25 +4988,25 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:553
 #. i18n: ectx: property (text), widget (QLabel, label_13)
-#: po/rc.cpp:427 rc.cpp:427
+#: po/rc.cpp:491 rc.cpp:491
 msgid "Music folder"
 msgstr "Složka s hudbou"
 
 #. i18n: file: gui/initialsettingswizard.ui:576
 #. i18n: ectx: property (text), widget (QLabel, label_12)
-#: po/rc.cpp:430 rc.cpp:430
+#: po/rc.cpp:494 rc.cpp:494
 msgid "Please choose the folder containing your music collection."
 msgstr "Prosím, vyberte složku, která obsahuje vaši hudební sbírku."
 
 #. i18n: file: gui/initialsettingswizard.ui:662
 #. i18n: ectx: property (text), widget (QLabel, label_6f)
-#: po/rc.cpp:436 rc.cpp:436
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Covers, Lyrics, and Streams"
 msgstr "Obaly, slova písně a proudy"
 
 #. i18n: file: gui/initialsettingswizard.ui:685
 #. i18n: ectx: property (text), widget (QLabel, label_5f)
-#: po/rc.cpp:439 rc.cpp:439
+#: po/rc.cpp:503 rc.cpp:503
 msgid ""
 "<p>Cantata will download missing covers, and lyrics, from the internet. "
 "Cantata also allows you to save a list of internet streams (e.g. Radio "
@@ -4720,9 +5020,9 @@ msgstr ""
 "chcete, aby Cantata ukládala příslušné soubory do složky s hudbou, nebo ve "
 "vašich osobních složkách s vyrovnávací pamětí/nastavením.</p>"
 
-#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: file: gui/initialsettingswizard.ui:758
 #. i18n: ectx: property (text), widget (QLabel, persNote)
-#: po/rc.cpp:454 rc.cpp:454
+#: po/rc.cpp:518 rc.cpp:518
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
 "the music folder, and you do not have write access to this folder, then "
@@ -4742,27 +5042,40 @@ msgstr ""
 "zvolíte, aby se proudy do složky s hudbou neukládaly, budou uloženy do "
 "místní složky s nastavením a jen vy k nim budete moci přistupovat.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:824
-#. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:457 rc.cpp:457
+#. i18n: file: gui/initialsettingswizard.ui:784
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:521 rc.cpp:521
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. i.e. 'Artist/Album/Tracks'."
+"</i>"
+msgstr ""
+"<i><b>POZNÁMKA:</b> Cantata může pozadí a obrázky umělců ukládat ve složkách "
+"s hudbou a jejich podsložkách, pouze pokud tato hierarchie jde jen do dvou "
+"úrovní dolů (např. 'Artist/Album/Tracks'),"
+"</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:810
+#. i18n: ectx: property (text), widget (StateLabel, httpNote)
+#: po/rc.cpp:524 rc.cpp:524
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata "
 "currently cannot upload files to external HTTP servers. Therefore, the above "
-"settings should be left disabled.</i>"
+"settings should be left un-checked.</i>"
 msgstr ""
 "<i><b>POZNÁMKA:</b> Složka s hudbou je nastavena na adresu HTTP a Cantata v "
 "současnosti nedokáže nahrávat soubory na vnější servery HTTP. Z tohoto "
 "důvodu by se nastavení výše měla ponechat zakázána.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:857
+#. i18n: file: gui/initialsettingswizard.ui:843
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:460 rc.cpp:460
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Finished!"
 msgstr "Dokončeno!"
 
-#. i18n: file: gui/initialsettingswizard.ui:880
+#. i18n: file: gui/initialsettingswizard.ui:866
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:463 rc.cpp:463
+#: po/rc.cpp:530 rc.cpp:530
 msgid ""
 "Cantata is now configured! If you wish to further configure Cantata (to add "
 "extra MPD hosts, etc) then Canta's configuration dialog may be accessed from "
@@ -4772,9 +5085,9 @@ msgstr ""
 "další hostitele MPD atd.), k nastavovacímu dialogu Cantaty lze přistupovat z "
 "nabídky spouštěné tlačítkem v hlavním okně Cantaty nahoře vpravo."
 
-#. i18n: file: gui/initialsettingswizard.ui:918
+#. i18n: file: gui/initialsettingswizard.ui:904
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:466 rc.cpp:466
+#: po/rc.cpp:533 rc.cpp:533
 msgid ""
 "<b>Warning:</b> You are not currently a member of the 'users' group. Cantata "
 "will function better (saving of album covers, lyrics, etc. with the correct "
@@ -4788,207 +5101,307 @@ msgstr ""
 "skupiny. Pokud přidáte sebe sama, budete se muset odhlásit a zase přihlásit, "
 "aby se tato změna projevila."
 
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:36
+#. i18n: ectx: attribute (title), widget (QWidget, sidebarTab)
+#: po/rc.cpp:536 rc.cpp:536
+msgid "Sidebar"
+msgstr "Postranní panel"
+
+#. i18n: file: gui/interfacesettings.ui:42
+#. i18n: ectx: property (title), widget (QGroupBox, viewsGroup)
+#: po/rc.cpp:539 rc.cpp:539
+msgid "Views"
+msgstr "Pohledy"
+
+#. i18n: file: gui/interfacesettings.ui:48
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:542 rc.cpp:542
+msgid "Use the checkboxes below to configure the list of active views."
+msgstr "Použijte zaškrtávací okénka níže k nastavení seznamu činných pohledů."
+
+#. i18n: file: gui/interfacesettings.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, sbPlayQueueLabel)
+#: po/rc.cpp:545 rc.cpp:545
+msgid ""
+"<i><b>NOTE:</b> By default, the play queue appears to the side of the other "
+"views. If you enable the option above, then it will be merged into the "
+"sidebar as per other views.</i>"
+msgstr ""
+"<i><b>POZNÁMKA:</b> Ve výchozím nastavení se řada skladeb určených k přehrání "
+"objevuje po straně vedle jiných pohledů. Pokud povolíte volbu výše, bude "
+"sloučena do "
+"postranního panelu k jiným pohledům.</i>"
+
+#. i18n: file: gui/interfacesettings.ui:106
+#. i18n: ectx: property (text), widget (StateLabel, sbInfoLabel)
+#: po/rc.cpp:548 rc.cpp:548
+msgid ""
+"<i><b>NOTE:</b> By default, the 'Info' (current song information) view is "
+"accessible by pressing its icon in the main toolbar. If you enable the "
+"option above, then it will be merged into the sidebar as per other views.</i>"
+msgstr ""
+"<i><b>POZNÁMKA:</b> Ve výchozím nastavení je pohled na informace (informace "
+"o nynější skladbě) zpřístupněn stisknutím ikony pro něj v hlavním "
+"nástrojovém pruhu. Pokud povolíte volbu výše, bude sloučena do "
+"postranního panelu k jiným pohledům.</i>"
+
+#. i18n: file: gui/interfacesettings.ui:144
+#. i18n: ectx: property (text), widget (BuddyLabel, sbPositionLabel)
+#: po/rc.cpp:557 rc.cpp:557
+msgid "Position:"
+msgstr "Poloha:"
+
+#. i18n: file: gui/interfacesettings.ui:157
+#. i18n: ectx: property (text), widget (QCheckBox, sbIconsOnly)
+#: po/rc.cpp:560 rc.cpp:560
+msgid "Only show icons, no text"
+msgstr "Ukázat jen ikony, žádný text"
+
+#. i18n: file: gui/interfacesettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, sbMonoIcons)
+#: po/rc.cpp:563 rc.cpp:563
+msgid "Use monochrome icons"
+msgstr "Použít jednobarevné ikony"
+
+#. i18n: file: gui/interfacesettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, sbAutoHide)
+#: po/rc.cpp:566 rc.cpp:566
+msgid "Auto-hide"
+msgstr "Automatické skrývání"
+
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#: po/rc.cpp:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
+#: po/rc.cpp:575 po/rc.cpp:594 rc.cpp:575 rc.cpp:594
 msgid "Covers:"
 msgstr "Obaly:"
 
-#. i18n: file: gui/interfacesettings.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:478 rc.cpp:478
-msgid "Show artist images:"
-msgstr "Ukázat obrázky umělců:"
+#. i18n: file: gui/interfacesettings.ui:219
+#. i18n: ectx: property (text), widget (QCheckBox, libraryArtistImage)
+#: po/rc.cpp:578 rc.cpp:578
+msgid "Show artist images"
+msgstr "Ukázat obrázky umělců"
 
-#. i18n: file: gui/interfacesettings.ui:81
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:481 rc.cpp:481
-msgid "Show album year:"
-msgstr "Ukázat rok alba:"
+#. i18n: file: gui/interfacesettings.ui:226
+#. i18n: ectx: property (text), widget (QCheckBox, libraryYear)
+#: po/rc.cpp:581 rc.cpp:581
+msgid "Show album year"
+msgstr "Ukázat rok alba"
 
-#. i18n: file: gui/interfacesettings.ui:123
+#. i18n: file: gui/interfacesettings.ui:258
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:484 rc.cpp:484
+#: po/rc.cpp:584 rc.cpp:584
 msgid ""
 "<i><b>NOTE:</b> When looking for artist images, Cantata will look for either "
 "artist.jpg, artist.png, 'Artist'.jpg, or 'Artist'.png,\n"
 "within the folder of the current track, or within its parent folder. If no "
-"image is found, Cantata will attempt to download one. When the image is "
-"displayed, it will be cropped (either top/bottom, or left/right) to provide "
-"a square image.</i>"
+"image is found, Cantata will attempt to download one.</i>"
 msgstr ""
 "<i><b>POZNÁMKA:</b> Při hledání obrázků umělců bude Cantata hledat buď "
 "artist.jpg, artist.png, 'Artist'.jpg, nebo 'Artist'.png\n"
 "ve složce s nynější skladbou, nebo v její rodičovské složce. Pokud není "
-"nalezen žádný obrázek, Cantata se pokusí o stažení jednoho. Když je obrázek "
-"zobrazen, bude ořezán (buď nahoře/dole, nebo vlevo/vpravo), aby měl podobu "
-"čtverce.</i>"
+"nalezen žádný obrázek, Cantata se pokusí o stažení jednoho.</i>"
 
-#. i18n: file: gui/interfacesettings.ui:172
+#. i18n: file: gui/interfacesettings.ui:307
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:497 rc.cpp:497
+#: po/rc.cpp:597 rc.cpp:597
 msgid "Sort albums:"
 msgstr "Třídit alba:"
 
-#. i18n: file: gui/interfacesettings.ui:183
+#. i18n: file: gui/interfacesettings.ui:318
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:500 rc.cpp:500
+#: po/rc.cpp:600 rc.cpp:600
 msgid "Album/Artist"
 msgstr "Album/Umělec"
 
-#. i18n: file: gui/interfacesettings.ui:188
+#. i18n: file: gui/interfacesettings.ui:323
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:503 rc.cpp:503
+#: po/rc.cpp:603 rc.cpp:603
 msgid "Artist/Album"
 msgstr "Umělec/Album"
 
-#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: file: gui/interfacesettings.ui:328
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:506 rc.cpp:506
+#: po/rc.cpp:606 rc.cpp:606
 msgid "Artist/Year/Album"
 msgstr "Umělec/Rok/Album"
 
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#: po/rc.cpp:515 po/rc.cpp:545 rc.cpp:515 rc.cpp:545
-msgid "Initially collapse albums:"
-msgstr "Nejprve složit alba:"
-
-#. i18n: file: gui/interfacesettings.ui:242
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#: po/rc.cpp:615 po/rc.cpp:645 rc.cpp:615 rc.cpp:645
+msgid "Initially collapse albums"
+msgstr "Na začátku alba složit"
+
+#. i18n: file: gui/interfacesettings.ui:367
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:518 rc.cpp:518
+#: po/rc.cpp:618 rc.cpp:618
 msgid "Other Views"
 msgstr "Jiné pohledy"
 
-#. i18n: file: gui/interfacesettings.ui:251
+#. i18n: file: gui/interfacesettings.ui:376
 #. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
-#: po/rc.cpp:521 rc.cpp:521
+#: po/rc.cpp:621 rc.cpp:621
 msgid "Folder view style:"
 msgstr "Styl pohledu se složkami:"
 
-#. i18n: file: gui/interfacesettings.ui:264
+#. i18n: file: gui/interfacesettings.ui:389
 #. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
-#: po/rc.cpp:524 rc.cpp:524
+#: po/rc.cpp:624 rc.cpp:624
 msgid "Streams view style:"
 msgstr "Styl pohledu s proudy:"
 
-#. i18n: file: gui/interfacesettings.ui:277
+#. i18n: file: gui/interfacesettings.ui:402
 #. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
-#: po/rc.cpp:527 rc.cpp:527
+#: po/rc.cpp:627 rc.cpp:627
 msgid "Online view style:"
 msgstr "Styl pohledu s internetem:"
 
-#. i18n: file: gui/interfacesettings.ui:290
+#. i18n: file: gui/interfacesettings.ui:415
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:530 rc.cpp:530
+#: po/rc.cpp:630 rc.cpp:630
 msgid "Devices view style:"
 msgstr "Styl pohled se zařízeními:"
 
-#. i18n: file: gui/interfacesettings.ui:324
-#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:539 rc.cpp:539
-msgid "Table"
-msgstr "Tabulka"
-
-#. i18n: file: gui/interfacesettings.ui:354
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueAutoExpandLabel)
-#: po/rc.cpp:548 rc.cpp:548
-msgid "Automatically expand current album:"
-msgstr "Automaticky rozbalit nynější album:"
-
-#. i18n: file: gui/interfacesettings.ui:371
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueScrollLabel)
-#: po/rc.cpp:551 rc.cpp:551
-msgid "Scroll to current track:"
-msgstr "Projíždět k nynější skladbě:"
-
-#. i18n: file: gui/interfacesettings.ui:384
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueBackgroundLabel)
-#: po/rc.cpp:554 rc.cpp:554
-msgid "Use current album cover as background:"
-msgstr "Použít nynější obal alba jako pozadí:"
-
-#. i18n: file: gui/interfacesettings.ui:397
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueConfirmClearLabel)
-#: po/rc.cpp:557 rc.cpp:557
-msgid "Prompt before clearing:"
-msgstr "Vyzvat před vyprázdněním:"
-
-#. i18n: file: gui/interfacesettings.ui:411
+#. i18n: file: gui/interfacesettings.ui:469
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueAutoExpand)
+#: po/rc.cpp:648 rc.cpp:648
+msgid "Automatically expand current album"
+msgstr "Automaticky rozbalit nynější album"
+
+#. i18n: file: gui/interfacesettings.ui:476
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueScroll)
+#: po/rc.cpp:651 rc.cpp:651
+msgid "Scroll to current track"
+msgstr "Projíždět k nynější skladbě"
+
+#. i18n: file: gui/interfacesettings.ui:483
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueConfirmClear)
+#: po/rc.cpp:654 rc.cpp:654
+msgid "Prompt before clearing"
+msgstr "Vyzvat před vyprázdněním"
+
+#. i18n: file: gui/interfacesettings.ui:509
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_cover)
+#: po/rc.cpp:663 rc.cpp:663
+msgid "Current album cover"
+msgstr "Obal nynějšího alba"
+
+#. i18n: file: gui/interfacesettings.ui:638
 #. i18n: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:560 rc.cpp:560
+#: po/rc.cpp:682 rc.cpp:682
 msgid "External"
 msgstr "Vnější"
 
-#. i18n: file: gui/interfacesettings.ui:417
-#. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:563 rc.cpp:563
-msgid "Show icon in notification area:"
-msgstr "Ukázat ikonu v oznamovací oblasti:"
-
-#. i18n: file: gui/interfacesettings.ui:437
-#. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:566 rc.cpp:566
-msgid "Minimize to notification area when closed:"
-msgstr "Při zavření zmenšit do oznamovací oblasti:"
-
-#. i18n: file: gui/interfacesettings.ui:457
-#. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:569 rc.cpp:569
-msgid "Show popup messages when changing tracks:"
-msgstr "Ukázat vyskakovací zprávy při změnách skladeb:"
-
-#. i18n: file: gui/interfacesettings.ui:475
+#. i18n: file: gui/interfacesettings.ui:644
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayPopup)
+#: po/rc.cpp:685 rc.cpp:685
+msgid "Show popup messages when changing tracks"
+msgstr "Ukázat vyskakovací zprávy při změnách skladeb"
+
+#. i18n: file: gui/interfacesettings.ui:654
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayCheckBox)
+#: po/rc.cpp:688 rc.cpp:688
+msgid "Show icon in notification area"
+msgstr "Ukázat ikonu v oznamovací oblasti"
+
+#. i18n: file: gui/interfacesettings.ui:664
+#. i18n: ectx: property (text), widget (QCheckBox, minimiseOnClose)
+#: po/rc.cpp:691 rc.cpp:691
+msgid "Minimize to notification area when closed"
+msgstr "Při zavření zmenšit do oznamovací oblasti"
+
+#. i18n: file: gui/interfacesettings.ui:671
+#. i18n: ectx: property (title), widget (QGroupBox, startupState)
+#: po/rc.cpp:694 rc.cpp:694
+msgid "On Start-up"
+msgstr "Při spuštění"
+
+#. i18n: file: gui/interfacesettings.ui:677
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateShow)
+#: po/rc.cpp:697 rc.cpp:697
+msgid "Show main window"
+msgstr "Ukázat hlavní okno"
+
+#. i18n: file: gui/interfacesettings.ui:684
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateHide)
+#: po/rc.cpp:700 rc.cpp:700
+msgid "Hide main window"
+msgstr "Skrýt hlavní okno"
+
+#. i18n: file: gui/interfacesettings.ui:691
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateRestore)
+#: po/rc.cpp:703 rc.cpp:703
+msgid "Restore previous state"
+msgstr "Obnovit předchozí stav"
+
+#. i18n: file: gui/interfacesettings.ui:715
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:572 rc.cpp:572
+#: po/rc.cpp:706 rc.cpp:706
 msgid "General"
 msgstr "Obecné"
 
-#. i18n: file: gui/interfacesettings.ui:486
-#. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:575 rc.cpp:575
-msgid "Group single track albums:"
-msgstr "Seskupit alba s jednotlivými skladbami:"
-
-#. i18n: file: gui/interfacesettings.ui:503
-#. i18n: ectx: property (text), widget (BuddyLabel, useComposerLabel)
-#: po/rc.cpp:578 rc.cpp:578
-msgid "Group albums by composer:"
-msgstr "Seskupit alba podle skladatele:"
-
-#. i18n: file: gui/interfacesettings.ui:520
-#. i18n: ectx: property (text), widget (BuddyLabel, groupMultipleLabel)
-#: po/rc.cpp:581 rc.cpp:581
-msgid "Multiple artist albums:"
-msgstr "Alba s více umělci:"
-
-#. i18n: file: gui/interfacesettings.ui:533
-#. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:584 rc.cpp:584
-msgid "Show delete action in context menus:"
-msgstr "Ukázat krok pro smazání v souvisejících nabídkách:"
-
-#. i18n: file: gui/interfacesettings.ui:550
-#. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:587 rc.cpp:587
-msgid "Enforce single-click activation of items:"
-msgstr "Vynutit zapnutí jedním klepnutím u položek:"
-
-#. i18n: file: gui/interfacesettings.ui:591
+#. i18n: file: gui/interfacesettings.ui:726
+#. i18n: ectx: property (text), widget (QCheckBox, groupSingle)
+#: po/rc.cpp:709 rc.cpp:709
+msgid "Group single track albums"
+msgstr "Seskupit alba s jednotlivými skladbami"
+
+#. i18n: file: gui/interfacesettings.ui:733
+#. i18n: ectx: property (text), widget (QCheckBox, useComposer)
+#: po/rc.cpp:712 rc.cpp:712
+msgid "Group albums by composer"
+msgstr "Seskupit alba podle skladatele"
+
+#. i18n: file: gui/interfacesettings.ui:740
+#. i18n: ectx: property (text), widget (QCheckBox, groupMultiple)
+#: po/rc.cpp:715 rc.cpp:715
+msgid "Group multiple artist albums under 'Various Artists'"
+msgstr "Seskupit alba s více umělci pod Různí umělci"
+
+#. i18n: file: gui/interfacesettings.ui:747
+#. i18n: ectx: property (text), widget (QCheckBox, fetchCovers)
+#: po/rc.cpp:718 rc.cpp:718
+msgid "Fetch missing covers from Last.fm"
+msgstr "Natáhnout chybějící obaly z Last.fm"
+
+#. i18n: file: gui/interfacesettings.ui:754
+#. i18n: ectx: property (text), widget (QCheckBox, cacheScaledCovers)
+#: po/rc.cpp:721 rc.cpp:721
+msgid "Cache scaled covers"
+msgstr "Uložit obaly se změněnou velikostí do vyrovnávací paměti"
+
+#. i18n: file: gui/interfacesettings.ui:761
+#. i18n: ectx: property (text), widget (QCheckBox, showDeleteAction)
+#: po/rc.cpp:724 rc.cpp:724
+msgid "Show delete action in context menus"
+msgstr "Ukázat položku Smazat v nabídkách souvisejících činností"
+
+#. i18n: file: gui/interfacesettings.ui:768
+#. i18n: ectx: property (text), widget (QCheckBox, forceSingleClick)
+#: po/rc.cpp:727 rc.cpp:727
+msgid "Enforce single-click activation of items"
+msgstr "Vynutit zapnutí položek jedním klepnutím"
+
+#. i18n: file: gui/interfacesettings.ui:775
+#. i18n: ectx: property (text), widget (BuddyLabel, langLabel)
+#: po/rc.cpp:730 rc.cpp:730
+msgid "Language:"
+msgstr "Jazyk:"
+
+#. i18n: file: gui/interfacesettings.ui:806
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:590 rc.cpp:590
+#: po/rc.cpp:733 rc.cpp:733
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
@@ -4996,87 +5409,103 @@ msgstr ""
 "<i><b>POZNÁMKA:</b> Změna nastavení Vynutit zapnutí jedním klepnutím u "
 "položek vyžaduje opětovné spuštění Cantaty.</i>"
 
-#. i18n: file: gui/mainwindow.ui:287
+#. i18n: file: gui/interfacesettings.ui:835
+#. i18n: ectx: property (text), widget (StateLabel, langNoteLabel)
+#: po/rc.cpp:736 rc.cpp:736
+msgid ""
+"<i><b>NOTE:</b> Changing the language setting will require a re-start of "
+"Cantata.</i>"
+msgstr ""
+"<i><b>POZNÁMKA:</b> Změna nastavení jazyka vyžaduje opětovné spuštění "
+"Cantaty.</i>"
+
+#. i18n: file: gui/mainwindow.ui:298
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:593 rc.cpp:593
+#: po/rc.cpp:739 rc.cpp:739
 msgid "[Dynamic]"
 msgstr "[Dynamický]"
 
-#. i18n: file: gui/playbacksettings.ui:20
+#. i18n: file: gui/playbacksettings.ui:38
+#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
+#: po/rc.cpp:745 rc.cpp:745
+msgid "Fadeout on stop:"
+msgstr "Zeslabení při zastavení:"
+
+#. i18n: file: gui/playbacksettings.ui:48
+#. i18n: ectx: property (suffix), widget (QSpinBox, stopFadeDuration)
+#: po/rc.cpp:748 rc.cpp:748
+msgid " ms"
+msgstr " ms"
+
+#. i18n: file: gui/playbacksettings.ui:58
+#. i18n: ectx: property (text), widget (QCheckBox, stopOnExit)
+#: po/rc.cpp:754 rc.cpp:754
+msgid "Stop playback on exit"
+msgstr "Zastavit přehrávání při ukončení"
+
+#. i18n: file: gui/playbacksettings.ui:65
+#. i18n: ectx: property (text), widget (QCheckBox, stopDynamizerOnExit)
+#: po/rc.cpp:757 rc.cpp:757
+msgid "Stop dynamizer on exit"
+msgstr "Zastavit dynamizátor při ukončení"
+
+#. i18n: file: gui/playbacksettings.ui:72
+#. i18n: ectx: property (text), widget (QCheckBox, inhibitSuspend)
+#: po/rc.cpp:760 rc.cpp:760
+msgid "Inhibit suspend whilst playing"
+msgstr "Bránit uspání při přehrávání"
+
+#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:763 rc.cpp:763
+msgid ""
+"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
+"shown allowing you to choose whether to stop playback now, or after the "
+"current track.</i>"
+msgstr ""
+"<i><b>POZNÁMKA:</b> Pokud stisknete a podržíte tlačítko pro zastavení, ukáže "
+"se nabídka, v níž si budete moci zvolit, zda se má přehrávání zastavit nyní, "
+"nebo po nynější skladbě.</i>"
+
+#. i18n: file: gui/playbacksettings.ui:108
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:596 rc.cpp:596
+#: po/rc.cpp:766 rc.cpp:766
 msgid "Output"
 msgstr "Výstup"
 
-#. i18n: file: gui/playbacksettings.ui:41
+#. i18n: file: gui/playbacksettings.ui:129
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:602 rc.cpp:602
-msgid "Crossfading:"
-msgstr "Prolínání:"
+#: po/rc.cpp:772 rc.cpp:772
+msgid "Crossfade between tracks:"
+msgstr "Prolínání mezi skladbami"
 
-#. i18n: file: gui/playbacksettings.ui:51
-#. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:605 rc.cpp:605
-msgid " seconds"
-msgstr " sekund"
+#. i18n: file: gui/playbacksettings.ui:139
+#. i18n: ectx: property (suffix), widget (QSpinBox, crossfading)
+#: po/rc.cpp:775 rc.cpp:775
+msgid " s"
+msgstr " s"
 
-#. i18n: file: gui/playbacksettings.ui:61
+#. i18n: file: gui/playbacksettings.ui:152
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:608 rc.cpp:608
+#: po/rc.cpp:781 rc.cpp:781
 msgid "Replay gain:"
 msgstr "Vyrovnání hlasitosti:"
 
-#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: file: gui/playbacksettings.ui:195
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:611 rc.cpp:611
+#: po/rc.cpp:784 rc.cpp:784
 msgid "About replay gain"
 msgstr "O vyrovnání hlasitosti"
 
-#. i18n: file: gui/playbacksettings.ui:104
+#. i18n: file: gui/playbacksettings.ui:204
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:614 rc.cpp:614
-msgid "Devices:"
-msgstr "Zařízení:"
-
-#. i18n: file: gui/playbacksettings.ui:141
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:620 rc.cpp:620
-msgid "Fadeout on stop:"
-msgstr "Zeslabení při zastavení:"
-
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:623 rc.cpp:623
-msgid "Stop playback on exit:"
-msgstr "Zastavit přehrávání při ukončení:"
-
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:626 rc.cpp:626
-msgid "Stop dynamizer on exit:"
-msgstr "Zastavit dynamizátor při ukončení:"
-
-#. i18n: file: gui/playbacksettings.ui:184
-#. i18n: ectx: property (text), widget (BuddyLabel, inhibitSuspendLabel)
-#: po/rc.cpp:629 rc.cpp:629
-msgid "Inhibit suspend whilst playing:"
-msgstr "Zabrán&it uspání při přehrávání:"
-
-#. i18n: file: gui/playbacksettings.ui:217
-#. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:632 rc.cpp:632
-msgid ""
-"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
-"shown allowing you to choose whether to stop playback now, or after the "
-"current track.</i>"
-msgstr ""
-"<i><b>POZNÁMKA:</b> Pokud stisknete a podržíte tlačítko pro zastavení, ukáže "
-"se nabídka, v níž si budete moci zvolit, zda se má přehrávání zastavit nyní, "
-"nebo po nynější skladbě.</i>"
+#: po/rc.cpp:787 rc.cpp:787
+msgid "Use the checkboxes below to control the active outputs."
+msgstr "Použijte zaškrtávací okénka níže k ovládání činných výstupů."
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:635 rc.cpp:635
+#: po/rc.cpp:790 rc.cpp:790
 msgid "Collection:"
 msgstr "Sbírka:"
 
@@ -5088,25 +5517,25 @@ msgstr "Sbírka:"
 #. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
 #. i18n: file: gui/serversettings.ui:338
 #. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
-#: po/rc.cpp:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
+#: po/rc.cpp:808 po/rc.cpp:829 rc.cpp:808 rc.cpp:829
 msgid "Cover filename:"
 msgstr "Název souboru obalu:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:656 rc.cpp:656
+#: po/rc.cpp:811 rc.cpp:811
 msgid "Dynamizer port:"
 msgstr "Přípojka dynamizátoru:"
 
 #. i18n: file: gui/serversettings.ui:168
 #. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
-#: po/rc.cpp:659 rc.cpp:659
+#: po/rc.cpp:814 rc.cpp:814
 msgid "HTTP stream URL:"
 msgstr "Adresa (URL) proudu HTTP:"
 
 #. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:662 rc.cpp:662
+#: po/rc.cpp:817 rc.cpp:817
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art "
 "(either the value specified above, or <code>cover.jpg / cover.png</code> if "
@@ -5121,20 +5550,19 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:277
 #. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
-#: po/rc.cpp:668 rc.cpp:668
+#: po/rc.cpp:823 rc.cpp:823
 msgid ""
 "<i><b>NOTE:</b> 'HTTP Stream URL' is only of use if you have MPD configured "
 "to output to a HTTP stream, and you wish Cantata to be able to play that "
 "stream.</i>"
 msgstr ""
 "<i><b>POZNÁMKA:</b> Adresa (URL) proudu HTTP se používá jen tehdy, když máte "
-"nastaveno MPD na "
-"výstup do proudu HTTP, a přejete si, aby Cantata mohla tento proud přehrávat."
-"</i>"
+"nastaveno MPD na výstup do proudu HTTP, a přejete si, aby Cantata mohla "
+"tento proud přehrávat.</i>"
 
 #. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:677 rc.cpp:677
+#: po/rc.cpp:832 rc.cpp:832
 msgid ""
 "<i><b>NOTE:</b> If you change the 'Music folder' setting, then you will need "
 "to manually update the music database. This can be performed by pressing the "
@@ -5146,29 +5574,23 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:379
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel_2)
-#: po/rc.cpp:680 rc.cpp:680
+#: po/rc.cpp:835 rc.cpp:835
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
 msgstr ""
 "<i><b>POZNÁMKA:</b> Pokud není nastaveno žádné nastavení pro název souboru s "
-"obalem, pak bude Cantata používat výchozí<code>obal</code> </i>"
+"obalem, pak bude Cantata používat výchozí <code>obal</code> </i>"
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:683 rc.cpp:683
+#: po/rc.cpp:838 rc.cpp:838
 msgid "Network interface:"
 msgstr "Síťové rozhraní:"
 
-#. i18n: file: http/httpserversettings.ui:38
-#. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:686 rc.cpp:686
-msgid "Current URL:"
-msgstr "Nynější adresa (URL):"
-
-#. i18n: file: http/httpserversettings.ui:73
+#. i18n: file: http/httpserversettings.ui:57
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:689 rc.cpp:689
+#: po/rc.cpp:841 rc.cpp:841
 msgid ""
 "<i><b>NOTE:</b> MPD usually only plays songs that are stored within its "
 "folders. Cantata contains a minimal HTTP server that can be used to serve "
@@ -5182,40 +5604,35 @@ msgstr ""
 "podávání jiných souborů MPD. Nicméně toto bude pracovat, jen když Cantata "
 "běží.<br/><br/>\n"
 "<b>POZNÁMKA:</b> Pokud zvolíte pro síťové rozhraní místní smyčku, potom "
-"<b>musí</b> být MPD rovněž na tom to počítači.</i>"
+"<b>musí</b> být MPD rovněž na tomto počítači.</i>"
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:693 rc.cpp:693
+#: po/rc.cpp:845 rc.cpp:845
 msgid "Mode:"
 msgstr "Režim:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:699 rc.cpp:699
+#: po/rc.cpp:851 rc.cpp:851
 msgid "HTTP Proxy"
 msgstr "Proxy HTTP"
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:702 rc.cpp:702
+#: po/rc.cpp:854 rc.cpp:854
 msgid "SOCKS Proxy"
 msgstr "Proxy SOCKS"
 
 #. i18n: file: online/onlinesettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:717 rc.cpp:717
-msgid ""
-"The following is a list of online providers, to hide a provider simply un-"
-"check its entry in this list."
-msgstr ""
-"Následující je seznam internetových poskytovatelů. Pro skrytí poskytovatele "
-"jednoduše zrušte "
-"jeho zaškrtnutí v tomto seznamu."
+#: po/rc.cpp:869 rc.cpp:869
+msgid "Use the checkboxes below to configure the list of active services."
+msgstr "Použijte zaškrtávací okénka níže k nastavení seznamu činných služeb."
 
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:723 rc.cpp:723
+#: po/rc.cpp:875 rc.cpp:875
 msgid ""
 "You can listen for free without an account, but Premium members can listen "
 "to higher quality streams without advertisements. Visit <a href=\"http://www."
@@ -5229,211 +5646,199 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:726 rc.cpp:726
+#: po/rc.cpp:878 rc.cpp:878
 msgid "Premium Account"
 msgstr "Prémiový účet"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:735 rc.cpp:735
+#: po/rc.cpp:887 rc.cpp:887
 msgid "Stream type:"
 msgstr "Typ proudu:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:738 rc.cpp:738
+#: po/rc.cpp:890 rc.cpp:890
 msgid "Status:"
 msgstr "Stav:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:109
 #. i18n: ectx: property (text), widget (QPushButton, loginButton)
-#: po/rc.cpp:741 streams/digitallyimportedsettings.cpp:130
-#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
+#: po/rc.cpp:893 streams/digitallyimportedsettings.cpp:131
+#: streams/digitallyimportedsettings.cpp:137 rc.cpp:893
 msgid "Login"
 msgstr "Přihlášení"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:747 rc.cpp:747
+#: po/rc.cpp:899 rc.cpp:899
 msgid "Session expiry:"
 msgstr "Vypršení sezení:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:151
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:750 rc.cpp:750
+#: po/rc.cpp:902 rc.cpp:902
 msgid ""
 "<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
 "RockRadio.com, and Sky.fm</i>"
 msgstr ""
 "<i><b>POZNÁMKA:</b> Tato nastavení se použijí na Digitally Imported, "
-"JazzRadio.com, "
-"RockRadio.com, and Sky.fm.</i>"
+"JazzRadio.com, RockRadio.com, and Sky.fm.</i>"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:161
 #. i18n: ectx: property (text), widget (QLabel, note2Label)
-#: po/rc.cpp:753 rc.cpp:753
+#: po/rc.cpp:905 rc.cpp:905
 msgid ""
 "<i><b>NOTE:</b> If you enter account details, then a 'DI' status item will "
 "appear under the list of streams. This will indicate if you are logged in or "
 "not</i>"
 msgstr ""
 "<i><b>POZNÁMKA:</b> Pokud zadáte podrobnosti účtu, stav 'DI' (Digitally "
-"Imported) "
-"se objeví pod seznamem proudů. To ukáže, zda jste přihlášen nebo "
+"Imported) se objeví pod seznamem proudů. To ukáže, zda jste přihlášen nebo "
 "nejste.</i>"
 
 #. i18n: file: streams/streamssettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:756 rc.cpp:756
-msgid ""
-"The following is a list of the top-level stream categories, to hide a "
-"category simply un-check its entry in this list."
+#: po/rc.cpp:908 rc.cpp:908
+msgid "Use the checkboxes below to configure the list of active providers."
 msgstr ""
-"Následující je seznam skupin proudů na nejvyšší úrovni. Pro skrytí skupiny "
-"jednoduše zrušte "
-"její zaškrtnutí v tomto seznamu."
+"Použijte zaškrtávací okénka níže k nastavení seznamu činných poskytovatelů."
 
 #. i18n: file: streams/streamssettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: po/rc.cpp:759 rc.cpp:759
+#: po/rc.cpp:911 rc.cpp:911
 msgid "Configure Provider"
 msgstr "Nastavit poskytovatele"
 
 #. i18n: file: streams/streamssettings.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, installButton)
-#: po/rc.cpp:762 rc.cpp:762
+#: po/rc.cpp:914 rc.cpp:914
 msgid "Install"
 msgstr "Instalovat"
 
 #. i18n: file: streams/streamssettings.ui:80
 #. i18n: ectx: property (text), widget (QLabel, note)
-#: po/rc.cpp:768 rc.cpp:768
+#: po/rc.cpp:920 rc.cpp:920
 msgid ""
 "<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
 "removed.</i>"
 msgstr ""
-"<i><b>POZNÁMKA:</b> Vestavěné skupiny jsou zobrazovány kurzívou, a tyto nelze "
-"odstranit.</i>"
+"<i><b>POZNÁMKA:</b> Vestavěné skupiny jsou zobrazovány kurzívou, a tyto "
+"nelze odstranit.</i>"
 
 #. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:771 rc.cpp:771
+#: po/rc.cpp:923 rc.cpp:923
 msgid "Search:"
 msgstr "Hledání:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:65
 #. i18n: ectx: property (title), widget (QGroupBox, actionBox)
-#: po/rc.cpp:774 rc.cpp:774
+#: po/rc.cpp:926 rc.cpp:926
 msgid "Shortcut for Selected Action"
 msgstr "Zkratka pro vybranou činnost"
 
 #. i18n: file: support/shortcutssettingswidget.ui:71
 #. i18n: ectx: property (text), widget (QRadioButton, useDefault)
-#: po/rc.cpp:777 rc.cpp:777
+#: po/rc.cpp:929 rc.cpp:929
 msgid "Default:"
 msgstr "Výchozí:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:85
 #. i18n: ectx: property (text), widget (QRadioButton, useCustom)
-#: po/rc.cpp:783 rc.cpp:783
+#: po/rc.cpp:935 rc.cpp:935
 msgid "Custom:"
 msgstr "Vlastní:"
 
-#. i18n: file: tags/tageditor.ui:25
-#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:786 rc.cpp:786
-msgid "Track:"
-msgstr "Skladba:"
-
 #. i18n: file: tags/tageditor.ui:64
 #. i18n: ectx: property (text), widget (StateLabel, albumArtistLabel)
-#: po/rc.cpp:795 rc.cpp:795
+#: po/rc.cpp:947 rc.cpp:947
 msgid "Album artist:"
 msgstr "Umělec alba:"
 
 #. i18n: file: tags/tageditor.ui:103
 #. i18n: ectx: property (text), widget (StateLabel, trackLabel)
-#: po/rc.cpp:804 rc.cpp:804
+#: po/rc.cpp:956 rc.cpp:956
 msgid "Track number:"
 msgstr "Číslo skladby:"
 
 #. i18n: file: tags/tageditor.ui:116
 #. i18n: ectx: property (text), widget (StateLabel, discLabel)
-#: po/rc.cpp:807 rc.cpp:807
+#: po/rc.cpp:959 rc.cpp:959
 msgid "Disc number:"
 msgstr "Číslo disku:"
 
-#. i18n: file: tags/trackorganiser.ui:155
+#. i18n: file: tags/trackorganiser.ui:115
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:834 rc.cpp:834
+#: po/rc.cpp:989 rc.cpp:989
 msgid "Original Name"
 msgstr "Původní název"
 
-#. i18n: file: tags/trackorganiser.ui:160
+#. i18n: file: tags/trackorganiser.ui:120
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:837 rc.cpp:837
+#: po/rc.cpp:992 rc.cpp:992
 msgid "New Name"
 msgstr "Nový název"
 
-#: po/rc.cpp:838 rc.cpp:838
+#: po/rc.cpp:996 rc.cpp:996
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "Pavel Fric"
 
-#: po/rc.cpp:839 rc.cpp:839
+#: po/rc.cpp:997 rc.cpp:997
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "pavelfric at seznam.cz"
 
-#: replaygain/rgdialog.cpp:121
+#: replaygain/rgdialog.cpp:116
 msgid "Show All Tracks"
 msgstr "Ukázat všechny skladby"
 
-#: replaygain/rgdialog.cpp:122
+#: replaygain/rgdialog.cpp:117
 msgid "Show Untagged Tracks"
 msgstr "Ukázat skladby bez značek"
 
-#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:124 tags/trackorganiser.cpp:79
 msgid "Remove From List"
 msgstr "Odstranit ze seznamu"
 
-#: replaygain/rgdialog.cpp:136
+#: replaygain/rgdialog.cpp:131
 msgid "Album Gain"
 msgstr "Zesílení alba"
 
-#: replaygain/rgdialog.cpp:137
+#: replaygain/rgdialog.cpp:132
 msgid "Track Gain"
 msgstr "Zesílení skladby"
 
-#: replaygain/rgdialog.cpp:138
+#: replaygain/rgdialog.cpp:133
 msgid "Album Peak"
 msgstr "Vrchol alba"
 
-#: replaygain/rgdialog.cpp:139
+#: replaygain/rgdialog.cpp:134
 msgid "Track Peak"
 msgstr "Vrchol skladby"
 
-#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
+#: replaygain/rgdialog.cpp:154 replaygain/rgdialog.cpp:283
 msgid "Scan"
 msgstr "Prohledat"
 
-#: replaygain/rgdialog.cpp:238
+#: replaygain/rgdialog.cpp:233
 msgid "Update ReplayGain tags in tracks?"
 msgstr "Obnovit značky pro vyrovnání hlasitosti ve skladbách?"
 
-#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
+#: replaygain/rgdialog.cpp:233 replaygain/rgdialog.cpp:234
 msgid "Update Tags"
 msgstr "Obnovit značky"
 
-#: replaygain/rgdialog.cpp:252
+#: replaygain/rgdialog.cpp:247
 msgid "Abort scanning of tracks?"
 msgstr "Zrušit prohledávání značek?"
 
-#: replaygain/rgdialog.cpp:261
+#: replaygain/rgdialog.cpp:256
 msgid "Abort reading of existing tags?"
 msgstr "Zrušit čtení stávajících značek?"
 
-#: replaygain/rgdialog.cpp:287
+#: replaygain/rgdialog.cpp:282
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
@@ -5441,63 +5846,63 @@ msgstr ""
 "Prohledat <b>všechny</b> skladby?<br><br><i>POZNÁMKA: Všechny skladby mají "
 "existující značky pro vyrovnání hlasitost.</i>"
 
-#: replaygain/rgdialog.cpp:289
+#: replaygain/rgdialog.cpp:284
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr ""
 "Chcete prohledat všechny skladby, nebo pouze soubory bez existujících značek?"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "Untagged Tracks"
 msgstr "Skladby bez značek"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "All Tracks"
 msgstr "Všechny skladby"
 
-#: replaygain/rgdialog.cpp:300
+#: replaygain/rgdialog.cpp:295
 msgid "Scanning tracks..."
 msgstr "Prohledávají se skladby..."
 
-#: replaygain/rgdialog.cpp:367
+#: replaygain/rgdialog.cpp:362
 msgid "Reading existing tags..."
 msgstr "Čtou se stávající značky..."
 
-#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+#: replaygain/rgdialog.cpp:414 tags/tageditor.cpp:798
 msgctxt "filename (Timeout)"
 msgid "%1 (Timeout)"
 msgstr "%1 (časové omezení)"
 
-#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:802
 msgctxt "filename (Corrupt tags?)"
 msgid "%1 (Corrupt tags?)"
 msgstr "%1 (poškozené značky?)"
 
-#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
+#: replaygain/rgdialog.cpp:432 tags/tageditor.cpp:812
 msgid "Failed to update the tags of the following tracks:"
 msgstr "Nepodařilo se zaktualizovat značky následujících skladeb:"
 
-#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
-#: tags/trackorganiser.cpp:451
+#: replaygain/rgdialog.cpp:473 tags/tageditor.cpp:885
+#: tags/trackorganiser.cpp:483
 msgid "Device is not connected."
 msgstr "Zařízení není připojeno."
 
-#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
-#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
+#: replaygain/rgdialog.cpp:513 replaygain/rgdialog.cpp:520
+#: replaygain/rgdialog.cpp:599 replaygain/rgdialog.cpp:601
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:520 replaygain/rgdialog.cpp:521
-#: replaygain/rgdialog.cpp:527 replaygain/rgdialog.cpp:528
-#: replaygain/rgdialog.cpp:579 replaygain/rgdialog.cpp:580
-#: replaygain/rgdialog.cpp:581 replaygain/rgdialog.cpp:582
+#: replaygain/rgdialog.cpp:516 replaygain/rgdialog.cpp:517
+#: replaygain/rgdialog.cpp:523 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:575 replaygain/rgdialog.cpp:576
+#: replaygain/rgdialog.cpp:577 replaygain/rgdialog.cpp:578
 msgid "Failed"
 msgstr "Nepodařilo se"
 
-#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
+#: replaygain/rgdialog.cpp:651 tags/trackorganiser.cpp:428
 msgid "Remove the selected tracks from the list?"
 msgstr "Odstranit vybrané skladby ze seznamu?"
 
-#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
+#: replaygain/rgdialog.cpp:652 tags/trackorganiser.cpp:429
 msgid "Remove Tracks"
 msgstr "Odstranit skladby"
 
@@ -5517,29 +5922,29 @@ msgstr "AAC 64k"
 msgid "AAC 128k"
 msgstr "AAC 128k"
 
-#: streams/digitallyimportedsettings.cpp:109
+#: streams/digitallyimportedsettings.cpp:110
 msgid "Logged out"
 msgstr "Odhlášen"
 
-#: streams/digitallyimportedsettings.cpp:112
+#: streams/digitallyimportedsettings.cpp:113
 msgid "Logging in..."
 msgstr "Přihlašuje se..."
 
-#: streams/digitallyimportedsettings.cpp:136
+#: streams/digitallyimportedsettings.cpp:137
 msgid "Logout"
 msgstr "Odhlásit se"
 
-#: streams/streamdialog.cpp:71
+#: streams/streamdialog.cpp:72
 msgid "URL:"
 msgstr "Adresa (URL):"
 
 #: streams/streamdialog.cpp:76
 msgid "Just add to play queue, do not save"
-msgstr "Pouze přidat do řady přehrávaných skladeb, neukládat"
+msgstr "Pouze přidat do řady skladeb k přehrání, neukládat"
 
 #: streams/streamdialog.cpp:77
 msgid "Add to play queue, and save to favorites"
-msgstr "Přidat do řady přehrávaných skladeb a uložit do oblíbených"
+msgstr "Přidat do řady skladeb k přehrání a uložit do oblíbených"
 
 #: streams/streamdialog.cpp:94
 msgid "Add Stream"
@@ -5553,7 +5958,7 @@ msgstr "Upravit proud"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>CHYBA:</b> Neplatný protokol</i>"
 
-#: streams/streamfetcher.cpp:205
+#: streams/streamfetcher.cpp:209
 msgid "Fetching %1"
 msgstr "Natahuje se %1"
 
@@ -5569,91 +5974,91 @@ msgstr "Vyvést oblíbené proudy"
 msgid "Add New Stream To Favorites"
 msgstr "Přidat nový proud do oblíbených"
 
-#: streams/streamspage.cpp:124
+#: streams/streamspage.cpp:125
 msgctxt "Service name"
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:243
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|Proudy XML"
 
-#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
+#: streams/streamspage.cpp:243 streams/streamspage.cpp:245
 msgid "Import Streams"
 msgstr "Zavést proudy"
 
-#: streams/streamspage.cpp:245
+#: streams/streamspage.cpp:246
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "Proudy XML (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:253
+#: streams/streamspage.cpp:254
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr ""
 "Nepodařilo se zavést <b>%1</b>!<br/>Prověřte, prosím, že to je správného "
 "typu."
 
-#: streams/streamspage.cpp:265
+#: streams/streamspage.cpp:266
 msgid "*.xml|XML Streams"
 msgstr "*.xml|Proudy XML"
 
-#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
+#: streams/streamspage.cpp:266 streams/streamspage.cpp:268
 msgid "Export Streams"
 msgstr "Vyvést proudy"
 
-#: streams/streamspage.cpp:267
+#: streams/streamspage.cpp:268
 msgid "XML Streams (*.xml)"
 msgstr "Proudy XML (*.xml)"
 
-#: streams/streamspage.cpp:279
+#: streams/streamspage.cpp:280
 msgid "Failed to create <b>%1</b>!"
 msgstr "Nepodařilo se vytvořit <b>%1</b>!"
 
-#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
+#: streams/streamspage.cpp:297 streams/streamspage.cpp:493
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "Proud již existuje!<br/><b>%1</b>"
 
-#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
+#: streams/streamspage.cpp:299 streams/streamspage.cpp:495
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "Proud pojmenovaný <b>%1</b> již existuje!"
 
-#: streams/streamspage.cpp:318
+#: streams/streamspage.cpp:319
 msgid "Bookmark added"
 msgstr "Záložka přidána"
 
-#: streams/streamspage.cpp:320
+#: streams/streamspage.cpp:321
 msgid "Already bookmarked"
 msgstr "Již opatřeno záložkou"
 
-#: streams/streamspage.cpp:366
+#: streams/streamspage.cpp:367
 msgid "Added to favorites"
 msgstr "Přidáno do oblíbených"
 
-#: streams/streamspage.cpp:368
+#: streams/streamspage.cpp:369
 msgid "Already in favorites"
 msgstr "Již v oblíbených"
 
-#: streams/streamspage.cpp:393
+#: streams/streamspage.cpp:394
 msgid "Reload <b>%1</b> streams?"
 msgstr "Nahrát znovu <b>%1</b> proudů?"
 
-#: streams/streamspage.cpp:411
+#: streams/streamspage.cpp:412
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr "Opravdu chcete odstranit záložku k <b>%1</b>?"
 
-#: streams/streamspage.cpp:417
+#: streams/streamspage.cpp:418
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr "Opravdu chcete odstranit všech <b>%1</b> záložek?"
 
-#: streams/streamspage.cpp:445
+#: streams/streamspage.cpp:446
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "Opravdu chcete odstranit %1 vybrané proudy?"
 
-#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
+#: streams/streamspage.cpp:450 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "Opravdu chcete odstranit <b>%1</b>?"
 
-#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+#: streams/streamspage.cpp:561 streams/streamspage.cpp:577
 msgid "Search %1:"
 msgstr "Hledání %1:"
 
@@ -5693,139 +6098,90 @@ msgstr "Nepodařilo se uložit seznam proudu."
 msgid "Failed to remove streams folder!"
 msgstr "Nepodařilo se odstranit složku s proudy!"
 
-#: support/dialog.cpp:89
+#: support/dialog.cpp:73
 msgid "&OK"
 msgstr "&OK"
 
-#: support/dialog.cpp:90
+#: support/dialog.cpp:74
 msgid "&Cancel"
 msgstr "&Zrušit"
 
-#: support/dialog.cpp:91
+#: support/dialog.cpp:75
 msgid "&Yes"
 msgstr "&Ano"
 
-#: support/dialog.cpp:92
+#: support/dialog.cpp:76
 msgid "&No"
 msgstr "&Ne"
 
-#: support/dialog.cpp:93
+#: support/dialog.cpp:77
 msgid "&Discard"
 msgstr "Za&hodit"
 
-#: support/dialog.cpp:94
+#: support/dialog.cpp:78
 msgid "&Save"
 msgstr "&Uložit"
 
-#: support/dialog.cpp:95
+#: support/dialog.cpp:79
 msgid "&Apply"
 msgstr "&Použít"
 
-#: support/dialog.cpp:96
+#: support/dialog.cpp:80
 msgid "&Close"
 msgstr "&Zavřít"
 
-#: support/dialog.cpp:98
+#: support/dialog.cpp:82
 msgid "&Overwrite"
 msgstr "&Přepsat"
 
-#: support/dialog.cpp:99
+#: support/dialog.cpp:83
 msgid "&Reset"
 msgstr "Nastavit &znovu"
 
-#: support/dialog.cpp:100
+#: support/dialog.cpp:84
 msgid "&Continue"
 msgstr "&Pokračovat"
 
-#: support/dialog.cpp:101
+#: support/dialog.cpp:85
 msgid "&Delete"
 msgstr "&Smazat"
 
-#: support/dialog.cpp:102
+#: support/dialog.cpp:86
 msgid "&Stop"
 msgstr "&Zastavit"
 
-#: support/dialog.cpp:103
+#: support/dialog.cpp:87
 msgid "&Remove"
 msgstr "&Odstranit"
 
-#: support/dialog.cpp:104
+#: support/dialog.cpp:88
 msgid "&Previous"
 msgstr "&Předchozí"
 
-#: support/dialog.cpp:105
+#: support/dialog.cpp:89
 msgid "&Next"
 msgstr "&Další"
 
-#: support/fancytabwidget.cpp:957
-msgid "Icons Only"
-msgstr "Pouze ikony"
-
-#: support/fancytabwidget.cpp:958
-msgid "Style"
-msgstr "Styl"
-
-#: support/fancytabwidget.cpp:959
-msgid "Large Sidebar"
-msgstr "Velký postranní panel"
-
-#: support/fancytabwidget.cpp:960
-msgid "Small Sidebar"
-msgstr "Malý postranní panel"
-
-#: support/fancytabwidget.cpp:961
-msgid "Top Bar"
-msgstr "Panel nahoře"
-
-#: support/fancytabwidget.cpp:962
-msgid "Bottom Bar"
-msgstr "Panel dole"
-
-#: support/fancytabwidget.cpp:963
-msgid "Tabs On Side"
-msgstr "Karty po straně"
-
-#: support/fancytabwidget.cpp:964
-msgid "Tabs On Top"
-msgstr "Karty nahoře"
-
-#: support/fancytabwidget.cpp:965
-msgid "Tabs On Bottom"
-msgstr "Karty dole"
-
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Password"
 msgstr "Heslo"
 
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Please enter password:"
 msgstr "Zadejte, prosím, heslo:"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:123
+#: support/messagebox.cpp:50 support/messagebox.cpp:124
 msgid "Warning"
 msgstr "Varování"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:118
+#: support/messagebox.cpp:50 support/messagebox.cpp:119
 msgid "Question"
 msgstr "Otázka"
 
-#: support/messagebox.cpp:107 support/messagebox.cpp:113
-#: support/messagebox.h:62
-msgid "Error"
-msgstr "Chyba"
-
 #: support/messagebox.h:65
 msgid "Information"
 msgstr "Informace"
 
-#: support/onoffbutton.cpp:47
-msgid "ON"
-msgstr "Zapnuto"
-
-#: support/onoffbutton.cpp:48
-msgid "OFF"
-msgstr "Vypnuto"
-
 #: support/pathrequester.cpp:50
 msgid "Select Folder"
 msgstr "Vybrat složku"
@@ -5869,31 +6225,31 @@ msgstr[0] "Jeden den %2"
 msgstr[1] "%1 dny %2"
 msgstr[2] "%1 dnů %2"
 
-#: tags/tageditor.cpp:134
+#: tags/tageditor.cpp:147
 msgid "Tags"
 msgstr "Značky"
 
-#: tags/tageditor.cpp:147
+#: tags/tageditor.cpp:160
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr "Nastavit Umělec alba z Umělec"
 
-#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
+#: tags/tageditor.cpp:261 tags/tageditor.cpp:592
 msgid "All tracks"
 msgstr "Všechny skladby"
 
-#: tags/tageditor.cpp:295
+#: tags/tageditor.cpp:323
 msgid "(Various)"
 msgstr "(Různí)"
 
-#: tags/tageditor.cpp:336
+#: tags/tageditor.cpp:368
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr "Použít zařazení pod Různí umělci na <b>všechny</b> skladby?"
 
-#: tags/tageditor.cpp:378
+#: tags/tageditor.cpp:410
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr "Zvrátit zařazení pod Různí umělci pro <b>všechny</b> skladby?"
 
-#: tags/tageditor.cpp:428
+#: tags/tageditor.cpp:460
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5901,15 +6257,15 @@ msgstr ""
 "Nastavit Umělec alba z Umělec (pokud je Umělec alba prázdný) pro <b>všechny</"
 "b> skladby?"
 
-#: tags/tageditor.cpp:429
+#: tags/tageditor.cpp:461
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr "Nastavit Umělec alba z Umělec (pokud je Umělec alba prázdný)?"
 
-#: tags/tageditor.cpp:430
+#: tags/tageditor.cpp:462
 msgid "Album Artist from Artist"
 msgstr "Umělec alba z Umělec"
 
-#: tags/tageditor.cpp:463
+#: tags/tageditor.cpp:495
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5917,54 +6273,54 @@ msgstr ""
 "Psát velkým písmenem první písmeno Názvu, Umělce, Umělce alba a Alba u "
 "<b>všech</b> skladeb?"
 
-#: tags/tageditor.cpp:496
+#: tags/tageditor.cpp:528
 msgid "Adjust the value of each track number by:"
 msgstr "Upravit hodnotu čísla každé skladby o:"
 
-#: tags/tageditor.cpp:554
+#: tags/tageditor.cpp:586
 msgid "All tracks [modified]"
 msgstr "Všechny skladby [změněno]"
 
-#: tags/tageditor.cpp:556
+#: tags/tageditor.cpp:588
 msgid "%1 [modified]"
 msgstr "%1 [změněno]"
 
-#: tags/tageditor.cpp:783
+#: tags/tageditor.cpp:827
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr ""
 "Chcete také přejmenovat své soubory s písněmi tak, aby se shodovaly se "
 "značkami?"
 
-#: tags/tageditor.cpp:784
+#: tags/tageditor.cpp:828
 msgid "Rename Files"
 msgstr "Přejmenovat soubory"
 
-#: tags/trackorganiser.cpp:150
+#: tags/trackorganiser.cpp:164
 msgid "Abort renaming of files?"
 msgstr "Zrušit přejmenování souborů?"
 
-#: tags/trackorganiser.cpp:263
+#: tags/trackorganiser.cpp:279
 msgid "Source file does not exist!<br/>%1"
 msgstr "Zdrojový soubor neexistuje!<br/>%1"
 
-#: tags/trackorganiser.cpp:282
+#: tags/trackorganiser.cpp:298
 msgid "Destination file already exists!<br/>%1"
 msgstr "Cílový soubor již existuje!<hr/>%1"
 
-#: tags/trackorganiser.cpp:304
+#: tags/trackorganiser.cpp:320
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "Nepodařilo se vytvořit cílovou složku!<br/>%1"
 
-#: tags/trackorganiser.cpp:325
+#: tags/trackorganiser.cpp:341
 msgid "Failed to rename %1 to %2"
 msgstr "Nepodařilo se přejmenovat %1 na %2"
 
-#: widgets/coverwidget.cpp:267
+#: widgets/coverwidget.cpp:280
 msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
 msgstr "<tr><td align=\"right\"><b>Skladatel:</b></td><td>%1</td></tr>"
 
-#: widgets/coverwidget.cpp:269
+#: widgets/coverwidget.cpp:282
 msgid ""
 "<tr><td align=\"right\"><b>Artist:</b></td><td>%1</td></tr><tr><td align="
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Year:"
@@ -5974,37 +6330,41 @@ msgstr ""
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Rok: "
 "</b></td><td>%3</td></tr>"
 
-#: widgets/genrecombo.cpp:54
+#: widgets/genrecombo.cpp:44
+msgid "Filter On Genre"
+msgstr "Filtr na žánr"
+
+#: widgets/genrecombo.cpp:66
 msgid "All Genres"
 msgstr "Všechny žánry"
 
-#: widgets/groupedview.cpp:267
+#: widgets/groupedview.cpp:265
 msgctxt "album (albumYear)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: widgets/groupedview.cpp:269
+#: widgets/groupedview.cpp:267
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: widgets/itemview.cpp:480
+#: widgets/itemview.cpp:561
 msgid "Go Back"
 msgstr "Jít zpět"
 
-#: widgets/itemview.cpp:485
+#: widgets/itemview.cpp:566
 msgid "Go Home"
 msgstr "Jít do domovské složky"
 
-#: widgets/menubutton.cpp:36
+#: widgets/menubutton.cpp:39
 msgid "Menu"
 msgstr "Nabídka"
 
-#: widgets/searchwidget.cpp:62
+#: widgets/searchwidget.cpp:63
 msgid "Search..."
 msgstr "Hledání..."
 
-#: widgets/searchwidget.cpp:66
+#: widgets/searchwidget.cpp:67
 msgid "Close Search Bar"
 msgstr "Zavřít vyhledávací pole"
 
@@ -6016,7 +6376,7 @@ msgstr "Přihlášen k %1"
 msgid "<b>NOT</b> logged into %1"
 msgstr "<b>NENÍ</b>přihlášen k %1"
 
-#: widgets/songdialog.cpp:48
+#: widgets/songdialog.cpp:49
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
 "\" setting, and MPD's \"music_directory\" setting.</p>"
@@ -6025,36 +6385,32 @@ msgstr ""
 "nastavení složky s hudbou Cantaty a nastavení adresáře s hudbou MPD "
 "(music_directory).</p>"
 
-#: widgets/songdialog.cpp:51
+#: widgets/songdialog.cpp:52
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check that the device is still "
 "attached.</p>"
 msgstr ""
-"<p>Nelze přistupovat k souborům s písněmi!<br/><br/>Prověřte, prosím, "
-"že zařízení je stále ještě připojeno.</p>"
+"<p>Nelze přistupovat k souborům s písněmi!<br/><br/>Prověřte, prosím, že "
+"zařízení je stále ještě připojeno.</p>"
 
-#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:115 widgets/volumeslider.cpp:230
+#: widgets/volumeslider.cpp:237
 msgid "Mute"
 msgstr "Ztlumit"
 
-#: widgets/volumeslider.cpp:199
+#: widgets/volumeslider.cpp:198
 msgid "Muted"
 msgstr "Ztlumeno"
 
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:237
 msgid "Unmute"
 msgstr "Zrušit ztišení"
 
-#: widgets/volumeslider.cpp:276
-msgid "Volume Disabled"
-msgstr "Hlasitost vypnuta"
-
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1% (Muted)"
 msgstr "Hlasitost: %1% (ztlumeno)"
 
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1%"
 msgstr "Hlasitost %1%"
 
@@ -6158,6 +6514,198 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Episodes"
 msgstr "Díly: %1"
 
+#~ msgid "Transcoding failed.<br/><br/<hr/>%1"
+#~ msgstr "Překódování se nezdařilo.<br/><br/<hr/>%1"
+
+#~ msgid "Failed to download track.<br/><br/<hr/>%1"
+#~ msgstr "Nepodařilo se stáhnout skladbu.<br/><br/<hr/>%1"
+
+#~ msgid "<b>Error</b><br/>"
+#~ msgstr "<b>Chyba</b><br/>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
+#~ "td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Umělec:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Skladba:</td><td>"
+#~ "%3</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Destination file:</td><td>%2</td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Zdrojový soubor:</td><td>%1</td></tr><tr><td "
+#~ "align=\"right\">Cílový soubor:</td><td>%2</td></tr>"
+
+#~ msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
+#~ msgstr "<tr><td align=\"right\">Soubor:</td><td>%1</td></tr>"
+
+#~ msgid ""
+#~ "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
+#~ "i></tr>"
+#~ msgstr ""
+#~ "<tr><i><td align=\"right\"><i>Zbývající čas:</i></td><td><i>%5</i></td></"
+#~ "i></tr>"
+
+#~ msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
+#~ msgstr "<tr><td>%album%</td><td>%1</td><td>Název alba.</td></tr>"
+
+#~ msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
+#~ msgstr "<tr><td>%composer%</td><td>%1</td><td>Skladatel.</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
+#~ msgstr "<tr><td>%artist%</td><td>%1</td><td>Umělec každé skladby.</td></tr>"
+
+#~ msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
+#~ msgstr "<tr><td>%track%</td><td>%1</td><td>Číslo skladby.</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></"
+#~ "tr>"
+#~ msgstr "<tr><td>%year%</td><td>%1</td><td>Rok vydání alba.</td></tr>"
+
+#~ msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
+#~ msgstr "<tr><td>%genre%</td><td>%1</td><td>Žánr alba.</td></tr>"
+
+#~ msgctxt ""
+#~ "Google\n"
+#~ "width x height (file size)"
+#~ msgid ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+#~ msgstr ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+
+#~ msgctxt ""
+#~ "Discogs\n"
+#~ "width x height"
+#~ msgid ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+#~ msgstr ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+
+#~ msgid "Grouped by 'Album Artist'"
+#~ msgstr "Seskupeno podle Umělec alba"
+
+#~ msgid "Search Play Queue"
+#~ msgstr "Prohledat řadu skladeb k přehrání"
+
+#~ msgid "Do not fadeout"
+#~ msgstr "Nezeslabovat"
+
+#~ msgid "Use media keys to control Cantata:"
+#~ msgstr "Používat multimediální klávesy pro ovládání Cantaty:"
+
+#~ msgid ""
+#~ "Use media keys, as configured in desktop settings, to control Cantata:"
+#~ msgstr ""
+#~ "Používat multimediální klávesy, jak jsou nastaveny v nastavení pracovního "
+#~ "prostředí, pro ovládání Cantaty:"
+
+#~ msgid ""
+#~ "Use media keys, as configured in GNOME/Unity settings, to control Cantata:"
+#~ msgstr ""
+#~ "Používat multimediální klávesy, jak jsou nastaveny v nastavení GNOME/"
+#~ "Unity, pro ovládání Cantaty:"
+
+#~ msgid "Inactive"
+#~ msgstr "Nečinné"
+
+#~ msgctxt "Track Number (#)"
+#~ msgid "#"
+#~ msgstr "#"
+
+#~ msgid "Search For Podcasts"
+#~ msgstr "Hledat zvukové záznamy"
+
+#~ msgid "Subscribe to Podcast"
+#~ msgstr "Přihlásit se k odběru záznamu"
+
+#~ msgid "You are already subscribed to this URL!"
+#~ msgstr "Již jste přihlášen k odběru z této adresy (URL)!"
+
+#~ msgid "Already downloading this URL!"
+#~ msgstr "Již se stahuje z této adresy (URL)!"
+
+#~ msgid "Use backdrop:"
+#~ msgstr "Použít pozadí:"
+
+#~ msgid "Automatically lookup:"
+#~ msgstr "Automaticky vyhledat:"
+
+#~ msgid "<html><head/><body><p>Cancel current query</p></body></html>"
+#~ msgstr ""
+#~ "<html><head/><body><p>Zrušit současnou řadu skladeb určených k přehrání</"
+#~ "p></body></html>"
+
+#~ msgid "<html><head/><body><p>Add a local file</p></body></html>"
+#~ msgstr "<html><head/><body><p>Přidat místní soubor</p></body></html>"
+
+#~ msgid "Use current album cover as background:"
+#~ msgstr "Použít nynější obal alba jako pozadí:"
+
+#~ msgid "Multiple artist albums:"
+#~ msgstr "Alba s více umělci:"
+
+#~ msgid "Crossfading:"
+#~ msgstr "Prolínání:"
+
+#~ msgid " seconds"
+#~ msgstr " sekund"
+
+#~ msgid "Devices:"
+#~ msgstr "Zařízení:"
+
+#~ msgid "Current URL:"
+#~ msgstr "Nynější adresa (URL):"
+
+#~ msgid ""
+#~ "The following is a list of online providers, to hide a provider simply un-"
+#~ "check its entry in this list."
+#~ msgstr ""
+#~ "Následující je seznam internetových poskytovatelů. Pro skrytí "
+#~ "poskytovatele jednoduše zrušte jeho zaškrtnutí v tomto seznamu."
+
+#~ msgid ""
+#~ "The following is a list of the top-level stream categories, to hide a "
+#~ "category simply un-check its entry in this list."
+#~ msgstr ""
+#~ "Následující je seznam skupin proudů na nejvyšší úrovni. Pro skrytí "
+#~ "skupiny jednoduše zrušte její zaškrtnutí v tomto seznamu."
+
+#~ msgid "Icons Only"
+#~ msgstr "Pouze ikony"
+
+#~ msgid "Style"
+#~ msgstr "Styl"
+
+#~ msgid "Small Sidebar"
+#~ msgstr "Malý postranní panel"
+
+#~ msgid "Tabs On Side"
+#~ msgstr "Karty po straně"
+
+#~ msgid "Tabs On Top"
+#~ msgstr "Karty nahoře"
+
+#~ msgid "Tabs On Bottom"
+#~ msgstr "Karty dole"
+
+#~ msgid "ON"
+#~ msgstr "Zapnuto"
+
+#~ msgid "OFF"
+#~ msgstr "Vypnuto"
+
+#~ msgid "Volume Disabled"
+#~ msgstr "Hlasitost vypnuta"
+
 #~ msgid ""
 #~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
 #~ msgstr ""
@@ -6229,9 +6777,6 @@ msgstr "Díly: %1"
 #~ msgid "Biography"
 #~ msgstr "Životopis"
 
-#~ msgid "Source: %1"
-#~ msgstr "Zdroj: %1"
-
 #~ msgid "Stop Immediately"
 #~ msgstr "Zastavit okamžitě"
 
@@ -6290,9 +6835,6 @@ msgstr "Díly: %1"
 #~ "Nastavení pojmenované %1 již existuje!\n"
 #~ "Přepsat?"
 
-#~ msgid "Set Cover"
-#~ msgstr "Nastavit obal"
-
 #~ msgctxt ""
 #~ "<title> by <artist>\n"
 #~ "Failed\n"
@@ -6315,9 +6857,6 @@ msgstr "Díly: %1"
 #~ msgid "Failed to reconnect to %1"
 #~ msgstr "Nepodařilo se znovu připojit k %1"
 
-#~ msgid "Loaded"
-#~ msgstr "Nahráno"
-
 #~ msgid "Add Online Service"
 #~ msgstr "Přidat internetovou službu"
 
@@ -6447,9 +6986,6 @@ msgstr "Díly: %1"
 #~ msgid "Category:"
 #~ msgstr "Skupina:"
 
-#~ msgid "Radio Stations"
-#~ msgstr "Radiostanice"
-
 #~ msgid "From %1"
 #~ msgstr "Z %1"
 
@@ -6587,9 +7123,6 @@ msgstr "Díly: %1"
 #~ msgid "Uptime:"
 #~ msgstr "Doba využití:"
 
-#~ msgid "Time playing:"
-#~ msgstr "Čas přehrávání:"
-
 #~ msgid "Database"
 #~ msgstr "Databáze"
 
@@ -6791,12 +7324,6 @@ msgstr "Díly: %1"
 #~ msgid "Other Protocol"
 #~ msgstr "Jiný protokol"
 
-#~ msgid "1 Artist, "
-#~ msgid_plural "%1 Artists, "
-#~ msgstr[0] "Jeden umělec, "
-#~ msgstr[1] "%1 umělci, "
-#~ msgstr[2] "%1 umělců, "
-
 #~ msgid "1 Album, "
 #~ msgid_plural "%1 Albums, "
 #~ msgstr[0] "Jedno album, "
@@ -6820,9 +7347,6 @@ msgstr "Díly: %1"
 #~ msgid "Device is currently busy."
 #~ msgstr "Zařízení je nyní zaneprázdněno"
 
-#~ msgid "No lyrics found"
-#~ msgstr "Nenalezen žádný text písně"
-
 #~ msgid "Library View"
 #~ msgstr "Pohled s knihovnou"
 
@@ -6844,9 +7368,6 @@ msgstr "Díly: %1"
 #~ msgid "Delete Songs From Device"
 #~ msgstr "Smazat písně ze zařízení"
 
-#~ msgid "Clear Playlist"
-#~ msgstr "Vyprázdnit seznam skladeb"
-
 #~ msgid ""
 #~ "The MPD connection died unexpectedly.<br/>TThis error is unrecoverable, "
 #~ "please restart %1."
diff --git a/po/de.po b/po/de.po
index 693fe52..acad9c9 100644
--- a/po/de.po
+++ b/po/de.po
@@ -2,14 +2,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # Omar Campagne <ocampagne at gmail.com>, 2012.
 # Lutz Lüttke <lumpilou at gmail.com>, 2013.
-# Markus Slopianka <kamikazow at web.de>, 2013.
+# Markus Slopianka <kamikazow at web.de>, 2013, 2014.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-07-20 19:42+0100\n"
-"PO-Revision-Date: 2013-11-27 23:32+0100\n"
-"Last-Translator: Lutz Lüttke <lutz at blutgemetzel.de>\n"
+"POT-Creation-Date: 2014-02-02 20:02+0000\n"
+"PO-Revision-Date: 2014-04-08 03:24+0200\n"
+"Last-Translator: Markus Slopianka <kamikazow at web.de>\n"
 "Language-Team: German <kde-i18n-de at kde.org>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
@@ -23,37 +23,36 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "Aktualisiere Albuminformationen"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:300
-#: gui/cachesettings.cpp:244
+#: context/albumview.cpp:71 gui/cachesettings.cpp:269
 msgid "Album Information"
 msgstr "Albuminformation"
 
-#. i18n: file: devices/albumdetails.ui:130
+#. i18n: file: devices/albumdetails.ui:136
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:166 po/rc.cpp:73 rc.cpp:73
+#: context/albumview.cpp:175 po/rc.cpp:107 rc.cpp:107
 msgid "Tracks"
 msgstr "Stücke"
 
-#: context/artistview.cpp:88
+#: context/artistview.cpp:85
 msgid "Refresh Artist Information"
 msgstr "Aktualisiere Künstlerinformationen"
 
-#: context/artistview.cpp:95 context/contextwidget.cpp:299
-#: gui/cachesettings.cpp:242
+#: context/artistview.cpp:92 gui/cachesettings.cpp:267
 msgid "Artist Information"
 msgstr "Künstlerinformationen"
 
-#. i18n: file: gui/interfacesettings.ui:137
+#. i18n: file: gui/interfacesettings.ui:272
 #. i18n: ectx: attribute (title), widget (QWidget, tab_2)
-#: context/artistview.cpp:311 gui/mainwindow.cpp:303 po/rc.cpp:474 rc.cpp:474
+#: context/artistview.cpp:314 gui/interfacesettings.cpp:106
+#: gui/mainwindow.cpp:308 po/rc.cpp:588 rc.cpp:588
 msgid "Albums"
 msgstr "Alben"
 
-#: context/artistview.cpp:334
+#: context/artistview.cpp:337
 msgid "Web Links"
 msgstr "Weblinks"
 
-#: context/artistview.cpp:422
+#: context/artistview.cpp:424
 msgid "Similar Artists"
 msgstr "Ähnliche Künstler"
 
@@ -61,25 +60,32 @@ msgstr "Ähnliche Künstler"
 msgid "Lyrics Providers"
 msgstr "Textanbieter"
 
-#: context/contextsettings.cpp:37
+#: context/contextsettings.cpp:37 gui/cachesettings.cpp:278
 msgid "Wikipedia Languages"
-msgstr "Wikipedia Sprachen"
+msgstr "Wikipedia"
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1191
-#: models/streamsmodel.cpp:1234 models/streamsmodel.cpp:1438
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1388
+#: models/streamsmodel.cpp:1434 models/streamsmodel.cpp:1642
 msgid "Other"
 msgstr "Andere"
 
-#: context/contextwidget.cpp:98
+#: context/contextwidget.cpp:293
 msgid "Reset Spacing"
 msgstr "Abstand zurücksetzen"
 
-#: context/contextwidget.cpp:301 context/songview.cpp:90
-#: gui/cachesettings.cpp:241
-msgid "Lyrics"
-msgstr "Texte"
+#: context/contextwidget.cpp:506
+msgid "&Artist"
+msgstr "&Künstler"
+
+#: context/contextwidget.cpp:507
+msgid "Al&bum"
+msgstr "Al&bum"
 
-#: context/lastfmengine.cpp:65
+#: context/contextwidget.cpp:508
+msgid "&Lyrics"
+msgstr "&Texte"
+
+#: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
 msgstr "Mehr auf last.fm"
 
@@ -101,37 +107,38 @@ msgstr ""
 "Wenn die Suche keinen neuen Liedtext findet, wird dieser mit dem "
 "Originalkünstler und Titel assoziiert und in Cantata angezeigt."
 
-#. i18n: file: devices/albumdetails.ui:47
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/tageditor.ui:35
+#. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#. i18n: file: devices/albumdetails.ui:47
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/tageditor.ui:35
+#. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#: context/lyricsdialog.cpp:64 po/rc.cpp:58 po/rc.cpp:295 po/rc.cpp:745
-#: rc.cpp:58 rc.cpp:295 rc.cpp:745
+#: context/lyricsdialog.cpp:64 gui/searchpage.cpp:204 po/rc.cpp:92
+#: po/rc.cpp:377 po/rc.cpp:941 rc.cpp:92 rc.cpp:377 rc.cpp:941
 msgid "Title:"
 msgstr "Titel:"
 
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: tags/tageditor.ui:48
+#. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: tags/tageditor.ui:48
+#. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#: context/lyricsdialog.cpp:66 po/rc.cpp:55 po/rc.cpp:286 po/rc.cpp:748
-#: rc.cpp:55 rc.cpp:286 rc.cpp:748
+#: context/lyricsdialog.cpp:66 devices/actiondialog.cpp:800
+#: gui/searchpage.cpp:197 po/rc.cpp:86 po/rc.cpp:362 po/rc.cpp:944 rc.cpp:86
+#: rc.cpp:362 rc.cpp:944
 msgid "Artist:"
 msgstr "Künstler:"
 
@@ -139,113 +146,142 @@ msgstr "Künstler:"
 msgid "Search For Lyrics"
 msgstr "Suche nach Texten"
 
-#: context/lyricsettings.cpp:34
+#: context/lyricsettings.cpp:35
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "Bitte die Webseiten zur Liedtextsuche wählen."
 
-#: context/lyricsettings.cpp:46
-msgid "(Polish Translations)"
-msgstr "(Polnische Übersetzung)"
+#: context/othersettings.cpp:45 gui/coverdialog.cpp:877
+#: gui/interfacesettings.cpp:174
+msgid "Images (*.png *.jpg)"
+msgstr "Bilder (*.png *.jpg)"
 
-#: context/lyricsettings.cpp:47
-msgid "(Portuguese Translations)"
-msgstr "(Portugiesische Übersetzung)"
+#: context/othersettings.cpp:47 gui/interfacesettings.cpp:176
+msgctxt "pixels"
+msgid "10px"
+msgstr "10px"
+
+#: context/othersettings.cpp:102 gui/interfacesettings.cpp:524
+msgctxt "value%"
+msgid "%1%"
+msgstr "%1%"
 
-#: context/songview.cpp:74
+#: context/othersettings.cpp:107 gui/interfacesettings.cpp:529
+#, c-format
+msgctxt "pixels"
+msgid "%1px"
+msgstr "%1px"
+
+#: context/songview.cpp:90
 msgid "Refresh Lyrics"
 msgstr "Aktualisiere Texte"
 
-#: context/songview.cpp:75
+#: context/songview.cpp:91
 msgid "Edit Lyrics"
 msgstr "Bearbeite Texte"
 
-#: context/songview.cpp:76
+#: context/songview.cpp:92
 msgid "Save Lyrics"
 msgstr "Speichere Texte"
 
-#: context/songview.cpp:77
+#: context/songview.cpp:93
 msgid "Cancel Editing Lyrics"
 msgstr "Bearbeitung der Texte abbrechen"
 
-#: context/songview.cpp:78
+#: context/songview.cpp:94
 msgid "Delete Lyrics File"
 msgstr "Lösche Liedtextdatei?"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:106 gui/cachesettings.cpp:266
+msgid "Lyrics"
+msgstr "Texte"
+
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort editing of lyrics?"
 msgstr "Bearbeitung der Texte abbrechen?"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort Editing"
 msgstr "Bearbeitung abbrechen"
 
-#: context/songview.cpp:104 context/songview.cpp:123 context/songview.cpp:182
-#: replaygain/rgdialog.cpp:248 replaygain/rgdialog.cpp:249
-#: replaygain/rgdialog.cpp:257 replaygain/rgdialog.cpp:258
-#: tags/trackorganiser.cpp:143
+#: context/songview.cpp:120 context/songview.cpp:139 context/songview.cpp:198
+#: replaygain/rgdialog.cpp:247 replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:256 replaygain/rgdialog.cpp:257
+#: tags/trackorganiser.cpp:164
 msgid "Abort"
 msgstr "Abbrechen"
 
-#: context/songview.cpp:106
+#: context/songview.cpp:122
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr ""
 "Löschen der gespeicherten Kopie einer Liedtextdatei, und erneut "
 "herunterladen?"
 
-#: context/songview.cpp:106 context/songview.cpp:107
-#: online/onlineservicespage.cpp:396 online/onlineservicespage.cpp:397
+#: context/songview.cpp:122 context/songview.cpp:123
+#: online/onlineservicespage.cpp:458 online/onlineservicespage.cpp:459
 msgid "Re-download"
 msgstr "Noch einmal herunterladen"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:148
 msgid "Current playing song has changed, still perform search?"
 msgstr "Aktuell gespielter Titel hat sich geändert. Suche fortsetzen?"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:148
 msgid "Song Changed"
 msgstr "Stück geändert"
 
-#: context/songview.cpp:133
+#: context/songview.cpp:149
 msgid "Perform Search"
 msgstr "Führe Suche aus"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:173
 msgid "Save updated lyrics?"
 msgstr "Speichern der aktualisieren Texte?"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:173
 msgid "Save"
 msgstr "Speichern"
 
-#: context/songview.cpp:170
+#: context/songview.cpp:186
 msgid "Failed to save lyrics."
 msgstr "Fehler beim Speichern des Textes."
 
-#: context/songview.cpp:192
+#: context/songview.cpp:208
 msgid "Delete lyrics file?"
 msgstr "Löschen der Liedtextdatei?"
 
-#: context/songview.cpp:192 widgets/messageoverlay.cpp:43
-msgid "Cancel"
-msgstr "Abbruch"
+#: context/songview.cpp:208
+msgid "Delete File"
+msgstr "Lösche Datei"
 
-#: context/songview.cpp:416
+#: context/songview.cpp:462
 msgid "Fetching lyrics via %1"
 msgstr "Empfange Texte über %1"
 
-#: context/wikipediaengine.cpp:250
+#: context/ultimatelyricsprovider.cpp:200
+msgid "(Polish Translations)"
+msgstr "(Polnische Übersetzung)"
+
+#: context/ultimatelyricsprovider.cpp:201
+msgid "(Portuguese Translations)"
+msgstr "(Portugiesische Übersetzung)"
+
+#: context/view.cpp:91 gui/mainwindow.cpp:328 widgets/messageoverlay.cpp:44
+msgid "Cancel"
+msgstr "Abbruch"
+
+#: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "Stückliste"
 
-#: context/wikipediaengine.cpp:303
+#: context/wikipediaengine.cpp:301
 msgid "Read more on wikipedia"
 msgstr "Lese mehr auf Wikipedia"
 
-#: context/wikipediaengine.cpp:304
+#: context/wikipediaengine.cpp:302
 msgid "Open in browser"
 msgstr "Öffne im Browser"
 
-#: context/wikipediaengine.cpp:442
+#: context/wikipediaengine.cpp:441
 msgctxt "Search pattern for an artist or band, separated by |"
 msgid "artist|band|singer|vocalist|musician"
 msgstr "Künstler| Band|Sänger|Vokalist|Musiker"
@@ -255,49 +291,64 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "Album|Bewertung|Soundtrack"
 
-#: context/wikipediasettings.cpp:89
+#: context/wikipediasettings.cpp:114
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
 msgstr ""
-"Bitte die Sprache von Wikipedia wählen welche für Künstlerinformationen und "
-"Albuminformationen benutzt werden soll"
+"Bitte wählen Sie die Sprache von Wikipedia, welche für Künstlerinformationen "
+"und Albuminformationen benutzt werden soll."
 
-#: context/wikipediasettings.cpp:90 models/streamsmodel.cpp:477
+#: context/wikipediasettings.cpp:115 models/streamsmodel.cpp:598
+#: online/podcastsearchdialog.cpp:404
 msgid "Reload"
 msgstr "Erneut Laden"
 
-#: devices/actiondialog.cpp:73
+#: dbus/powermanagement.cpp:96
+msgid "Cantata is playing a track"
+msgstr "Cantata spielt ein Stück ab"
+
+#: devices/actiondialog.cpp:83
 msgid "Songs To Be Copied"
 msgstr "Stücke zum kopieren"
 
-#: devices/actiondialog.cpp:139
+#: devices/actiondialog.cpp:153
 msgid "<b>INVALID</b>"
 msgstr "<b>UNGÜLTIG</b>"
 
-#: devices/actiondialog.cpp:153 devices/actiondialog.cpp:156
+#: devices/actiondialog.cpp:167 devices/actiondialog.cpp:170
 msgid "<i>(When different)</i>"
 msgstr "<i>(Wenn unterschiedlich)</i>"
 
-#: devices/actiondialog.cpp:188 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:185 tags/tageditor.cpp:713
+#: tags/trackorganiser.cpp:444
+msgid ""
+"Cantata has detected that you are connected to a Mopidy server.\n"
+"\n"
+"Currently it is not possible for Cantata to force Mopidy to refresh its "
+"local music listing. Therefore, you will need to stop Cantata, manually "
+"refresh Mopidy's database, and restart Cantata for any changes to be active."
+msgstr ""
+
+#: devices/actiondialog.cpp:211 devices/synccollectionwidget.cpp:274
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "Künstler:%1, Alben:%2, Stücke:%3"
 
-#: devices/actiondialog.cpp:240 devices/mtpdevice.cpp:1476
-#: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
+#: devices/actiondialog.cpp:271 devices/mtpdevice.cpp:1622
+#: devices/remotefsdevice.cpp:571 devices/umsdevice.cpp:103
 msgid "%1 free"
 msgstr "%1 frei"
 
-#: devices/actiondialog.cpp:253 devices/actiondialog.cpp:257
+#: devices/actiondialog.cpp:284 devices/actiondialog.cpp:288
 msgid "Local Music Library"
 msgstr "Lokale Musikbibliothek"
 
-#: devices/actiondialog.cpp:255 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:95 widgets/groupedview.cpp:255
+#: devices/actiondialog.cpp:286 devices/albumdetailsdialog.cpp:104
+#: gui/preferencesdialog.cpp:115 widgets/groupedview.cpp:251
 msgid "Audio CD"
 msgstr "Audio CD"
 
-#: devices/actiondialog.cpp:278
+#: devices/actiondialog.cpp:309
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -309,7 +360,7 @@ msgstr ""
 "Die Stücke müssen in ein kleineres Dateiformat umgewandelt werden um "
 "erfolgreich kopiert zu werden."
 
-#: devices/actiondialog.cpp:285
+#: devices/actiondialog.cpp:316
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -317,17 +368,17 @@ msgstr ""
 "Es ist nicht ausreichend Speicherplatz auf dem Ziel vorhanden.\n"
 "Die gewählten Stücke benötigen %1, aber es sind nur noch %2 verfügbar."
 
-#: devices/actiondialog.cpp:334
+#: devices/actiondialog.cpp:365
 msgid "Copy Songs"
 msgstr "Kopiere Stücke"
 
-#: devices/actiondialog.cpp:334 devices/devicespage.cpp:490
-#: gui/albumspage.cpp:188 gui/folderpage.cpp:256 gui/librarypage.cpp:212
-#: gui/stdactions.cpp:76
+#: devices/actiondialog.cpp:365 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:214 gui/folderpage.cpp:270 gui/librarypage.cpp:257
+#: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "Lösche Stücke"
 
-#: devices/actiondialog.cpp:364
+#: devices/actiondialog.cpp:402
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
@@ -335,15 +386,15 @@ msgstr ""
 "<p>Sie haben das Zielgerät nicht konfiguriert.<br/>Mit den "
 "Standardeinstellungen fortfahren?</p>"
 
-#: devices/actiondialog.cpp:365 devices/actiondialog.cpp:369
+#: devices/actiondialog.cpp:403 devices/actiondialog.cpp:407
 msgid "Not Configured"
 msgstr "Nicht konfiguriert"
 
-#: devices/actiondialog.cpp:366 devices/actiondialog.cpp:370
+#: devices/actiondialog.cpp:404 devices/actiondialog.cpp:408
 msgid "Use Defaults"
 msgstr "Benutze Voreinstellung"
 
-#: devices/actiondialog.cpp:368
+#: devices/actiondialog.cpp:406
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
@@ -351,226 +402,231 @@ msgstr ""
 "<p>Sie haben das Quellgerät nicht konfiguriert.<br/>Mit den "
 "Standardeinstellungen fortfahren?</p>"
 
-#: devices/actiondialog.cpp:430
+#: devices/actiondialog.cpp:468
 msgid "Are you sure you wish to stop?"
 msgstr "Wollen Sie wirklich stoppen?"
 
-#: devices/actiondialog.cpp:430 gui/mainwindow.cpp:268
+#: devices/actiondialog.cpp:468 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "Stopp"
 
-#: devices/actiondialog.cpp:473 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:486 tags/tageditor.cpp:808
-#: tags/trackorganiser.cpp:421
+#: devices/actiondialog.cpp:513 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:468 tags/tageditor.cpp:880
+#: tags/trackorganiser.cpp:478
 msgid "Device has been removed!"
 msgstr "Gerät wurde entfernt."
 
-#: devices/actiondialog.cpp:475
+#: devices/actiondialog.cpp:515
 msgid "Device is not connected!"
 msgstr "Gerät ist nicht verbunden."
 
-#: devices/actiondialog.cpp:477 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:496 tags/tageditor.cpp:818
-#: tags/trackorganiser.cpp:431
+#: devices/actiondialog.cpp:517 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:478 tags/tageditor.cpp:890
+#: tags/trackorganiser.cpp:488
 msgid "Device is busy?"
 msgstr "Gerät aktuell beschäftig?"
 
-#: devices/actiondialog.cpp:479 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:519 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "Gerät wurde geändert?"
 
-#: devices/actiondialog.cpp:546
+#: devices/actiondialog.cpp:586
 msgid "Clearing unused folders"
 msgstr "Bereinige unbenutzte Ordner"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:601
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "Errechne ReplayGain der Stücke?"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:601
 msgid "ReplyGain"
 msgstr "ReplayGain"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:602
 msgid "Calculate"
 msgstr "Berechne"
 
-#: devices/actiondialog.cpp:618
-msgid "The destination filename already exists!<hr/>%1"
-msgstr "Der Dateiname existiert bereits.<hr/>%1"
+#: devices/actiondialog.cpp:661
+msgid "The destination filename already exists!"
+msgstr "Der Dateiname existiert bereits."
 
-#: devices/actiondialog.cpp:621
-msgid "Song already exists!<hr/>%1"
-msgstr "Lied existiert bereits.<hr/>%1"
+#: devices/actiondialog.cpp:664
+msgid "Song already exists!"
+msgstr "Lied existiert bereits."
 
-#: devices/actiondialog.cpp:624
-msgid "Song does not exist!<hr/>%1"
-msgstr "Titel existiert nicht.<hr/>%1"
+#: devices/actiondialog.cpp:667
+msgid "Song does not exist!"
+msgstr "Titel existiert nicht."
 
-#: devices/actiondialog.cpp:627
+#: devices/actiondialog.cpp:670
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
-"permissions.<hr/>%1"
+"permissions."
 msgstr ""
 "Fehler beim Erstellen des Ordners auf Zielgerät.<br/>Bitte überprüfen Sie "
-"auf vorhandene Berechtigung.<hr/>%1"
+"auf vorhandene Berechtigung."
 
-#: devices/actiondialog.cpp:630
-msgid "Source file no longer exists?<br/><br/<hr/>%1"
-msgstr "Quelldatei nicht mehr verfügbar?<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:673
+msgid "Source file no longer exists?"
+msgstr "Quelldatei nicht mehr verfügbar?"
 
-#: devices/actiondialog.cpp:633
-msgid "Failed to copy.<hr/>%1"
-msgstr "Fehler beim Kopieren.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to copy."
+msgstr "Fehler beim Kopieren."
 
-#: devices/actiondialog.cpp:634
-msgid "Failed to delete.<hr/>%1"
-msgstr "Fehler beim Erstellen.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to delete."
+msgstr "Fehler beim Löschen."
 
-#: devices/actiondialog.cpp:637
-msgid "Not connected to device.<hr/>%1"
-msgstr "Nicht zum Gerät verbunden.<hr/>%1"
+#: devices/actiondialog.cpp:679
+msgid "Not connected to device."
+msgstr "Nicht zum Gerät verbunden."
 
-#: devices/actiondialog.cpp:640
-msgid "Selected codec is not available.<hr/>%1"
-msgstr "Ausgewählter Codec ist nicht vorhanden.<hr/>%1"
+#: devices/actiondialog.cpp:682
+msgid "Selected codec is not available."
+msgstr "Ausgewählter Codec ist nicht vorhanden."
 
-#: devices/actiondialog.cpp:643
-msgid "Transcoding failed.<br/><br/<hr/>%1"
-msgstr "Fehler beim Umwandeln.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:685
+msgid "Transcoding failed."
+msgstr "Umwandeln fehlgeschlagen."
 
-#: devices/actiondialog.cpp:646
+#: devices/actiondialog.cpp:688
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
-"devices.)<hr/>%1"
+"devices.)"
 msgstr ""
-"Fehler beim Erstellen einer temporären Datei.<br/>(Benötigt zum Umwandeln für "
-"MTP-Geräte.)<hr/>%1"
-
-#: devices/actiondialog.cpp:649
-msgid "Failed to read source file.<br/><br/<hr/>%1"
-msgstr "Fehler beim Lesen der Quelldatei.<br/><br/<hr/>%1"
+"Fehler beim Erstellen einer temporären Datei.<br/>(Benötigt zum Umwandeln "
+"für MTP-Geräte.)"
 
-#: devices/actiondialog.cpp:652
-msgid "Failed to write to destination file.<br/><br/<hr/>%1"
-msgstr "Fehler beim Erstellen der Zieldatei<br/>%1"
+#: devices/actiondialog.cpp:691
+msgid "Failed to read source file."
+msgstr "Fehler beim Lesen der Quelldatei."
 
-#: devices/actiondialog.cpp:655
-msgid "No space left on device.<br/><br/<hr/>%1"
-msgstr "Kein Platz auf Gerät mehr verfügbar<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:694
+msgid "Failed to write to destination file."
+msgstr "Fehler beim Erstellen der Zieldatei."
 
-#: devices/actiondialog.cpp:658
-msgid "Failed to update metadata.<br/><br/<hr/>%1"
-msgstr "Fehler beim Aktualisieren der Metadaten.<hr/>%1"
+#: devices/actiondialog.cpp:697
+msgid "No space left on device."
+msgstr "Kein Platz auf Gerät mehr verfügbar."
 
-#: devices/actiondialog.cpp:661
-msgid ""
-"Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
-msgstr "Fehler beim Download – zu viele Umleitungen.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:700
+msgid "Failed to update metadata."
+msgstr "Fehler beim Aktualisieren der Metadaten."
 
-#: devices/actiondialog.cpp:664
-msgid "Failed to download track.<br/><br/<hr/>%1"
-msgstr "Fehler beim Herunterladen des Stückes.<hr/>%1"
+#: devices/actiondialog.cpp:703
+msgid "Failed to download track."
+msgstr "Fehler beim Herunterladen"
 
-#: devices/actiondialog.cpp:667
-msgid "Failed to lock device.<hr/>%1"
-msgstr "Fehler beim Verriegeln des Gerätes.<hr/>%1"
+#: devices/actiondialog.cpp:706
+msgid "Failed to lock device."
+msgstr "Fehler beim Verriegeln des Gerätes."
 
-#: devices/actiondialog.cpp:696
+#: devices/actiondialog.cpp:735
 msgid "Local Music Library Properties"
 msgstr "Lokale Bibliothekseinstellungen"
 
-#: devices/actiondialog.cpp:737 devices/actiondialog.cpp:751
-msgid "<b>Error</b><br/>"
-msgstr "<b>Fehler</b><br/>"
+#: devices/actiondialog.cpp:776 devices/actiondialog.cpp:790
+#: support/messagebox.cpp:108 support/messagebox.cpp:114
+#: support/messagebox.h:62
+msgid "Error"
+msgstr "Fehler"
 
-#: devices/actiondialog.cpp:741 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:780 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Skip"
 msgstr "Überspringen"
 
-#: devices/actiondialog.cpp:742 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:781 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Auto Skip"
 msgstr "Automatisches Überspringen"
 
-#: devices/actiondialog.cpp:746
+#: devices/actiondialog.cpp:785
 msgid "Retry"
 msgstr "wiederholen"
 
-#: devices/actiondialog.cpp:761
-msgid ""
-"<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
-"td></tr>"
-msgstr ""
-"<tr><td align=\"right\">Künstler:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Stück:</td><td>%3</"
-"td></tr>"
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#: devices/actiondialog.cpp:801 gui/searchpage.cpp:203 po/rc.cpp:374
+#: po/rc.cpp:953 rc.cpp:374 rc.cpp:953
+msgid "Album:"
+msgstr "Album:"
 
-#: devices/actiondialog.cpp:768
-msgid ""
-"<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
-"\"right\">Destination file:</td><td>%2</td></tr>"
-msgstr ""
-"<tr><td align=\"right\">Quelldatei:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Zieldatei:</td><td>%2</td></tr>"
+#. i18n: file: tags/tageditor.ui:25
+#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
+#: devices/actiondialog.cpp:802 po/rc.cpp:938 rc.cpp:938
+msgid "Track:"
+msgstr "Stück:"
 
-#: devices/actiondialog.cpp:773
-msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
-msgstr "<tr><td align=\"right\">Datei:</td><td>%1</td></tr>"
+#: devices/actiondialog.cpp:806
+msgid "Source file:"
+msgstr "Quelldatei:"
 
-#: devices/actiondialog.cpp:779 gui/cachesettings.cpp:169
+#: devices/actiondialog.cpp:807
+msgid "Destination file:"
+msgstr "Zieldatei:"
+
+#: devices/actiondialog.cpp:809 gui/searchpage.cpp:207
+msgid "File:"
+msgstr "Datei:"
+
+#: devices/actiondialog.cpp:815 gui/cachesettings.cpp:179
+#: gui/cachesettings.cpp:235
 msgid "Calculating..."
 msgstr "Berechne..."
 
-#: devices/actiondialog.cpp:786
+#: devices/actiondialog.cpp:822
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (Erwartet)"
 
-#: devices/actiondialog.cpp:789
-msgid ""
-"<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
-"i></tr>"
-msgstr ""
-"<tr><i><td align=\"right\"><i>Verbleibende Zeit:</i></td><td><i>%5</i></td></"
-"i></tr>"
+#: devices/actiondialog.cpp:824
+msgid "Time remaining:"
+msgstr "Verbleibende Zeit:"
 
-#: devices/actiondialog.cpp:812 devices/fsdevice.cpp:765
-#: online/onlineservice.cpp:139 online/onlineservice.cpp:165
+#: devices/actiondialog.cpp:847 devices/fsdevice.cpp:762
+#: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "Speichere Cache"
 
-#: devices/albumdetailsdialog.cpp:129 devices/albumdetailsdialog.cpp:227
-#: tags/tageditor.cpp:142 tags/tageditor.cpp:330
+#: devices/albumdetailsdialog.cpp:139 devices/albumdetailsdialog.cpp:236
+#: tags/tageditor.cpp:158 tags/tageditor.cpp:373
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "Hinzufügen der „Verschiedene Künstler Problembehebung"
 
-#: devices/albumdetailsdialog.cpp:130 devices/albumdetailsdialog.cpp:251
-#: tags/tageditor.cpp:143 tags/tageditor.cpp:375
+#: devices/albumdetailsdialog.cpp:140 devices/albumdetailsdialog.cpp:260
+#: tags/tageditor.cpp:159 tags/tageditor.cpp:418
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "Zurücksetzen der „Verschiedene Künstler“ Problembehebung"
 
-#: devices/albumdetailsdialog.cpp:131 devices/albumdetailsdialog.cpp:269
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:456
+#: devices/albumdetailsdialog.cpp:141 devices/albumdetailsdialog.cpp:278
+#: tags/tageditor.cpp:161 tags/tageditor.cpp:499
 msgid "Capitalize"
 msgstr "Großschrift"
 
-#: devices/albumdetailsdialog.cpp:132 devices/albumdetailsdialog.cpp:286
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:485
+#: devices/albumdetailsdialog.cpp:142 devices/albumdetailsdialog.cpp:295
+#: tags/tageditor.cpp:162 tags/tageditor.cpp:528
 msgid "Adjust Track Numbers"
 msgstr "Anpassen der Stücknummern"
 
-#: devices/albumdetailsdialog.cpp:134 tags/tageditor.cpp:140
+#: devices/albumdetailsdialog.cpp:144 tags/tageditor.cpp:156
 msgid "Tools"
 msgstr "Werkzeuge"
 
-#: devices/albumdetailsdialog.cpp:223 tags/tageditor.cpp:326
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:369
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "Hinzufügen der „Verschiedene Künstler“ Problembehebung?"
 
-#: devices/albumdetailsdialog.cpp:225 tags/tageditor.cpp:328
+#: devices/albumdetailsdialog.cpp:234 tags/tageditor.cpp:371
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -578,11 +634,11 @@ msgstr ""
 "<i>Dies wird den 'Albumkünstler' und 'Künstler' zu „Verschiedene Künstler“ "
 "gesetzt, und der 'Titel' zu \"TrackArtist - TrackTitle\"</i>"
 
-#: devices/albumdetailsdialog.cpp:244 tags/tageditor.cpp:368
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:411
 msgid "Revert \"Various Artists\" workaround"
 msgstr "Zurücksetzen der „Verschiedene Künstler“ Problembehebung"
 
-#: devices/albumdetailsdialog.cpp:246 tags/tageditor.cpp:370
+#: devices/albumdetailsdialog.cpp:255 tags/tageditor.cpp:413
 msgid ""
 "<i>Where the 'Album artist' is the same as 'Artist' and the 'Title' is of "
 "the format \"TrackArtist - TrackTitle\", 'Artist' will be taken from 'Title' "
@@ -592,43 +648,32 @@ msgid ""
 msgstr ""
 "<i>Wenn der 'Albumkünstler' der gleiche ist wie 'Künstler' und der 'Titel' "
 "ist – im Format \"TrackArtist - TrackTitle\" –, wird der 'Künstler' von "
-"'Titel' "
-"und der 'Titel' selbst nur zu Titel gesetzt.<br/><br/>Wenn z. B. 'Titel'  "
-"\"Wibble - Wobble\" lautet, wird der 'Künstler' zu \"Wibble\" gesetzt und "
-"der  'Titel' zu \"Wobble\" gesetzt</i>"
+"'Titel' und der 'Titel' selbst nur zu Titel gesetzt.<br/><br/>Wenn z. B. "
+"'Titel'  \"Wibble - Wobble\" lautet, wird der 'Künstler' zu \"Wibble\" "
+"gesetzt und der  'Titel' zu \"Wobble\" gesetzt</i>"
 
-#: devices/albumdetailsdialog.cpp:252 tags/tageditor.cpp:376
+#: devices/albumdetailsdialog.cpp:261 tags/tageditor.cpp:419
 msgid "Revert"
 msgstr "Umkehren"
 
-#: devices/albumdetailsdialog.cpp:268 tags/tageditor.cpp:454
+#: devices/albumdetailsdialog.cpp:277 tags/tageditor.cpp:497
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr ""
 "Erster Buchstabe von 'Title', 'Künstler', 'Albumkünstler', and 'Album' in "
 "Großschrift"
 
-#: devices/albumdetailsdialog.cpp:286 tags/tageditor.cpp:486
+#: devices/albumdetailsdialog.cpp:295 tags/tageditor.cpp:529
 msgid "Adjust track number by:"
 msgstr "Anpassen der Stücknummern durch:"
 
-#: devices/albumdetailsdialog.cpp:327 devices/cddbinterface.cpp:140
-#: devices/deviceoptions.cpp:357 devices/musicbrainz.cpp:202
-#: devices/musicbrainz.cpp:324 gui/mainwindow.cpp:1803 gui/mainwindow.cpp:1816
-#: models/musiclibraryitemroot.cpp:357 models/musiclibraryitemroot.cpp:505
-#: models/playqueuemodel.cpp:328 mpd/mpdparseutils.cpp:230
-#: mpd/mpdparseutils.cpp:390 mpd/song.cpp:192 mpd/song.cpp:197
-#: mpd/song.cpp:236 mpd/song.cpp:262 widgets/groupedview.cpp:259
-msgid "Unknown"
-msgstr "Unbekannt"
-
-#: devices/audiocddevice.cpp:114
+#: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "Lese Disk"
 
-#: devices/audiocddevice.cpp:336 gui/mainwindow.cpp:2239
-#: models/albumsmodel.cpp:252 models/musicmodel.cpp:181
-#: models/playlistsmodel.cpp:199 models/playlistsmodel.cpp:207
+#: devices/audiocddevice.cpp:358 gui/mainwindow.cpp:2345
+#: gui/searchpage.cpp:220 models/albumsmodel.cpp:245 models/musicmodel.cpp:217
+#: models/playlistsmodel.cpp:309 models/playlistsmodel.cpp:324
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "Ein Stück (%2)"
@@ -646,24 +691,24 @@ msgstr "MusicBrainz"
 msgid "Data Track"
 msgstr "Datentrack"
 
-#: devices/cddbinterface.cpp:137 devices/musicbrainz.cpp:154
+#: devices/cddbinterface.cpp:140 devices/musicbrainz.cpp:154
 msgid "Failed to open CD device"
 msgstr "Fehler beim Öffnen des CD-Laufwerkes"
 
-#: devices/cddbinterface.cpp:162 devices/cddbinterface.cpp:188
-#: devices/musicbrainz.cpp:217
+#: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
+#: devices/musicbrainz.cpp:216
 msgid "Track %1"
 msgstr "Stück %1"
 
-#: devices/cddbinterface.cpp:286
+#: devices/cddbinterface.cpp:291
 msgid "Failed to create CDDB connection"
 msgstr "Fehler bei CDDB-Verbindung"
 
-#: devices/cddbinterface.cpp:292 devices/cddbinterface.cpp:319
+#: devices/cddbinterface.cpp:297 devices/cddbinterface.cpp:324
 msgid "No matches found in CDDB"
 msgstr "Keine Treffer in CDDB"
 
-#: devices/cddbinterface.cpp:300
+#: devices/cddbinterface.cpp:305
 msgid "CDDB error: %1"
 msgstr "CDDB-Fehler: %1"
 
@@ -672,19 +717,19 @@ msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr ""
 "Mehrfach Zutreffendes gefunden. Bitte den relevanten Eintrag unten auswählen:"
 
-#. i18n: file: devices/albumdetails.ui:157
+#. i18n: file: devices/albumdetails.ui:163
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:66
-#: models/playqueuemodel.cpp:103 po/rc.cpp:79 replaygain/rgdialog.cpp:137
-#: rc.cpp:79
+#: models/playqueuemodel.cpp:106 po/rc.cpp:113 replaygain/rgdialog.cpp:128
+#: rc.cpp:113
 msgid "Artist"
 msgstr "Künstler"
 
-#. i18n: file: devices/albumdetails.ui:162
+#. i18n: file: devices/albumdetails.ui:168
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
-#: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:74
-#: models/playqueuemodel.cpp:102 po/rc.cpp:82 replaygain/rgdialog.cpp:139
-#: rc.cpp:82
+#: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:76
+#: models/playqueuemodel.cpp:105 po/rc.cpp:116 replaygain/rgdialog.cpp:130
+#: rc.cpp:116
 msgid "Title"
 msgstr "Titel"
 
@@ -702,7 +747,7 @@ msgctxt "artist - album (year)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 – %2 (%3)"
 
-#: devices/device.cpp:340
+#: devices/device.cpp:346
 msgid "Updating (%1)..."
 msgstr "Aktualisiere (%1)..."
 
@@ -754,16 +799,15 @@ msgid ""
 "from the 'Title' tag.</p>"
 msgstr ""
 "<p>Beim Kopieren von Stücken auf ein Gerät wird, falls der 'Albumkünstler' "
-"auf„Verschiedene Künstler“ gesetzt ist, wird Cantata den 'Künstler'-Tag aller "
-"Stücke auf „Verschiedene Künstler“ setzen und  'Titel'-Tag auf 'Künstlername "
-"- Titelname'.<hr/> Beim "
-"Kopieren von einem Gerät wird Cantata prüfen, ob der 'Albumkünstler' und "
-"'Künstler' auf „Verschiedene Künstler“ gesetzt ist. Sollte dies zutreffen, "
-"wird "
-"versucht den echten Künstlernamen vom 'Titel'-Tag zu lesen und den "
-"Künstlernamen vom 'Titel' Tag zu entfernen.</p>"
-
-#: devices/devicepropertieswidget.cpp:99
+"auf„Verschiedene Künstler“ gesetzt ist, wird Cantata den 'Künstler'-Tag "
+"aller Stücke auf „Verschiedene Künstler“ setzen und  'Titel'-Tag auf "
+"'Künstlername - Titelname'.<hr/> Beim Kopieren von einem Gerät wird Cantata "
+"prüfen, ob der 'Albumkünstler' und 'Künstler' auf „Verschiedene Künstler“ "
+"gesetzt ist. Sollte dies zutreffen, wird versucht den echten Künstlernamen "
+"vom 'Titel'-Tag zu lesen und den Künstlernamen vom 'Titel' Tag zu entfernen."
+"</p>"
+
+#: devices/devicepropertieswidget.cpp:98
 msgid ""
 "<p>If you enable this, then Cantata will create a cache of the device's "
 "music library. This will help to speed up subsequent library scans (as the "
@@ -773,31 +817,29 @@ msgid ""
 "the 'refresh' icon in the device list. This will cause the cache file to be "
 "removed, and the contents of the device re-scanned.</p>"
 msgstr ""
-"<p>Wenn Sie dies aktiviert haben, wird Cantata einen Zwischenspeicher für die "
-"Musikbibliothek des Gerätes erstellen. Dies wird das Auslesen von "
+"<p>Wenn Sie dies aktiviert haben, wird Cantata einen Zwischenspeicher für "
+"die Musikbibliothek des Gerätes erstellen. Dies wird das Auslesen von "
 "nachfolgenden Aufrufen der Bibliothek beschleunigen (es wird der "
-"Zwischenspeicher "
-"verwendet anstatt jeden Tag neu einzulesen.)<hr/><b>Hinweis:</b> Wenn Sie "
-"ein anderes Programm zum aktualisieren der Musikbibliothek benutzen wird der "
-"Zwischenspeicher ungültig. "
-"Um dies zu korrigieren, einfach auf das \"Aktualisieren\"-Symbol in der "
-"Geräteliste klicken. "
-"Dadurch wird die aktuelle Zwischenspeicher-Datei entfernt und der Inhalt des "
-"Gerätes erneut eingelesen.</p>"
-
-#: devices/devicepropertieswidget.cpp:204
+"Zwischenspeicher verwendet anstatt jeden Tag neu einzulesen.)<hr/><b>Hinweis:"
+"</b> Wenn Sie ein anderes Programm zum aktualisieren der Musikbibliothek "
+"benutzen wird der Zwischenspeicher ungültig. Um dies zu korrigieren, einfach "
+"auf das \"Aktualisieren\"-Symbol in der Geräteliste klicken. Dadurch wird "
+"die aktuelle Zwischenspeicher-Datei entfernt und der Inhalt des Gerätes "
+"erneut eingelesen.</p>"
+
+#: devices/devicepropertieswidget.cpp:209
 msgid "Do not transcode"
 msgstr "Nicht umwandeln"
 
-#: devices/devicepropertieswidget.cpp:212
+#: devices/devicepropertieswidget.cpp:216
 msgid "Encoder"
 msgstr "Encoder"
 
-#: devices/devicepropertieswidget.cpp:228
+#: devices/devicepropertieswidget.cpp:231
 msgid "Transcode to %1"
 msgstr "Umwandeln zu %1"
 
-#: devices/devicepropertieswidget.cpp:259
+#: devices/devicepropertieswidget.cpp:262
 msgctxt "name (size free)"
 msgid "%1 (%2 free)"
 msgstr "%1 (%2 frei)"
@@ -810,51 +852,51 @@ msgstr "Kopiere in Bibliothek"
 msgid "Sync"
 msgstr "Synchronisieren"
 
-#: devices/devicespage.cpp:71
+#: devices/devicespage.cpp:70
 msgid "Forget Device"
 msgstr "Vergesse Gerät"
 
-#: devices/devicespage.cpp:114 devices/remotedevicepropertiesdialog.cpp:60
+#: devices/devicespage.cpp:113 devices/remotedevicepropertiesdialog.cpp:60
 msgid "Add Device"
 msgstr "Gerät hinzufügen"
 
-#: devices/devicespage.cpp:419 devices/devicespage.cpp:431
+#: devices/devicespage.cpp:432 devices/devicespage.cpp:444
 msgid "Lookup album and track details?"
 msgstr "Nach Album und Stücken suchen?"
 
-#: devices/devicespage.cpp:420 devices/devicespage.cpp:432
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:433 devices/devicespage.cpp:445
+#: devices/devicespage.cpp:455 gui/mainwindow.cpp:589
 msgid "Refresh"
 msgstr "Aktualisieren"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via CDDB"
 msgstr "Via CDDB"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via MusicBrainz"
 msgstr "Via MusicBrainz"
 
-#: devices/devicespage.cpp:439
+#: devices/devicespage.cpp:452
 msgid ""
 "<p>Which type of refresh do you wish to perform?<ul><li>Partial - Only new "
 "songs are scanned <i>(quick)</i></li><li>Full - All songs are rescanned <i>"
 "(slow)</i></li></ul></p>"
 msgstr ""
-"<p>Welcher Typ von Aktualisierung soll ausgeführt werden?<ul><li> "
-"Partiell – Nur neue Stücke werden gesucht <i>(schnell)</i></li><li> "
-"Voll – Alle Stücke werden neu gesucht <i>(langsam)</i></li></ul></p>"
+"<p>Welcher Typ von Aktualisierung soll ausgeführt werden?<ul><li> Partiell – "
+"Nur neue Stücke werden gesucht <i>(schnell)</i></li><li> Voll – Alle Stücke "
+"werden neu gesucht <i>(langsam)</i></li></ul></p>"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Partial"
 msgstr "Partiell"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Full"
 msgstr "Voll"
 
-#: devices/devicespage.cpp:489 gui/albumspage.cpp:187 gui/folderpage.cpp:255
-#: gui/librarypage.cpp:211
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:213 gui/folderpage.cpp:269
+#: gui/librarypage.cpp:256
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -862,27 +904,27 @@ msgstr ""
 "Sind Sie sicher, dass Sie die ausgewählten Stücke entfernen möchten?\n"
 "Dies kann nicht rückgängig gemacht werden."
 
-#: devices/devicespage.cpp:516
+#: devices/devicespage.cpp:529
 msgid "Are you sure you wish to forget <b>%1</b>?"
 msgstr "Wollen Sie wirklich <b>%1</b> entfernen?"
 
-#: devices/devicespage.cpp:535
+#: devices/devicespage.cpp:548
 msgid "Are you sure you wish to eject Audio CD <b>%1 - %2</b>?"
 msgstr "Wollen Sie wirklich Audio-CD <b>%1 – %2</b> auswerfen?"
 
-#: devices/devicespage.cpp:536
+#: devices/devicespage.cpp:549
 msgid "Eject"
 msgstr "Auswerfen"
 
-#: devices/devicespage.cpp:537
+#: devices/devicespage.cpp:550
 msgid "Are you sure you wish to disconnect <b>%1</b>?"
 msgstr "Wollen Sie wirklich die Verbindung zu <b>%1</b> beenden?"
 
-#: devices/devicespage.cpp:538
+#: devices/devicespage.cpp:551
 msgid "Disconnect"
 msgstr "Verbindung beenden"
 
-#: devices/devicespage.cpp:557 gui/mainwindow.cpp:1150
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1220
 msgid "Please close other dialogs first."
 msgstr "Andere Dialoge bitte zuerst schließen."
 
@@ -923,16 +965,15 @@ msgstr ""
 "Stückes darzustellen.<br>Der <b>AAC</b>-Encoder unterstützt <a href=http://"
 "de.wikipedia.org/wiki/Bitrate#Variable_Bitrate>Variable Bitraten (VBR)</a>,"
 "was bedeutet, dass der Bitraten-Wert eines Stückes basierend auf der "
-"Komplexität des Audio-Inhalts schwankt. Komplexere Abstände von "
-"Daten werden mit einer höheren Bitrate als weniger komplexe kodiert. Dieser "
-"Ansatz führt zu einer insgesamt besseren Qualität und einer kleineren Datei "
-"als mit einer konstanten Bitrate über das gesamte Stück.<br> "
-"Die Bitraten-Einstellung mit dem Schieberegler ist nur eine grobe Schätzung "
-"der durchschnittlichen Bitrate des kodierten Stückes bei einem "
-"Qualitätswert.<br/><b>160kb/s</b> ist eine gute "
-"Wahl für Musikhören auf einem tragbaren Player.<br/>Alles unter <b>150kb/s</ "
-"b> könnte nicht zufriedenstellend sein alles über <b>200kb/s</b> ist "
-"wahrscheinlich übertrieben."
+"Komplexität des Audio-Inhalts schwankt. Komplexere Abstände von Daten werden "
+"mit einer höheren Bitrate als weniger komplexe kodiert. Dieser Ansatz führt "
+"zu einer insgesamt besseren Qualität und einer kleineren Datei als mit einer "
+"konstanten Bitrate über das gesamte Stück.<br> Die Bitraten-Einstellung mit "
+"dem Schieberegler ist nur eine grobe Schätzung der durchschnittlichen "
+"Bitrate des kodierten Stückes bei einem Qualitätswert.<br/><b>160kb/s</b> "
+"ist eine gute Wahl für Musikhören auf einem tragbaren Player.<br/>Alles "
+"unter <b>150kb/s</ b> könnte nicht zufriedenstellend sein alles über "
+"<b>200kb/s</b> ist wahrscheinlich übertrieben."
 
 #: devices/encoders.cpp:101 devices/encoders.cpp:141
 msgid "Expected average bitrate for variable bitrate encoding"
@@ -940,12 +981,12 @@ msgstr ""
 "Erwartete durchschnittliche Bitrate für die Kodierung mit variabler Bitrate"
 
 #: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:256 devices/encoders.cpp:291
+#: devices/encoders.cpp:233 devices/encoders.cpp:293 devices/encoders.cpp:329
 msgid "Smaller file"
 msgstr "Kleinere Datei"
 
 #: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
-#: devices/encoders.cpp:292
+#: devices/encoders.cpp:234 devices/encoders.cpp:330
 msgid "Better sound quality"
 msgstr "Bessere Qualität"
 
@@ -984,18 +1025,17 @@ msgstr ""
 "Stückes darzustellen.<br>Der <b>MP3</b>-Encoder unterstützt <a href=http://"
 "de.wikipedia.org/wiki/Bitrate#Variable_Bitrate>Variable Bitraten (VBR)</a>,"
 "was bedeutet, dass der Bitraten-Wert eines Stückes basierend auf der "
-"Komplexität des Audio-Inhalts schwankt. Komplexere Abstände von "
-"Daten werden mit einer höheren Bitrate als weniger komplexe kodiert. Dieser "
-"Ansatz führt zu einer insgesamt besseren Qualität und einer kleineren Datei "
-"als mit einer konstanten Bitrate über das gesamte Stück.<br> "
-"Die Bitraten-Einstellung mit dem Schieberegler ist nur eine grobe Schätzung "
-"der durchschnittlichen Bitrate des kodierten Stückes bei einem "
-"Qualitätswert.<br/><b>160kb/s</b> ist eine gute Wahl für Musikhören"
-"auf einem tragbaren Player.<br/>Alles unter <b>120kb/s</b> könnte nicht "
-"zufriedenstellend sein alles über <b>205kb/s</b> ist wahrscheinlich "
-"übertrieben."
-
-#: devices/encoders.cpp:156 online/magnatuneservice.cpp:182
+"Komplexität des Audio-Inhalts schwankt. Komplexere Abstände von Daten werden "
+"mit einer höheren Bitrate als weniger komplexe kodiert. Dieser Ansatz führt "
+"zu einer insgesamt besseren Qualität und einer kleineren Datei als mit einer "
+"konstanten Bitrate über das gesamte Stück.<br> Die Bitraten-Einstellung mit "
+"dem Schieberegler ist nur eine grobe Schätzung der durchschnittlichen "
+"Bitrate des kodierten Stückes bei einem Qualitätswert.<br/><b>160kb/s</b> "
+"ist eine gute Wahl für Musikhörenauf einem tragbaren Player.<br/>Alles unter "
+"<b>120kb/s</b> könnte nicht zufriedenstellend sein alles über <b>205kb/s</b> "
+"ist wahrscheinlich übertrieben."
+
+#: devices/encoders.cpp:156 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
@@ -1034,32 +1074,77 @@ msgid ""
 "anything above <b>8</b> is probably overkill."
 msgstr ""
 "Die Bitrate ist eine Einheit für die Menge an Daten, um eine Sekunde des "
-"Stückes darzustellen.<br>Der <b>Vorbis</b>-Encoder unterstützt <a href=http://"
-"de.wikipedia.org/wiki/Bitrate#Variable_Bitrate>Variable Bitraten (VBR)</a>,"
-"was bedeutet, dass der Bitraten-Wert eines Stückes basierend auf der "
-"Komplexität des Audio-Inhalts schwankt. Komplexere Abstände von "
-"Daten werden mit einer höheren Bitrate als weniger komplexe kodiert. Dieser "
-"Ansatz führt zu einer insgesamt besseren Qualität und einer kleineren Datei "
-"als mit einer konstanten Bitrate über das gesamte Stück.<br/>Der Vorbis-"
-"Encoder verwendet eine Wertigkeit zwischen -1 und 10, um eine bestimmte "
-"erwartete Audioqualität zu definieren. Die Bitraten-Einstellung mit dem "
-"Schieberegler ist nur eine grobe Schätzung (bereitgestellt von Vorbis) der "
+"Stückes darzustellen.<br>Der <b>Vorbis</b>-Encoder unterstützt <a "
+"href=http://de.wikipedia.org/wiki/Bitrate#Variable_Bitrate>Variable Bitraten "
+"(VBR)</a>,was bedeutet, dass der Bitraten-Wert eines Stückes basierend auf "
+"der Komplexität des Audio-Inhalts schwankt. Komplexere Abstände von Daten "
+"werden mit einer höheren Bitrate als weniger komplexe kodiert. Dieser Ansatz "
+"führt zu einer insgesamt besseren Qualität und einer kleineren Datei als mit "
+"einer konstanten Bitrate über das gesamte Stück.<br/>Der Vorbis-Encoder "
+"verwendet eine Wertigkeit zwischen -1 und 10, um eine bestimmte erwartete "
+"Audioqualität zu definieren. Die Bitraten-Einstellung mit dem Schieberegler "
+"ist nur eine grobe Schätzung (bereitgestellt von Vorbis) der "
 "durchschnittlichen Bitrate des codierten Stückes bei einem Qualitätswert. "
-"Mit neueren und effizienteren Vorbis-Versionen ist die tatsächliche"
-"Bitrate ist sogar noch niedriger.<br><b>5</b> ist eine gute "
-"Wahl für Musikhören auf einem tragbaren Player.<br/>Alles unter <b>3</b> "
-"könnte nicht zufriedenstellend sein alles über <b>8</b> ist wahrscheinlich "
-"übertrieben."
+"Mit neueren und effizienteren Vorbis-Versionen ist die tatsächlicheBitrate "
+"ist sogar noch niedriger.<br><b>5</b> ist eine gute Wahl für Musikhören auf "
+"einem tragbaren Player.<br/>Alles unter <b>3</b> könnte nicht "
+"zufriedenstellend sein alles über <b>8</b> ist wahrscheinlich übertrieben."
 
 #: devices/encoders.cpp:184
 msgid "Quality rating"
 msgstr "Qualitätsbewertung"
 
-#: devices/encoders.cpp:205
+#: devices/encoders.cpp:201
+msgid "Opus"
+msgstr ""
+
+#: devices/encoders.cpp:204
+msgctxt ""
+"Feel free to redirect the english Wikipedia link to a local version, if it "
+"exists."
+msgid ""
+"<a href=http://en.wikipedia.org/wiki/Opus_(audio_format)>Opus</a> is a "
+"patent-free digital audio codec using a form of lossy data compression."
+msgstr ""
+
+#: devices/encoders.cpp:206
+msgid ""
+"The bitrate is a measure of the quantity of data used to represent a second "
+"of the audio track.<br>The <b>Opus</b> encoder used by Cantata supports a <a "
+"href=http://en.wikipedia.org/wiki/Variable_bitrate>variable bitrate (VBR)</"
+"a> setting, which means that the bitrate value fluctuates along the track "
+"based on the complexity of the audio content. More complex intervals of data "
+"are encoded with a higher bitrate than less complex ones; this approach "
+"yields overall better quality and a smaller file than having a constant "
+"bitrate throughout the track.<br>For this reason, the bitrate measure in "
+"this slider is just an estimate of the average bitrate of the encoded track."
+"<br><b>128kb/s</b> is a good choice for music listening on a portable player."
+"<br/>Anything below <b>100kb/s</b> might be unsatisfactory for music and "
+"anything above <b>256kb/s</b> is probably overkill."
+msgstr ""
+"Die Bitrate ist eine Einheit für die Menge an Daten, um eine Sekunde des "
+"Stückes darzustellen.<br>Der <b>Opus</b>-Encoder unterstützt <a href=http://"
+"de.wikipedia.org/wiki/Bitrate#Variable_Bitrate>Variable Bitraten (VBR)</a>,"
+"was bedeutet, dass der Bitraten-Wert eines Stückes basierend auf der "
+"Komplexität des Audio-Inhalts schwankt. Komplexere Abstände von Daten werden "
+"mit einer höheren Bitrate als weniger komplexe kodiert. Dieser Ansatz führt "
+"zu einer insgesamt besseren Qualität und einer kleineren Datei als mit einer "
+"konstanten Bitrate über das gesamte Stück.<br> Die Bitraten-Einstellung mit "
+"dem Schieberegler ist nur eine grobe Schätzung der durchschnittlichen "
+"Bitrate des kodierten Stückes bei einem Qualitätswert.<br/><b>128kb/s</b> "
+"ist eine gute Wahl für Musikhörenauf einem tragbaren Player.<br/>Alles unter "
+"<b>100kb/s</b> könnte nicht zufriedenstellend sein alles über <b>256kb/s</b> "
+"ist wahrscheinlich übertrieben."
+
+#: devices/encoders.cpp:223 devices/encoders.cpp:320
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#: devices/encoders.cpp:242
 msgid "Apple Lossless"
 msgstr "Apple Lossless"
 
-#: devices/encoders.cpp:208
+#: devices/encoders.cpp:245
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1074,11 +1159,11 @@ msgstr ""
 "Musik.<br>Empfohlen wird dies nur für Apple Geräte und Geräte welche keine "
 "Unterstützung FLAC besitzen."
 
-#: devices/encoders.cpp:223 online/magnatuneservice.cpp:183
+#: devices/encoders.cpp:260 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:226
+#: devices/encoders.cpp:263
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1094,7 +1179,7 @@ msgstr ""
 "ohne Kompromisse bei der Audioqualität speichern möchten, ist FLAC eine "
 "ausgezeichnete Wahl."
 
-#: devices/encoders.cpp:230
+#: devices/encoders.cpp:267
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1112,29 +1197,27 @@ msgstr ""
 "html>Komprimierungsgrad</a> ist ein Zahlenwert zwischen 0 and 8, welcher "
 "einen Kompromiss zwischen Dateigröße und Komprimierungsgeschwindigkeit "
 "während der Kodierung mit<b>FLAC</b> darstellt.<br/> Einstellen der "
-"Kompressionsrate "
-"auf <b>0</ b> liefert die kürzeste Zeit, aber die Kompression erzeugt eine "
-"vergleichsweise große Datei.<br/>Auf der anderen Seite arbeitet eine "
-"Kompression von "
-"<b>8</b> sehr langsam, erzeugt aber eine kleinere Datei.<br/>Beachten "
-"Sie, dass FLAC per Definition ein verlustfreier Codec ist. Die Audio-Qualität "
-"der Ausgabe ist unabhängig von der Kompression.<br/>Ein Komprimierungsgrad "
-"über <b>5</b> erhöht erheblich die Kompressionszeit wird aber kaum "
-"kleinere Dateien erstellen."
+"Kompressionsrate auf <b>0</ b> liefert die kürzeste Zeit, aber die "
+"Kompression erzeugt eine vergleichsweise große Datei.<br/>Auf der anderen "
+"Seite arbeitet eine Kompression von <b>8</b> sehr langsam, erzeugt aber eine "
+"kleinere Datei.<br/>Beachten Sie, dass FLAC per Definition ein verlustfreier "
+"Codec ist. Die Audio-Qualität der Ausgabe ist unabhängig von der Kompression."
+"<br/>Ein Komprimierungsgrad über <b>5</b> erhöht erheblich die "
+"Kompressionszeit wird aber kaum kleinere Dateien erstellen."
 
-#: devices/encoders.cpp:245
+#: devices/encoders.cpp:282
 msgid "Compression level"
 msgstr "Komprimierungsgrad"
 
-#: devices/encoders.cpp:255
+#: devices/encoders.cpp:292
 msgid "Faster compression"
 msgstr "Schnellere Komprimierung"
 
-#: devices/encoders.cpp:261
+#: devices/encoders.cpp:299
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:264
+#: devices/encoders.cpp:302
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1149,7 +1232,7 @@ msgstr ""
 "verlustbehaftete Audiokompression.<br>Empfohlen nur für tragbare Geräte "
 "welche nicht Ogg Vorbis unterstützen."
 
-#: devices/encoders.cpp:268
+#: devices/encoders.cpp:306
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>Due to the limitations of the proprietary <b>WMA</b> "
@@ -1169,142 +1252,111 @@ msgstr ""
 "href=http://de.wikipedia.org/wiki/Windows_Media_Audio>eine konstante Bitrate "
 "(CBR)</a> benutzen.<br>Aus diesem Grund ist die Bitrateneineit in diesem "
 "Schieberegler eine ziemlich genaue Schätzung der Bitrate der codierten Spur."
-"<br><b>136kb/s</b> ist eine gute Wahl für Musikhören"
-"auf einem tragbaren Gerät.<br/>Alles unter <b>112kb/s</ b> könnte nicht "
-"zufriedenstellend sein, aber alles über <b>182kb/s</b> ist wahrscheinlich "
-"übertrieben."
-
-#: devices/encoders.cpp:282
-msgid "Bitrate"
-msgstr "Bitrate"
+"<br><b>136kb/s</b> ist eine gute Wahl für Musikhörenauf einem tragbaren "
+"Gerät.<br/>Alles unter <b>112kb/s</ b> könnte nicht zufriedenstellend sein, "
+"aber alles über <b>182kb/s</b> ist wahrscheinlich übertrieben."
 
-#: devices/filenameschemedialog.cpp:33
+#: devices/filenameschemedialog.cpp:34
 msgid "Filename Scheme"
 msgstr "Dateischema"
 
-#: devices/filenameschemedialog.cpp:51
+#: devices/filenameschemedialog.cpp:62
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "Verschiedene Künstler"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:63
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Wibble"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:64
+msgctxt "Example composer"
+msgid "Vivaldi"
+msgstr "Vivaldi"
+
+#: devices/filenameschemedialog.cpp:65
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "Now 5001"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:66
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "Wobble"
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:67
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Dance"
 
-#: devices/filenameschemedialog.cpp:99
-#, fuzzy
+#: devices/filenameschemedialog.cpp:121
 msgid ""
 "<p>The following variables will be replaced with their corresponding meaning "
-"for each track name.</p><p><table border=\"1\"><tr><th><em>Button</em></"
-"th><th><em>Variable</em></th><th><em>Description</em></th></tr><tr><td>"
-"%albumartist%</td><td>%1</td><td>The artist of the album. For most albums, "
-"this will be the same as the <i>Track Artist.</i> For compilations, this "
-"will often be <i>Various Artists.</i> </td></tr><tr><td>%album%</td><td>%2</"
-"td><td>The name of the album.</td></tr><tr><td>%artist%</td><td>%3</"
-"td><td>The artist of each track.</td></tr><tr><td>%title%</td><td>%4</"
-"td><td>The track title (without <i>Track Artist</i>).</td></tr><tr><td>"
-"%artistandtitle%</td><td>%5</td><td>The track title (with <i>Track Artist</"
-"i>, if different to <i>Album Artist</i>).</td></tr><tr><td>%track%</td><td>"
-"%6</td><td>The track number.</td></tr><tr><td>%discnumber%</td><td>%7</"
-"td><td>The album number of a multi-album album. Often compilations consist "
-"of several albums.</td></tr><tr><td>%year%</td><td>%8</td><td>The year of "
-"the album's release.</td></tr><tr><td>%genre%</td><td>%9</td><td>The genre "
-"of the album.</td></tr></table></p>"
+"for each track name.</p>"
 msgstr ""
-"<p>The following variables will be replaced with their corresponding meaning "
-"for each track name.</p><p><table border=\"1\"><tr><th><em>Button</em></"
-"th><th><em>Variable</em></th><th><em>Description</em></th></tr><tr><td>%1</"
-"td><td>%2</td><td>The artist of the album. For most albums, this will be the "
-"same as the <i>Track Artist.</i> For compilations, this will often be "
-"<i>Various Artists.</i> </td></tr><tr><td>%3</td><td>%4</td><td>The name of "
-"the album.</td></tr><tr><td>%5</td><td>%6</td><td>The artist of each track.</"
-"td></tr><tr><td>%7</td><td>%8</td><td>The track title (without <i>Track "
-"Artist</i>).</td></tr><tr><td>%9</td><td>%10</td><td>The track title (with "
-"<i>Track Artist</i>, if different to <i>Album Artist</i>).</td></tr><tr><td>"
-"%11</td><td>%12</td><td>The track number.</td></tr><tr><td>%13</td><td>%14</"
-"td><td>The album number of a multi-album album. Often compilations consist "
-"of several albums.</td></tr><tr><td>%15</td><td>%16</td><td>The year of the "
-"album's release.</td></tr><tr><td>%17</td><td>%18</td><td>The genre of the "
-"album.</td></tr></table></p>"
-
-#: devices/fsdevice.cpp:678
+
+#: devices/filenameschemedialog.cpp:123
+msgid ""
+"<tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</"
+"em></th></tr>"
+msgstr ""
+
+#: devices/fsdevice.cpp:675 gui/albumspage.cpp:287 gui/folderpage.cpp:304
+#: gui/librarypage.cpp:414
 msgid "Updating..."
 msgstr "Aktualisiere..."
 
-#: devices/fsdevice.cpp:760 online/onlineservice.cpp:93
-#: online/onlineservice.cpp:160
+#: devices/fsdevice.cpp:757 online/onlineservice.cpp:94
+#: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "Lese den Zwischenspeicher"
 
-#: devices/fsdevice.cpp:772 online/onlineservice.cpp:348
+#: devices/fsdevice.cpp:769 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
 
-#: devices/mtpdevice.cpp:137
+#: devices/mtpdevice.cpp:153
 msgid "Connecting to device..."
 msgstr "Verbinde mit Gerät..."
 
-#: devices/mtpdevice.cpp:139 devices/mtpdevice.cpp:161
+#: devices/mtpdevice.cpp:155 devices/mtpdevice.cpp:202
 msgid "No devices found"
 msgstr "Keine Geräte gefunden"
 
-#: devices/mtpdevice.cpp:173
+#: devices/mtpdevice.cpp:217
 msgid "Connected to device"
 msgstr "Mit Gerät verbunden"
 
-#: devices/mtpdevice.cpp:183
+#: devices/mtpdevice.cpp:230
 msgid "Disconnected from device"
 msgstr "Vom Gerät getrennt"
 
-#: devices/mtpdevice.cpp:250
+#: devices/mtpdevice.cpp:304
 msgid "Updating folders..."
 msgstr "Aktualisiere Ordner..."
 
-#: devices/mtpdevice.cpp:257
+#: devices/mtpdevice.cpp:320
 msgid "Updating files..."
 msgstr "Aktualisiere Dateien..."
 
-#: devices/mtpdevice.cpp:262 devices/remotefsdevice.cpp:465
-#: devices/remotefsdevice.cpp:485
+#: devices/mtpdevice.cpp:334 devices/remotefsdevice.cpp:461
+#: devices/remotefsdevice.cpp:481
 msgid "Updating tracks..."
 msgstr "Aktualisiere Titel..."
 
-#: devices/mtpdevice.cpp:281 devices/mtpdevice.cpp:381
-#: models/albumsmodel.cpp:471 models/musiclibraryitemroot.cpp:78
-#: models/musiclibraryitemroot.cpp:117 models/musiclibraryitemroot.cpp:171
-#: models/musiclibraryitemroot.cpp:787 models/musiclibraryitemroot.cpp:961
-#: mpd/song.cpp:328
-msgid "Various Artists"
-msgstr "Verschiedene Künstler:"
-
-#: devices/mtpdevice.cpp:1473 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:53
-#: models/devicesmodel.cpp:140
+#: devices/mtpdevice.cpp:1619 devices/remotefsdevice.cpp:564
+#: devices/umsdevice.cpp:100 gui/initialsettingswizard.cpp:57
+#: models/devicesmodel.cpp:157
 msgid "Not Connected"
 msgstr "Nicht verbunden"
 
-#: devices/musicbrainz.cpp:320
+#: devices/musicbrainz.cpp:319
 msgid "%1 (Disc %2)"
 msgstr "%1 (Disk %2)"
 
-#: devices/musicbrainz.cpp:408
+#: devices/musicbrainz.cpp:407
 msgid "No matches found in MusicBrainz"
 msgstr "Keine Treffer in MusicBrainz gefunden"
 
@@ -1312,7 +1364,7 @@ msgstr "Keine Treffer in MusicBrainz gefunden"
 msgid "Connection"
 msgstr "Verbindung"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:237
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:261
 msgid "Music Library"
 msgstr "Musikbibliothek"
 
@@ -1340,24 +1392,24 @@ msgstr "Secure Shell (sshfs)"
 msgid "Locally Mounted Folder"
 msgstr "Lokal eingehängter Ordner"
 
-#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:612
+#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:608
 msgid "Available"
 msgstr "Verfügbar"
 
-#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:610
+#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:606
 msgid "Not Available"
 msgstr "Nicht verfügbar"
 
-#: devices/remotefsdevice.cpp:315
+#: devices/remotefsdevice.cpp:313
 msgid "Failed to resolve connection details for %1"
 msgstr "Fehler beim Auflösen der Verbindungsdetails zu %1"
 
-#: devices/remotefsdevice.cpp:330 devices/remotefsdevice.cpp:345
-#: devices/remotefsdevice.cpp:403
+#: devices/remotefsdevice.cpp:328 devices/remotefsdevice.cpp:343
+#: devices/remotefsdevice.cpp:399
 msgid "Connecting..."
 msgstr "Verbinde..."
 
-#: devices/remotefsdevice.cpp:358
+#: devices/remotefsdevice.cpp:356
 msgid ""
 "Password prompting does not work when cantata is started from the "
 "commandline."
@@ -1365,7 +1417,7 @@ msgstr ""
 "Passwortabfrage funktioniert nicht, wenn Cantata von der Kommandozeile "
 "gestartet wird."
 
-#: devices/remotefsdevice.cpp:379
+#: devices/remotefsdevice.cpp:375
 msgid ""
 "No suitable ssh-askpass application installed! This is required for entering "
 "passwords."
@@ -1373,50 +1425,50 @@ msgstr ""
 "Kein brauchbares ssh-askpass installiert. Dies wird benötigt, um Passwörter "
 "eingeben zu können."
 
-#: devices/remotefsdevice.cpp:386
+#: devices/remotefsdevice.cpp:382
 msgid "Mount point (\"%1\") is not empty!"
 msgstr "Einhängepunkt (\"%1\") ist nicht leer."
 
-#: devices/remotefsdevice.cpp:398
+#: devices/remotefsdevice.cpp:394
 msgid "\"sshfs\" is not installed!"
 msgstr "\"sshfs\" ist nicht installiert."
 
-#: devices/remotefsdevice.cpp:426 devices/remotefsdevice.cpp:446
+#: devices/remotefsdevice.cpp:422 devices/remotefsdevice.cpp:442
 msgid "Disconnecting..."
 msgstr "Verbindung beenden..."
 
-#: devices/remotefsdevice.cpp:440
+#: devices/remotefsdevice.cpp:436
 msgid "\"fusermount\" is not installed!"
 msgstr "\"fusermount\" ist nicht installiert."
 
-#: devices/remotefsdevice.cpp:461 devices/remotefsdevice.cpp:482
+#: devices/remotefsdevice.cpp:457 devices/remotefsdevice.cpp:478
 msgid "Failed to connect to \"%1\""
 msgstr "Fehler beim Verbinden zu \"%1\""
 
-#: devices/remotefsdevice.cpp:462 devices/remotefsdevice.cpp:497
+#: devices/remotefsdevice.cpp:458 devices/remotefsdevice.cpp:493
 msgid "Failed to disconnect from \"%1\""
 msgstr "Fehler beim Beenden der Verbindung von \"%1\""
 
-#: devices/remotefsdevice.cpp:573
+#: devices/remotefsdevice.cpp:569
 msgid "Capacity Unknown"
 msgstr "Größe unbekannt"
 
-#. i18n: file: gui/coverdialog.ui:30
+#. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (text), widget (QPushButton, search)
-#: devices/synccollectionwidget.cpp:53 gui/stdactions.cpp:83 po/rc.cpp:337
-#: rc.cpp:337
+#: devices/synccollectionwidget.cpp:54 gui/mainwindow.cpp:323
+#: online/podcastsearchdialog.cpp:334 po/rc.cpp:404 rc.cpp:404
 msgid "Search"
 msgstr "Suche"
 
-#: devices/synccollectionwidget.cpp:62
+#: devices/synccollectionwidget.cpp:63
 msgid "Check Items"
 msgstr "Aktiviere markiere Stücke"
 
-#: devices/synccollectionwidget.cpp:64
+#: devices/synccollectionwidget.cpp:65
 msgid "Uncheck Items"
 msgstr "Deaktiviere markierte Stücke"
 
-#: devices/synccollectionwidget.cpp:266
+#: devices/synccollectionwidget.cpp:272
 msgid "Nothing selected"
 msgstr "Nichts ausgewählt"
 
@@ -1440,7 +1492,7 @@ msgstr "Synchronisieren"
 msgid "Device and library are in sync."
 msgstr "Gerät und Bibliothek sind synchronisiert."
 
-#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:190
+#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:188
 msgid "Not Scanned"
 msgstr "Nicht eingelesen"
 
@@ -1448,21 +1500,21 @@ msgstr "Nicht eingelesen"
 msgid " (recommended)"
 msgstr " (benötigt)"
 
-#: dynamic/dynamic.cpp:195
+#: dynamic/dynamic.cpp:215
 msgid "Start Dynamic Playlist"
 msgstr "Starte dynamische Wiedergabeliste"
 
-#: dynamic/dynamic.cpp:196
+#: dynamic/dynamic.cpp:216
 msgid "Stop Dynamic Mode"
 msgstr "Stoppe dynamischen Modus"
 
-#: dynamic/dynamic.cpp:244
+#: dynamic/dynamic.cpp:264
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "Eine Regel"
 msgstr[1] "%1 Regeln"
 
-#: dynamic/dynamic.cpp:383
+#: dynamic/dynamic.cpp:403
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
@@ -1470,71 +1522,71 @@ msgstr ""
 "Sie müssen \"perl\"  auf ihrem System installieren, um den dynamischen Modus "
 "von Cantata zu benutzen."
 
-#: dynamic/dynamic.cpp:390
+#: dynamic/dynamic.cpp:410
 msgid "Failed to locate rules file - %1"
 msgstr "Fehler beim Finden der Einstellungsdatei – %1"
 
-#: dynamic/dynamic.cpp:398
+#: dynamic/dynamic.cpp:418
 msgid "Failed to remove previous rules file - %1"
 msgstr "Fehler beim Entfernen der bestehenden Regeldatei – %1"
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:423
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "Fehler beim Erstellen der Einstellungsdatei – %1 → %2"
 
-#: dynamic/dynamic.cpp:703
+#: dynamic/dynamic.cpp:736
 msgid "Dynamizer has been terminated."
 msgstr "Dynamizer wurde beendet"
 
-#: dynamic/dynamic.cpp:790
+#: dynamic/dynamic.cpp:823 mpd/mpdconnection.cpp:150
 msgid "Uknown"
 msgstr "Unbekannt"
 
-#: dynamic/dynamic.cpp:792
+#: dynamic/dynamic.cpp:825
 msgid "Loading list of rules"
 msgstr "Lade Liste der Regeln"
 
-#: dynamic/dynamic.cpp:793
+#: dynamic/dynamic.cpp:826
 msgid "Saving rule"
 msgstr "Speichere Regel"
 
-#: dynamic/dynamic.cpp:794
+#: dynamic/dynamic.cpp:827
 msgid "Deleting rule"
 msgstr "Lösche Regel"
 
-#: dynamic/dynamic.cpp:795
+#: dynamic/dynamic.cpp:828
 msgid "Setting active rule"
 msgstr "Setzte aktive Regel"
 
-#: dynamic/dynamic.cpp:796
+#: dynamic/dynamic.cpp:829
 msgid "Stopping dynamizer"
 msgstr "Stoppe Dynamizer"
 
-#: dynamic/dynamic.cpp:797
+#: dynamic/dynamic.cpp:830
 msgid "Requesting ID details"
 msgstr "Abfrage der ID-Details"
 
-#: dynamic/dynamic.cpp:800
+#: dynamic/dynamic.cpp:833
 msgid "Awaiting response for previous command. (%1)"
 msgstr "Warte auf Antwort vom vorherigen Kommando. (%1)"
 
-#: dynamic/dynamic.cpp:955
+#: dynamic/dynamic.cpp:988
 msgid "Dynamizer is not active"
 msgstr "Dynamizer ist nicht aktiv"
 
-#: dynamic/dynamic.cpp:963
+#: dynamic/dynamic.cpp:996
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "Fehler beim Empfang der Liste von dynamischen Regeln (%1)"
 
-#: dynamic/dynamic.cpp:994
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to delete rules file. (%1)"
 msgstr "Fehler beim Löschen der Einstellungsdatei. (%1)"
 
-#: dynamic/dynamic.cpp:1001
+#: dynamic/dynamic.cpp:1034
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Fehler beim Setzen des Dynamizer-Status. (%1)"
 
-#: dynamic/dynamic.cpp:1010
+#: dynamic/dynamic.cpp:1043
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "Fehler beim Setzen der dynamischen Regeln. (%1)"
 
@@ -1550,11 +1602,11 @@ msgstr "Füge dynamische Regeln hinzu"
 msgid "Edit Dynamic Rules"
 msgstr "Bearbeite dynamische Regeln"
 
-#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:151
+#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:150
 msgid "Remove Dynamic Rules"
 msgstr "Entferne dynamische Regeln"
 
-#: dynamic/dynamicpage.cpp:150
+#: dynamic/dynamicpage.cpp:149
 msgid ""
 "Are you sure you wish to remove the selected rules?\n"
 "This cannot be undone."
@@ -1568,15 +1620,15 @@ msgstr "Dynamische Regel"
 
 #. i18n: file: dynamic/dynamicrules.ui:53
 #. i18n: ectx: property (text), widget (QPushButton, addBtn)
-#: dynamic/dynamicruledialog.cpp:128 po/rc.cpp:274 rc.cpp:274
+#: dynamic/dynamicruledialog.cpp:145 po/rc.cpp:341 rc.cpp:341
 msgid "Add"
 msgstr "Hinzufügen"
 
-#: dynamic/dynamicruledialog.cpp:191
+#: dynamic/dynamicruledialog.cpp:211
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr "<i><b>FEHLER:</b> 'Von Jahr' muss kleiner als 'Zu Jahr' sein</i>"
 
-#: dynamic/dynamicruledialog.cpp:194
+#: dynamic/dynamicruledialog.cpp:214
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1586,51 +1638,57 @@ msgstr ""
 
 #: dynamic/dynamicrulesdialog.cpp:68
 msgid "SimilarArtists"
-msgstr "Ähnliche Künstler:"
+msgstr "Ähnliche Künstler"
 
 #: dynamic/dynamicrulesdialog.cpp:70
 msgid "AlbumArtist"
 msgstr "AlbumKünstler"
 
-#: dynamic/dynamicrulesdialog.cpp:72 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:104 replaygain/rgdialog.cpp:138
+#. i18n: file: devices/filenameschemedialog.ui:102
+#. i18n: ectx: property (text), widget (QPushButton, composer)
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:212 rc.cpp:212
+msgid "Composer"
+msgstr ""
+
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:48
+#: models/playqueuemodel.cpp:107 replaygain/rgdialog.cpp:129
 msgid "Album"
 msgstr "Album"
 
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: dynamic/dynamicrulesdialog.cpp:76 models/playqueuemodel.cpp:109
-#: po/rc.cpp:184 po/rc.cpp:298 rc.cpp:184 rc.cpp:298
+#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:112
+#: po/rc.cpp:254 po/rc.cpp:380 rc.cpp:254 rc.cpp:380
 msgid "Genre"
 msgstr "Genre"
 
-#: dynamic/dynamicrulesdialog.cpp:78
+#: dynamic/dynamicrulesdialog.cpp:80
 msgid "Date"
 msgstr "Datum"
 
-#: dynamic/dynamicrulesdialog.cpp:90
+#: dynamic/dynamicrulesdialog.cpp:92
 msgid "Include"
 msgstr "Einbeziehen"
 
-#: dynamic/dynamicrulesdialog.cpp:97
+#: dynamic/dynamicrulesdialog.cpp:99
 msgid "Exclude"
 msgstr "Ausschließen"
 
-#: dynamic/dynamicrulesdialog.cpp:120
+#: dynamic/dynamicrulesdialog.cpp:122
 msgid " (Exact)"
 msgstr " (Exakt)"
 
-#: dynamic/dynamicrulesdialog.cpp:137
+#: dynamic/dynamicrulesdialog.cpp:139
 msgid "Dynamic Rules"
 msgstr "Dynamische Regeln"
 
-#: dynamic/dynamicrulesdialog.cpp:288
+#: dynamic/dynamicrulesdialog.cpp:290
 #, fuzzy
 msgid ""
 "<p>Cantata will query your library using all of the rules listed. The list "
@@ -1646,17 +1704,17 @@ msgid ""
 "the set of usable songs has been created, Cantata will randomly select songs "
 "to keep the play queue filled with 10 entries.</p>"
 msgstr ""
-"<p>Cantata wird die Bibliothek nach allen Regeln durchsuchen, die aufgelistet "
-"sind. Die Liste der <i>Einbeziehen</i>-Regeln wird benutzt, um eine "
-"Auswahl an Stücken zu erstellen, welche darin enthalten sind. Die Liste der "
-"<i>Ausschließen</i>-Regeln wird benutzt, um eine Auswahl an Stücken zu "
+"<p>Cantata wird die Bibliothek nach allen Regeln durchsuchen, die "
+"aufgelistet sind. Die Liste der <i>Einbeziehen</i>-Regeln wird benutzt, um "
+"eine Auswahl an Stücken zu erstellen, welche darin enthalten sind. Die Liste "
+"der <i>Ausschließen</i>-Regeln wird benutzt, um eine Auswahl an Stücken zu "
 "erstellen, welche nicht benutzt werden.</p>"
 
-#: dynamic/dynamicrulesdialog.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:309
 msgid "Failed to save %1"
 msgstr "Fehler beim Speichern von %1"
 
-#: dynamic/dynamicrulesdialog.cpp:325
+#: dynamic/dynamicrulesdialog.cpp:327
 msgid ""
 "A set of rules named '%1' already exists!\n"
 "Overwrite?"
@@ -1664,86 +1722,95 @@ msgstr ""
 "Eine Regelliste mit Namen '%1' existiert bereits.\n"
 "Überschreiben?"
 
-#: dynamic/dynamicrulesdialog.cpp:326
+#: dynamic/dynamicrulesdialog.cpp:328
 msgid "Overwrite Rules"
 msgstr "Regel überschreiben:"
 
-#: dynamic/dynamicrulesdialog.cpp:351
+#: dynamic/dynamicrulesdialog.cpp:353
 msgid "Saving %1"
 msgstr "Speichere %1"
 
-#: gui/cachesettings.cpp:163
+#: gui/cachesettings.cpp:173
 msgid "Deleting..."
 msgstr "Lösche..."
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:196
 msgid "Name"
 msgstr "Name"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:196
 msgid "Item Count"
 msgstr "Gezählte Stücke"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:196
 msgid "Space Used"
 msgstr "Verbrauchter Speicherplatz"
 
-#: gui/cachesettings.cpp:227
+#: gui/cachesettings.cpp:239
+msgid "Total space used: %1"
+msgstr ""
+
+#: gui/cachesettings.cpp:250
+#, fuzzy
 msgid ""
-"To speed up loading of the music library, Cantata caches a local copy of the "
-"MPD listing. Cantata might also have cached covers, or lyrics, if these have "
-"been downloaded and could not be saved into the MPD folder (because Cantata "
-"cannot access it, or you have configured Cantata to not save these items "
-"there). Below is a summary of Cantata's cache usage."
+"Cantata caches a local copy of the MPD listing to speed up loading of the "
+"music library. Cantata might also have cached covers, lyrics, or artist "
+"images, if these have been downloaded and could not be saved into the MPD "
+"folder (because Cantata cannot access it, or you have configured Cantata to "
+"not save these items there). Below is a summary of Cantata's current cache "
+"usage."
 msgstr ""
 "Um die Geschwindigkeit der Medienbibliothek zu erhöhen verwendet Cantata "
-"einen lokalen Zwischenspeicher. Cantata kann auch "
-"heruntergeladene Cover oder Texte zwischenspeichern. Diese können nicht "
-"im MPD-Ordner gespeichert werden. Unten sehen Sie eine Zusammenstellung des "
-"Cantata Zwischenspeichers."
+"einen lokalen Zwischenspeicher. Cantata kann auch heruntergeladene Cover "
+"oder Texte zwischenspeichern. Diese können nicht im MPD-Ordner gespeichert "
+"werden. Unten sehen Sie eine Zusammenstellung des Cantata Zwischenspeichers."
 
-#: gui/cachesettings.cpp:239
+#: gui/cachesettings.cpp:263
 msgid "Covers"
 msgstr "Cover"
 
-#: gui/cachesettings.cpp:240
+#: gui/cachesettings.cpp:264
+msgid "Scaled Covers"
+msgstr "Skalierte Cover"
+
+#: gui/cachesettings.cpp:265
 msgid "Backdrops"
-msgstr "Hintergrund"
+msgstr "Hintergrundbilder"
 
-#: gui/cachesettings.cpp:245 gui/mainwindow.cpp:307
-#: widgets/groupedview.cpp:255
-msgid "Streams"
-msgstr "Streams"
+#: gui/cachesettings.cpp:271
+#, fuzzy
+msgid "Stream Listings"
+msgstr "Streaming"
 
-#: gui/cachesettings.cpp:246
+#: gui/cachesettings.cpp:274
 msgid "Jamendo"
 msgstr "Jamendo"
 
-#: gui/cachesettings.cpp:247
+#: gui/cachesettings.cpp:275
 msgid "Magnatune"
 msgstr "Magnatune"
 
-#: gui/cachesettings.cpp:249
+#: gui/cachesettings.cpp:276
+msgid "Podcast Directories"
+msgstr ""
+
+#: gui/cachesettings.cpp:285
 msgid "Delete All"
 msgstr "Lösche alle"
 
-#: gui/cachesettings.cpp:288
+#: gui/cachesettings.cpp:324
 msgid "Delete all '%1' items?"
 msgstr "Lösche alle '%1' Einträge?"
 
-#: gui/cachesettings.cpp:289 gui/cachesettings.cpp:299
+#: gui/cachesettings.cpp:325 gui/cachesettings.cpp:335
 msgid "Delete Cache Items"
 msgstr "Löschen Zwischenspeicher"
 
-#: gui/cachesettings.cpp:298
+#: gui/cachesettings.cpp:334
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr "<p>Alles folgende löschen?<ul>%1</ul></p>"
 
-#: gui/coverdialog.cpp:150 gui/main.cpp:169
-msgid "Last.fm"
-msgstr "Last.fm"
-
-#: gui/coverdialog.cpp:164
+#: gui/coverdialog.cpp:124
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1754,53 +1821,39 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:183
-msgctxt ""
-"Google\n"
-"width x height (file size)"
-msgid ""
-"Google\n"
-"%1 x %2 (%3)"
-msgstr ""
-"Google\n"
-"%1 x %2 (%3)"
-
-#: gui/coverdialog.cpp:203
+#: gui/coverdialog.cpp:126
 msgctxt ""
-"Discogs\n"
+"name\n"
 "width x height"
 msgid ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 msgstr ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 
-#: gui/coverdialog.cpp:237
-msgctxt ""
-"Current Cover\n"
-"width x height"
-msgid ""
-"Current Cover\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:162
+msgid "Current Cover"
+msgstr "Aktuelles Cover"
+
+#: gui/coverdialog.cpp:211 gui/coverdialog.cpp:411
+msgid "CoverArt Archive"
 msgstr ""
-"Aktuelles Cover\n"
-"%1 x %2"
 
-#: gui/coverdialog.cpp:255
+#: gui/coverdialog.cpp:242
 msgid "Image"
 msgstr "Bild"
 
-#: gui/coverdialog.cpp:258
+#: gui/coverdialog.cpp:245
 msgid "Downloading..."
 msgstr "Lade herunter..."
 
-#: gui/coverdialog.cpp:303 gui/coverdialog.cpp:338
+#: gui/coverdialog.cpp:290 gui/coverdialog.cpp:325
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "Bild (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:431
+#: gui/coverdialog.cpp:446
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
@@ -1808,7 +1861,7 @@ msgstr ""
 "<p>Ein Bild existiert bereits für diesen Künstler und die Datei ist nicht "
 "beschreibbar.<p></p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:447
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
@@ -1816,13 +1869,17 @@ msgstr ""
 "<p>Ein Cover existiert bereits für dieses Album und die Datei ist nicht "
 "beschreibbar.<p></p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:439 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:204
-msgctxt "Album by Artist"
-msgid "%1 by %2"
-msgstr "%1 von %2"
+#: gui/coverdialog.cpp:452
+#, fuzzy
+msgid "'%1' Artist Image"
+msgstr "1 Künstler,"
+
+#: gui/coverdialog.cpp:454
+msgctxt "'Artist - Album' Album Cover"
+msgid "'%1 - %2' Album Cover"
+msgstr ""
 
-#: gui/coverdialog.cpp:613
+#: gui/coverdialog.cpp:582
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1830,37 +1887,40 @@ msgstr ""
 "Fehler beim Setzen Covers.\n"
 "Kann temporäre Datei nicht herunterladen."
 
-#: gui/coverdialog.cpp:642
+#: gui/coverdialog.cpp:616
 msgid "Failed to download image!"
 msgstr "Kann Bild nicht herunterladen."
 
-#: gui/coverdialog.cpp:828 gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:875 gui/coverdialog.cpp:877
 msgid "Load Local Cover"
 msgstr "Lade lokales Cover"
 
-#: gui/coverdialog.cpp:830
-msgid "Images (*.png *.jpg)"
-msgstr "Bilder (*.png *.jpg)"
-
-#: gui/coverdialog.cpp:835
+#: gui/coverdialog.cpp:882
 msgid "File is already in list!"
 msgstr "Datei ist bereits in Liste."
 
-#: gui/coverdialog.cpp:839
+#: gui/coverdialog.cpp:886
 msgid "Failed to read image!"
 msgstr "Fehler beim Lesen des Bildes."
 
-#: gui/coverdialog.cpp:852
+#: gui/coverdialog.cpp:899
 msgid "Display"
 msgstr "Anzeige"
 
 #. i18n: file: dynamic/dynamicrules.ui:67
 #. i18n: ectx: property (text), widget (QPushButton, removeBtn)
-#: gui/coverdialog.cpp:853 gui/stdactions.cpp:82 po/rc.cpp:280 rc.cpp:280
+#. i18n: file: streams/streamssettings.ui:73
+#. i18n: ectx: property (text), widget (QPushButton, removeButton)
+#. i18n: file: dynamic/dynamicrules.ui:67
+#. i18n: ectx: property (text), widget (QPushButton, removeBtn)
+#. i18n: file: streams/streamssettings.ui:73
+#. i18n: ectx: property (text), widget (QPushButton, removeButton)
+#: gui/coverdialog.cpp:900 gui/stdactions.cpp:90 po/rc.cpp:347 po/rc.cpp:917
+#: rc.cpp:347 rc.cpp:917
 msgid "Remove"
 msgstr "Entfernen"
 
-#: gui/coverdialog.cpp:1218
+#: gui/coverdialog.cpp:1333
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1868,7 +1928,7 @@ msgstr ""
 "Fehler beim Setzen des Covers.\n"
 "Kann keine Kopie anfertigen."
 
-#: gui/coverdialog.cpp:1227
+#: gui/coverdialog.cpp:1342
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1876,7 +1936,7 @@ msgstr ""
 "Fehler beim Setzen des Covers.\n"
 "Kann keine Kopie des Originals anfertigen."
 
-#: gui/coverdialog.cpp:1276
+#: gui/coverdialog.cpp:1391
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1884,253 +1944,357 @@ msgstr ""
 "Fehler beim Setzen des Covers.\n"
 "Kann die Datei nicht zu '%1' kopieren."
 
-#: gui/folderpage.cpp:45
+#: gui/coverdialog.cpp:1449 models/onlineservicesmodel.cpp:157
+msgid "Searching..."
+msgstr "Suche..."
+
+#: gui/folderpage.cpp:44
 msgid "Open In File Manager"
 msgstr "Öffne im Dateimanager"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Established"
 msgstr "Verbindung hergestellt"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Failed"
 msgstr "Verbindung fehlgeschlagen"
 
-#. i18n: file: support/shortcutssettingspage.ui:78
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
+#. i18n: file: support/shortcutssettingswidget.ui:78
 #. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
-#: gui/interfacesettings.cpp:35 gui/playbacksettings.cpp:48
-#: online/magnatuneservice.cpp:160 po/rc.cpp:736 rc.cpp:736
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
+#. i18n: file: support/shortcutssettingswidget.ui:78
+#. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
+#: gui/interfacesettings.cpp:48 gui/playbacksettings.cpp:46
+#: online/magnatuneservice.cpp:159 po/rc.cpp:6 po/rc.cpp:660 po/rc.cpp:751
+#: po/rc.cpp:778 po/rc.cpp:932 rc.cpp:6 rc.cpp:660 rc.cpp:751 rc.cpp:778
+#: rc.cpp:932
 msgid "None"
 msgstr "Keine"
 
-#: gui/interfacesettings.cpp:36
+#: gui/interfacesettings.cpp:49 gui/interfacesettings.cpp:160
 msgid "Small"
 msgstr "Klein"
 
-#: gui/interfacesettings.cpp:37
+#: gui/interfacesettings.cpp:50
 msgid "Medium"
 msgstr "Mittel"
 
-#: gui/interfacesettings.cpp:38
+#: gui/interfacesettings.cpp:51 gui/interfacesettings.cpp:159
 msgid "Large"
 msgstr "Groß"
 
-#: gui/interfacesettings.cpp:39
+#: gui/interfacesettings.cpp:52
 msgid "Extra Large"
 msgstr "Extra groß"
 
-#: gui/interfacesettings.cpp:44
+#: gui/interfacesettings.cpp:57
+msgid "Basic Tree (No Icons)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:58
 msgid "Simple Tree"
 msgstr "Einfacher Dateibaum"
 
-#: gui/interfacesettings.cpp:45
+#: gui/interfacesettings.cpp:59
 msgid "Detailed Tree"
 msgstr "Detaillierter Dateibaum"
 
-#. i18n: file: gui/interfacesettings.ui:329
+#. i18n: file: gui/interfacesettings.ui:449
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:47 po/rc.cpp:528 rc.cpp:528
+#: gui/interfacesettings.cpp:61 po/rc.cpp:639 rc.cpp:639
 msgid "Grouped Albums"
 msgstr "Gruppierte Alben"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:63
 msgid "List"
 msgstr "Liste"
 
-#: gui/interfacesettings.cpp:51
+#: gui/interfacesettings.cpp:65
 msgid "Icon/List"
 msgstr "Symbol/Liste"
 
-#: gui/interfacesettings.cpp:85
-msgid "Grouped by 'Album Artist'"
-msgstr "Gruppiert unter 'Albumkünstler'"
+#. i18n: file: gui/interfacesettings.ui:454
+#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
+#: gui/interfacesettings.cpp:68 po/rc.cpp:642 rc.cpp:642
+msgid "Table"
+msgstr "Tabelle"
 
-#: gui/interfacesettings.cpp:86
-msgid "Grouped under 'Various Artists'"
-msgstr "Gruppiert unter „Verschiedene Künstler“"
+#: gui/interfacesettings.cpp:104
+msgid "Play queue"
+msgstr "Warteschlange"
+
+#. i18n: file: gui/interfacesettings.ui:182
+#. i18n: ectx: attribute (title), widget (QWidget, tab)
+#: gui/interfacesettings.cpp:105 gui/mainwindow.cpp:307 po/rc.cpp:569
+#: rc.cpp:569
+msgid "Artists"
+msgstr "Künstler"
+
+#: gui/interfacesettings.cpp:107 gui/interfacesettings.cpp:138
+#: gui/mainwindow.cpp:309
+msgid "Folders"
+msgstr "Ordner"
+
+#. i18n: file: gui/interfacesettings.ui:337
+#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
+#: gui/interfacesettings.cpp:108 gui/mainwindow.cpp:310 po/rc.cpp:609
+#: rc.cpp:609
+msgid "Playlists"
+msgstr "Wiedergabelisten"
+
+#: gui/interfacesettings.cpp:110
+msgid "Dynamic Playlists"
+msgstr "Dynamische Wiedergabelisten"
+
+#: gui/interfacesettings.cpp:114
+msgid "Streams (e.g. Radio Stations)"
+msgstr "Streams (z. B. Radiostationen)"
+
+#: gui/interfacesettings.cpp:121
+msgid "Online Services - Jamendo, Maganatune, SoundCloud, and Podcasts"
+msgstr ""
+
+#: gui/interfacesettings.cpp:128
+msgid "Devices - UMS, MTP (e.g. Android), and AudioCDs"
+msgstr ""
+
+#: gui/interfacesettings.cpp:134
+msgid "Search (via MPD)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:135
+msgid "Info - Current song information (artist, album, and lyrics)"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: ectx: property (text), widget (BuddyLabel, label)
+#. i18n: file: gui/interfacesettings.ui:281
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
+#. i18n: file: gui/interfacesettings.ui:346
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: gui/interfacesettings.ui:438
+#. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: ectx: property (text), widget (BuddyLabel, label)
+#. i18n: file: gui/interfacesettings.ui:281
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
+#. i18n: file: gui/interfacesettings.ui:346
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: gui/interfacesettings.ui:438
+#. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
+#: gui/interfacesettings.cpp:139 po/rc.cpp:554 po/rc.cpp:572 po/rc.cpp:591
+#: po/rc.cpp:612 po/rc.cpp:636 rc.cpp:554 rc.cpp:572 rc.cpp:591 rc.cpp:612
+#: rc.cpp:636
+msgid "Style:"
+msgstr "Stil:"
+
+#: gui/interfacesettings.cpp:161
+msgid "Tab-bar"
+msgstr ""
+
+#: gui/interfacesettings.cpp:162
+msgid "Left"
+msgstr "Links"
+
+#: gui/interfacesettings.cpp:162
+msgid "Right"
+msgstr "Rechts"
+
+#: gui/interfacesettings.cpp:163
+msgid "Top"
+msgstr "Oben"
 
-#: gui/main.cpp:151 gui/mainwindow.cpp:2007 gui/trayitem.cpp:71
-#: gui/trayitem.cpp:73 gui/trayitem.cpp:108 gui/trayitem.cpp:172
-#: gui/trayitem.cpp:182 gui/trayitem.cpp:185 gui/trayitem.cpp:188
-#: gui/trayitem.cpp:201 gui/trayitem.cpp:203
+#: gui/interfacesettings.cpp:164
+msgid "Bottom"
+msgstr "Unten"
+
+#: gui/interfacesettings.cpp:391
+msgid "System default"
+msgstr "Benutze Systemeinstellung"
+
+#: gui/main.cpp:224 gui/mainwindow.cpp:2075 gui/trayitem.cpp:112
+#: gui/trayitem.cpp:118 gui/trayitem.cpp:153 gui/trayitem.cpp:217
+#: gui/trayitem.cpp:227 gui/trayitem.cpp:230 gui/trayitem.cpp:233
+#: gui/trayitem.cpp:246 gui/trayitem.cpp:248
 msgid "Cantata"
 msgstr "Cantata"
 
-#: gui/main.cpp:152
+#: gui/main.cpp:225
 msgid "A KDE client for MPD"
 msgstr "Ein KDE-Client für MPD"
 
-#: gui/main.cpp:154
-msgid "Copyright (c) 2011-2013 Craig Drummond"
-msgstr "Alle Rechte (c) 2011–2013 Craig Drummond"
+#: gui/main.cpp:227
+msgid "© 2011-2014 Craig Drummond"
+msgstr "Alle Rechte © 2011–2014 Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:231
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:231
 msgid "Maintainer"
 msgstr "Betreuer"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:232
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:232
 msgid "UI Improvements"
 msgstr "Oberflächenverbesserungen"
 
-#: gui/main.cpp:160
+#: gui/main.cpp:233
 msgid "Sander Knopper"
 msgstr "Sander Knopper"
 
-#: gui/main.cpp:160 gui/main.cpp:161 gui/main.cpp:162 gui/main.cpp:163
+#: gui/main.cpp:233 gui/main.cpp:234 gui/main.cpp:235 gui/main.cpp:236
 msgid "QtMPC author"
 msgstr "QtMPC-Autor"
 
-#: gui/main.cpp:161
+#: gui/main.cpp:234
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:162
+#: gui/main.cpp:235
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:163
+#: gui/main.cpp:236
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:237
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:237
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr ""
-"Kontextansicht-Hintergründe (Bitte ziehen Sie in Betracht, ihre Musik-Fan-Art "
-"bei fanart.tv hochzuladen.)"
+"Kontextansicht-Hintergründe (Bitte ziehen Sie in Betracht, ihre Musik-Fan-"
+"Art bei fanart.tv hochzuladen.)"
 
-#: gui/main.cpp:168
+#: gui/main.cpp:238
 msgid "Wikipedia"
 msgstr "Wikipedia"
 
-#: gui/main.cpp:168 gui/main.cpp:169
+#: gui/main.cpp:238 gui/main.cpp:239
 msgid "Context view metadata"
 msgstr "Kontextansicht-Metadaten"
 
-#: gui/main.cpp:173
+#: gui/main.cpp:239
+msgid "Last.fm"
+msgstr "Last.fm"
+
+#: gui/main.cpp:243
 msgid "URL to open"
 msgstr "URL zum Öffnen"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:269
 msgid "Quit"
-msgstr "Ende"
+msgstr "Beenden"
 
-#: gui/mainwindow.cpp:259
+#: gui/mainwindow.cpp:273
 msgid "Show Window"
 msgstr "Zeige Fenster"
 
-#. i18n: file: gui/initialsettingswizard.ui:470
+#. i18n: file: gui/initialsettingswizard.ui:469
 #. i18n: ectx: property (text), widget (QPushButton, connectButton)
-#: gui/mainwindow.cpp:262 po/rc.cpp:407 rc.cpp:407
+#: gui/mainwindow.cpp:276 po/rc.cpp:482 rc.cpp:482
 msgid "Connect"
 msgstr "Verbinde"
 
-#: gui/mainwindow.cpp:263 gui/preferencesdialog.cpp:77
+#: gui/mainwindow.cpp:277 gui/preferencesdialog.cpp:83
 msgid "Collection"
 msgstr "Sammlung"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:278
 msgid "Outputs"
 msgstr "Ausgaben"
 
-#: gui/mainwindow.cpp:265
-msgid "Previous Track"
-msgstr "Vorheriger Titel"
-
-#: gui/mainwindow.cpp:266
-msgid "Next Track"
-msgstr "Nächster Titel"
-
-#: gui/mainwindow.cpp:267
-msgid "Play/Pause"
-msgstr "Abspielen/Pause"
-
-#: gui/mainwindow.cpp:269
-msgid "Stop After Current Track"
-msgstr "Stoppe nach aktuellem Stück"
-
-#: gui/mainwindow.cpp:270
+#: gui/mainwindow.cpp:279 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "Stoppe nach Stück"
 
-#: gui/mainwindow.cpp:271
-msgid "Increase Volume"
-msgstr "Lautstärke anheben"
-
-#: gui/mainwindow.cpp:272
-msgid "Decrease Volume"
-msgstr "Lautstärke verringern"
-
-#: gui/mainwindow.cpp:273
-msgid "Mute"
-msgstr "Stumm"
-
-#: gui/mainwindow.cpp:274
+#: gui/mainwindow.cpp:280
 msgid "Add To Stored Playlist"
 msgstr "Hinzufügen zur gespeicherten Wiedergabeliste"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:281
 msgid "Remove From Play Queue"
 msgstr "Von Warteschlange entfernen"
 
-#: gui/mainwindow.cpp:276
+#: gui/mainwindow.cpp:282
 msgid "Copy Track Info"
 msgstr "Kopiere Titelinformation"
 
-#: gui/mainwindow.cpp:277
+#: gui/mainwindow.cpp:283
 msgid "Crop"
 msgstr "Abschneiden"
 
-#: gui/mainwindow.cpp:278
-msgid "Shuffle"
+#: gui/mainwindow.cpp:284
+msgid "Shuffle Tracks"
+msgstr "Zufällige Reihenfolge"
+
+#: gui/mainwindow.cpp:285
+#, fuzzy
+msgid "Shuffle Albums"
 msgstr "Zufällig anordnen"
 
-#: gui/mainwindow.cpp:279
+#: gui/mainwindow.cpp:286
 msgid "Add Stream URL"
 msgstr "Stream-URL hinzufügen"
 
-#: gui/mainwindow.cpp:280
+#: gui/mainwindow.cpp:287
 msgid "Clear"
 msgstr "Leeren"
 
-#: gui/mainwindow.cpp:281
+#: gui/mainwindow.cpp:288
 msgid "Expanded Interface"
 msgstr "Ansicht erweitern"
 
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:289
 msgid "Show Current Song Information"
 msgstr "Zeige aktuelle Songinformation"
 
-#: gui/mainwindow.cpp:285
+#: gui/mainwindow.cpp:292
 msgid "Full Screen"
 msgstr "Vollbild"
 
-#: gui/mainwindow.cpp:287
+#: gui/mainwindow.cpp:294
 msgid "Random"
 msgstr "Zufall"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:295
 msgid "Repeat"
 msgstr "Wiederholen"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:296
 msgid "Single"
 msgstr "Einzeln"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:296
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
@@ -2138,307 +2302,319 @@ msgstr ""
 "Wenn 'Single' aktiviert ist, wird die Wiedergabe nach dem aktuell "
 "abgespielten Stück gestoppt oder wiederholt, falls 'Repeat' aktiviert ist."
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:297
 msgid "Consume"
 msgstr "Entfernen nach dem Abspielen"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:297
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
 msgstr ""
-"Wenn \"Consume\" aktiviert ist wird ein Stück von der Warteschlange entfernt, "
-"sobald es abgespielt wurde."
+"Wenn \"Consume\" aktiviert ist wird ein Stück von der Warteschlange "
+"entfernt, sobald es abgespielt wurde."
 
-#: gui/mainwindow.cpp:291
-msgid "Search Play Queue"
-msgstr "Suche in Warteschlange"
-
-#: gui/mainwindow.cpp:293
+#: gui/mainwindow.cpp:298
 msgid "Set Priority"
 msgstr "Setze Priorität"
 
-#: gui/mainwindow.cpp:295
+#: gui/mainwindow.cpp:300
 msgid "Play Stream"
 msgstr "Spiele Stream ab"
 
-#: gui/mainwindow.cpp:297
+#: gui/mainwindow.cpp:302
 msgid "Locate In Library"
 msgstr "Finde in Musikbibliothek"
 
-#: gui/mainwindow.cpp:299
+#: gui/mainwindow.cpp:304
 msgid "Edit Song Tags"
 msgstr "Bearbeite Tags"
 
-#. i18n: file: gui/interfacesettings.ui:304
+#. i18n: file: gui/interfacesettings.ui:429
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:301 po/rc.cpp:519 rc.cpp:519
+#: gui/mainwindow.cpp:306 po/rc.cpp:633 rc.cpp:633
 msgid "Play Queue"
-msgstr "Spiele Warteschlange ab"
-
-#. i18n: file: gui/interfacesettings.ui:27
-#. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:302 po/rc.cpp:455 rc.cpp:455
-msgid "Artists"
-msgstr "Künstler"
-
-#: gui/mainwindow.cpp:304
-msgid "Folders"
-msgstr "Ordner"
-
-#. i18n: file: gui/interfacesettings.ui:202
-#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
-#: gui/mainwindow.cpp:305 po/rc.cpp:495 rc.cpp:495
-msgid "Playlists"
-msgstr "Wiedergabelisten"
+msgstr "Warteschlange"
 
-#: gui/mainwindow.cpp:306
+#: gui/mainwindow.cpp:312
 msgid "Dynamic"
 msgstr "Dynamisch"
 
-#: gui/mainwindow.cpp:308
+#: gui/mainwindow.cpp:315 gui/preferencesdialog.cpp:89
+#: widgets/groupedview.cpp:251
+msgid "Streams"
+msgstr "Streams"
+
+#: gui/mainwindow.cpp:318 gui/preferencesdialog.cpp:94
 msgid "Online"
 msgstr "Online"
 
-#: gui/mainwindow.cpp:310
+#: gui/mainwindow.cpp:321
 msgid "Devices"
 msgstr "Geräte"
 
-#: gui/mainwindow.cpp:312
+#: gui/mainwindow.cpp:324
 msgid "Expand All"
 msgstr "Alles erweitern"
 
-#: gui/mainwindow.cpp:313
+#: gui/mainwindow.cpp:325
 msgid "Collapse All"
 msgstr "Alles einklappen"
 
-#: gui/mainwindow.cpp:428
+#: gui/mainwindow.cpp:326
+#, fuzzy
+msgid "Remove All Songs"
+msgstr "Entferne Wiedergabelisten?"
+
+#: gui/mainwindow.cpp:456
 msgid "Info"
 msgstr "Information"
 
-#: gui/mainwindow.cpp:435
-msgid "Auto Hide"
-msgstr "Automatisches Verbergen"
-
-#: gui/mainwindow.cpp:441
-msgid "Monochrome Icons"
-msgstr "Monochrome Symbole"
-
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:585
 msgid "Server information..."
-msgstr "Serverinformation..."
+msgstr "Serverinformationen ..."
 
-#: gui/mainwindow.cpp:585
+#: gui/mainwindow.cpp:588
+msgid "Refresh Database"
+msgstr "Aktualisiere Datenbank"
+
+#: gui/mainwindow.cpp:602
 msgid "Configure Cantata..."
 msgstr "Cantata einrichten..."
 
-#: gui/mainwindow.cpp:589
+#: gui/mainwindow.cpp:612
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "Über Cantata"
 
-#: gui/mainwindow.cpp:599
+#: gui/mainwindow.cpp:624
 msgid "&File"
 msgstr "&Datei"
 
-#: gui/mainwindow.cpp:602
+#: gui/mainwindow.cpp:628
+msgid "&Edit"
+msgstr "&Bearbeiten"
+
+#: gui/mainwindow.cpp:631
 msgid "&Settings"
 msgstr "&Einstellungen"
 
-#: gui/mainwindow.cpp:617 support/dialog.cpp:97
+#: gui/mainwindow.cpp:646 support/dialog.cpp:81
 msgid "&Help"
 msgstr "&Hilfe"
 
-#: gui/mainwindow.cpp:980
+#: gui/mainwindow.cpp:1035
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
 "Keine Stücke gefunden, welche auf den dynamischen Regeln der Wiedergabeliste "
 "entsprechen."
 
-#: gui/mainwindow.cpp:1101 mpd/mpdconnection.cpp:356
+#: gui/mainwindow.cpp:1157 mpd/mpdconnection.cpp:401
 msgid "Connecting to %1"
 msgstr "Verbinde zu %1"
 
-#: gui/mainwindow.cpp:1461
+#: gui/mainwindow.cpp:1189
+msgid "Refresh MPD Database?"
+msgstr "Die MPD-Datenbank aktualisieren?"
+
+#: gui/mainwindow.cpp:1257
+msgid ""
+"Podcasts are currently being downloaded\n"
+"\n"
+"Quiting now will abort all downloads."
+msgstr ""
+
+#: gui/mainwindow.cpp:1258
+msgid "Abort downloads and quit"
+msgstr ""
+
+#: gui/mainwindow.cpp:1577
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "Über Cantata"
 
-#: gui/mainwindow.cpp:1462
+#: gui/mainwindow.cpp:1578
 msgctxt "Qt-only"
 msgid ""
-"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html"
-"\">GPLv3</a>"
+"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl."
+"html\">GPLv3</a>"
 msgstr ""
-"<b>Cantata %1</b><br/><br/>MPD-Client.<br/><br/>(c) Craig Drummond 2011–2013."
-"<br/>Veröffentlicht unter der <a href=\"http://www.gnu.org/licenses/gpl.html"
-"\">GPLv3</a>"
+"<b>Cantata %1</b><br/><br/>MPD-Client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Veröffentlicht unter der <a href=\"http://www.gnu.org/licenses/"
+"gpl.html\">GPLv3</a>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1580
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
-"QtMPC Authors<br/>"
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"The QtMPC Authors<br/>"
 msgstr ""
-"Basierend auf <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> – (c) 2007–2010 "
-"Die "
-"QtMPC Authoren<br/>"
+"Basierend auf <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> – © 2007–"
+"2010 Die QtMPC Authoren<br/>"
 
-#: gui/mainwindow.cpp:1466
+#: gui/mainwindow.cpp:1581
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 msgstr ""
-"Kontextansicht-Hintergründe mit freundlicher Genehmigung von <a "
-"href=\"http://www.fanart.tv\">FanArt."
-"tv</a>"
+"Kontextansicht-Hintergründe mit freundlicher Genehmigung von <a href="
+"\"http://www.fanart.tv\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1467
+#: gui/mainwindow.cpp:1582
 msgctxt "Qt-only"
 msgid ""
 "Context view metadata courtesy of <a href=\"http://www.wikipedia.org"
 "\">Wikipedia</a> and <a href=\"http://www.last.fm\">Last.fm</a>"
 msgstr ""
-"Kontextansicht-Hintergründe mit freundlicher Genehmigung von<a "
-"href=\"http://www.wikipedia.org"
-"\">Wikipedia</a> und <a href=\"http://www.last.fm\">Last.fm</a>"
+"Kontextansicht-Hintergründe mit freundlicher Genehmigung von<a href=\"http://"
+"www.wikipedia.org\">Wikipedia</a> und <a href=\"http://www.last.fm\">Last."
+"fm</a>"
 
-#: gui/mainwindow.cpp:1468
+#: gui/mainwindow.cpp:1583
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 msgstr ""
-"Bitte laden Sie ihren eigenen Content zu fan-art herauf <a href=\"http://www."
-"fanart.tv\">FanArt.tv</a>"
+"Bitte laden Sie ihren eigenen Content zu <a href=\"http://www."
+"fanart.tv\">FanArt.tv</a> hoch."
 
-#: gui/mainwindow.cpp:1479
+#: gui/mainwindow.cpp:1594
+#, fuzzy
 msgid ""
-"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Uptime:</td><td>%4</td></"
-"tr><tr><td align=\"right\">Time playing:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right"
+"\">Protocol version: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Uptime: </td><td>%4</td></tr><tr><td align=\"right"
+"\">Time playing: </td><td>%5</td></tr>"
 msgstr ""
 "<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
 "</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Uptime:</td><td>%4</td></"
 "tr><tr><td align=\"right\">Zeit gespielt:</td><td>%5</td></tr>"
 
-#: gui/mainwindow.cpp:1487
+#: gui/mainwindow.cpp:1602
 msgid ""
 "<tr><td colspan=\"2\"><b>Database</b></td></tr><tr><td align=\"right"
-"\">Artists:</td><td>%1</td></tr><tr><td align=\"right\">Albums:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Songs:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL handlers:</td><td>%4</td></tr><tr><td align=\"right\">Total "
-"duration:</td><td>%5</td></tr><tr><td align=\"right\">Last update:</td><td>"
-"%6</td></tr></table></p>"
+"\">Artists: </td><td>%1</td></tr><tr><td align=\"right\">Albums: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Songs: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Total duration: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Last update: </td><td>%6</td></tr></"
+"table></p>"
 msgstr ""
 "<tr><td colspan=\"2\"><b>Datenbank</b></td></tr><tr><td align=\"right"
-"\">Künstler:</td><td>%1</td></tr><tr><td align=\"right\">Alben:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Songs:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL handlers:</td><td>%4</td></tr><tr><td align=\"right\">Gesamte "
-"Laufzeit:</td><td>%5</td></tr><tr><td align=\"right\">Letzte Aktualisierung:<"
-"/td><td>"
-"%6</td></tr></table></p>"
-
-#: gui/mainwindow.cpp:1496
+"\">Künstler: </td><td>%1</td></tr><tr><td align=\"right\">Alben: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Stücke: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL-Handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Gesamte Dauer: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Letzte Aktualisierung: </td><td>%6</td><"
+"/tr></"
+"table></p>"
+
+#: gui/mainwindow.cpp:1611
 msgid "Server Information"
-msgstr "Serverinformation"
+msgstr "Serverinformationen"
 
-#: gui/mainwindow.cpp:1743 gui/mainwindow.cpp:1750
+#: gui/mainwindow.cpp:1859 gui/mainwindow.cpp:1866
 msgid "Cantata (%1)"
 msgstr "Cantata (%1)"
 
-#: gui/mainwindow.cpp:1746 gui/mainwindow.cpp:1753
+#: gui/mainwindow.cpp:1862 gui/mainwindow.cpp:1869
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 – Cantata (%2)"
 
-#: gui/mainwindow.cpp:1747 gui/mainwindow.cpp:1754
+#: gui/mainwindow.cpp:1863 gui/mainwindow.cpp:1870
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 – Cantata"
 
-#: gui/mainwindow.cpp:1758
+#: gui/mainwindow.cpp:1874
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 – %2 – Cantata (%3)"
 
-#: gui/mainwindow.cpp:1760
+#: gui/mainwindow.cpp:1876
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 – %2 – Cantata"
 
-#: gui/mainwindow.cpp:1805
+#: gui/mainwindow.cpp:1919
 msgid "(Stream)"
 msgstr "(Stream)"
 
-#: gui/mainwindow.cpp:1807
+#: gui/mainwindow.cpp:1921
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1825 widgets/groupedview.cpp:268
+#: gui/mainwindow.cpp:1939 widgets/groupedview.cpp:278
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 – %2"
 
-#: gui/mainwindow.cpp:1921 gui/mainwindow.cpp:1922
-msgid "Volume Disabled"
-msgstr "Lautstärke nicht einstellbar"
-
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1% (Muted)"
-msgstr "Lautstärke %1% (Stumm)"
+#: gui/mainwindow.cpp:1989 mpd/mpdconnection.cpp:543 mpd/mpdconnection.cpp:550
+msgid "MPD reported the following error: %1"
+msgstr ""
 
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1%"
-msgstr "Lautstärke %1%"
+#: gui/mainwindow.cpp:2119
+#, fuzzy
+msgid "Remove all songs from play queue?"
+msgstr "Von Warteschlange entfernen"
 
-#: gui/mainwindow.cpp:2119 models/playqueuemodel.cpp:110
+#: gui/mainwindow.cpp:2210 models/playqueuemodel.cpp:113
 msgid "Priority"
 msgstr "Priorität"
 
-#: gui/mainwindow.cpp:2119
+#: gui/mainwindow.cpp:2210
 msgid "Enter priority (0..255):"
 msgstr "Eingabe der Priorität (0..255)"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Playlist Name"
 msgstr "Name der Wiedergabeliste"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Enter a name for the playlist:"
 msgstr "Bitte einen Namen für die Wiedergabeliste angeben"
 
-#: gui/mainwindow.cpp:2145
+#: gui/mainwindow.cpp:2236
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr ""
 "Eine Wiedergabeliste mit Namen <b>%1</b>existiert bereits.<br/> Zur "
 "Wiedergabeliste hinzufügen?"
 
-#: gui/mainwindow.cpp:2146
+#: gui/mainwindow.cpp:2237
 msgid "Existing Playlist"
 msgstr "Wiedergabeliste existiert bereits"
 
-#: gui/playbacksettings.cpp:42
-msgid "Do not fadeout"
-msgstr "Nicht Ausblenden"
+#: gui/mainwindow.cpp:2303
+msgid "Stream URL"
+msgstr "Stream-URL"
 
-#: gui/playbacksettings.cpp:43
-msgid " ms"
-msgstr " ms"
+#: gui/mainwindow.cpp:2303
+msgid "Enter URL of stream:"
+msgstr ""
+
+#: gui/mainwindow.cpp:2306
+msgid "Invalid, or unsupported, URL!"
+msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:152
+#: gui/mainwindow.cpp:2889
+msgid "Can only edit tags of songs within MPD's music collection."
+msgstr ""
+
+#. i18n: file: devices/albumdetails.ui:158
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
-#: gui/playbacksettings.cpp:49 po/rc.cpp:76 widgets/playqueueview.cpp:174
-#: rc.cpp:76
+#: gui/playbacksettings.cpp:47 models/playqueuemodel.cpp:108 po/rc.cpp:110
+#: rc.cpp:110
 msgid "Track"
 msgstr "Stück"
 
-#: gui/playbacksettings.cpp:51
+#: gui/playbacksettings.cpp:49
 msgid "Auto"
 msgstr "Automatisch"
 
-#: gui/playbacksettings.cpp:143
+#: gui/playbacksettings.cpp:161
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
@@ -2446,17 +2622,17 @@ msgstr ""
 "<i>Verbindung zu %1<br/>Die unten angezeigten Einträge beziehen sich auf die "
 "aktuelle MPD-Instanz.</i>"
 
-#. i18n: file: gui/playbacksettings.ui:26
+#. i18n: file: gui/playbacksettings.ui:114
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:146 po/rc.cpp:582 rc.cpp:582
+#: gui/playbacksettings.cpp:164 po/rc.cpp:769 rc.cpp:769
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
 msgstr ""
-"<i>Nicht verbunden.<br/>Einige Einträge können nicht bearbeitet "
-"werden solange Cantata nicht mit MPD verbunden wird.</i>"
+"<i>Nicht verbunden.<br/>Einige Einträge können nicht bearbeitet werden "
+"solange Cantata nicht mit MPD verbunden wird.</i>"
 
-#: gui/playbacksettings.cpp:153
+#: gui/playbacksettings.cpp:171
 msgid ""
 "<p>Replay Gain is a proposed standard published in 2001 to normalize the "
 "perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It "
@@ -2466,28 +2642,35 @@ msgid ""
 "Volume will be adjusted using the track's ReplayGain tags.</li><li><i>Album</"
 "i> - Volume will be adjusted using the albums's ReplayGain tags.</"
 "li><li><i>Auto</i> - Volume will be adjusted using the track's ReplayGain "
-"tags if random play is actived, otherwise the album's tags will be used.</"
+"tags if random play is activated, otherwise the album's tags will be used.</"
 "li></ul></p>"
 msgstr ""
-"<p>Replay Gain ist ein vorgeschlagener Standard aus dem Jahr 2001, "
-"zur Normalisierung der wahrgenommene Lautstärke von Computer-Audio-Formaten "
-"wie MP3 und Ogg Vorbis. Sie arbeitet auf auf Basis von Track und Album "
-"und wird nun in einer wachsenden Anzahl von unterstützten"
-"Abspieler unterstützt.</p><p>Die folgenden Einstellungen können gewählt "
-"werden:"
-"<ul><li><i>Nichts</i> – Kein ReplayGain wird hinzugefügt.</li><li><i>Stück</i>"
-" – "
-"Lautstärke wird eingestellt auf das Stück.</li><li><i>Album</"
-"i> – Lautstärke wird eingestellt auf das Album.</"
-"li><li><i>Auto</i> – Lautstärke wird eingestellt auf das Stück, wenn die "
-"zufällige Wiedergabe eingestellt ist. Sonst wird auf Album eingestellt.</"
-"li></ul></p>"
+"<p>Replay Gain ist ein vorgeschlagener Standard aus dem Jahr 2001, zur "
+"Normalisierung der wahrgenommene Lautstärke von Computer-Audio-Formaten wie "
+"MP3 und Ogg Vorbis. Sie arbeitet auf auf Basis von Track und Album und wird "
+"nun in einer wachsenden Anzahl von Playern unterstützt.</"
+"p><p>Die folgenden Einstellungen können gewählt werden:<ul><li><i>Keine</i> "
+"– ReplayGain wird nicht hinzugefügt.</li><li><i>Stück</i> – Lautstärke wird "
+"eingestellt auf das Stück.</li><li><i>Album</i> – Lautstärke wird "
+"eingestellt auf das Album.</li><li><i>Automatisch</i> – Lautstärke wird auf "
+"das Stück eingestellt, wenn die zufällige Wiedergabe eingestellt ist. Sonst "
+"wird auf "
+"Album eingestellt.</li></ul></p>"
+
+#: gui/playlistspage.cpp:95 widgets/playqueueview.cpp:160
+msgid "Stretch Columns To Fit Window"
+msgstr ""
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:759 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:146 tags/tageditor.cpp:828 tags/trackorganiser.cpp:72
 msgid "Rename"
 msgstr "Umbenennen"
 
-#: gui/playlistspage.cpp:186
+#: gui/playlistspage.cpp:147 models/playqueuemodel.cpp:156
+#, fuzzy
+msgid "Remove Duplicates"
+msgstr "Entferne Wiedergabelisten?"
+
+#: gui/playlistspage.cpp:309
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2495,107 +2678,178 @@ msgstr ""
 "Sind Sie sicher, dass Sie die gewählte Wiedergabeliste entfernen möchten?\n"
 "Dies kann nicht rückgängig gemacht werden."
 
-#: gui/playlistspage.cpp:187
+#: gui/playlistspage.cpp:310
 msgid "Remove Playlists"
 msgstr "Entferne Wiedergabelisten?"
 
-#: gui/playlistspage.cpp:207 gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:330 gui/playlistspage.cpp:357
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr ""
-"Eine Wiedergabeliste mit Namen <b>%1</b>existiert bereits.<br/> Überschreiben?"
+"Eine Wiedergabeliste mit Namen <b>%1</b>existiert bereits.<br/> "
+"Überschreiben?"
 
-#: gui/playlistspage.cpp:208 gui/playlistspage.cpp:231
+#: gui/playlistspage.cpp:331 gui/playlistspage.cpp:358
 msgid "Overwrite Playlist"
 msgstr "Wiedergabeliste überschreiben?"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:353
 msgid "Rename Playlist"
 msgstr "Wiedergabeliste umbenennen"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:353
 msgid "Enter new name for playlist:"
 msgstr "Bitte neuen Namen für die Wiedergabeliste angeben:"
 
-#: gui/preferencesdialog.cpp:77
+#: gui/playlistspage.cpp:446
+msgid "Cannot add songs from '%1' to '%2'"
+msgstr ""
+
+#: gui/preferencesdialog.cpp:83
 msgid "Collection Settings"
 msgstr "Einstellungen zur Sammlung"
 
-#: gui/preferencesdialog.cpp:78
+#. i18n: file: gui/playbacksettings.ui:29
+#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
+#: gui/preferencesdialog.cpp:84 po/rc.cpp:742 rc.cpp:742
 msgid "Playback"
 msgstr "Wiedergabe"
 
-#: gui/preferencesdialog.cpp:78
+#: gui/preferencesdialog.cpp:84
 msgid "Playback Settings"
 msgstr "Wiedergabeeinstellungen"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:85
 msgid "Files"
 msgstr "Dateien"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:85
 msgid "File Settings"
 msgstr "Dateieinstellungen"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:86
 msgid "Interface"
 msgstr "Oberfläche"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:86
 msgid "Interface Settings"
 msgstr "Einstellungen zur Oberfläche"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:89
+#, fuzzy
+msgid "Streams Settings"
+msgstr "Einstellungen der externen Funktionen"
+
+#: gui/preferencesdialog.cpp:94
+#, fuzzy
+msgid "Online Providers"
+msgstr "Textanbieter"
+
+#: gui/preferencesdialog.cpp:97
 msgid "Context"
 msgstr "Kontext"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:97
 msgid "Context View Settings"
 msgstr "Einstellungen zur Kontextansicht"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server"
 msgstr "HTTP-Server"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server Settings"
 msgstr "HTTP-Server-Einstellungen"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:115
 msgid "Audio CD Settings"
 msgstr "Audio-CD-Einstellungen"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:120
 msgid "Proxy"
 msgstr "Proxy"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:120
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "Proxyeinstellungen"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "Tastaturkürzel"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "Tastaturkürzel-Einstellungen"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:127
 msgid "Cache"
 msgstr "Zwischenspeicher"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:127
 msgid "Cached Items"
 msgstr "Zwischengespeicherte Daten"
 
-#: gui/preferencesdialog.cpp:118
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#: gui/preferencesdialog.cpp:128 po/rc.cpp:53 po/rc.cpp:65 po/rc.cpp:410
+#: rc.cpp:53 rc.cpp:65 rc.cpp:410
 msgid "Configure"
 msgstr "Einstellungen"
 
-#: gui/serversettings.cpp:75
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#: gui/searchpage.cpp:200 po/rc.cpp:89 po/rc.cpp:371 po/rc.cpp:950 rc.cpp:89
+#: rc.cpp:371 rc.cpp:950
+msgid "Composer:"
+msgstr ""
+
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#: gui/searchpage.cpp:205 po/rc.cpp:95 po/rc.cpp:962 rc.cpp:95 rc.cpp:962
+msgid "Genre:"
+msgstr "Genre:"
+
+#: gui/searchpage.cpp:206
+msgid "Date:"
+msgstr "Datum:"
+
+#: gui/searchpage.cpp:208
+msgid "Any:"
+msgstr ""
+
+#: gui/searchpage.cpp:215
+msgid "No tracks found."
+msgstr "Keine Texte gefunden."
+
+#: gui/serversettings.cpp:87
 msgid ""
 "<i> This folder will also be used to locate music files for transferring to "
 "(and from) devices.</i>"
@@ -2603,7 +2857,7 @@ msgstr ""
 "<i> Dieser Ordner wird verwendet für Musik-Dateien zur Übertragung zum und "
 "vom Gerät.</i>"
 
-#: gui/serversettings.cpp:88
+#: gui/serversettings.cpp:100
 msgid "Not used"
 msgstr "Nicht benutzt"
 
@@ -2619,12 +2873,12 @@ msgstr "Nicht benutzt"
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
-#: gui/serversettings.cpp:91 po/rc.cpp:202 po/rc.cpp:241 po/rc.cpp:688
-#: rc.cpp:202 rc.cpp:241 rc.cpp:688
+#: gui/serversettings.cpp:103 po/rc.cpp:269 po/rc.cpp:308 po/rc.cpp:857
+#: rc.cpp:269 rc.cpp:308 rc.cpp:857
 msgid "Host:"
 msgstr "Host:"
 
-#: gui/serversettings.cpp:94
+#: gui/serversettings.cpp:106
 msgctxt "Qt-only, windows"
 msgid ""
 "<i><b>NOTE:</b> 'Dynamizer port' is only relevant if you wish to make use of "
@@ -2634,13 +2888,12 @@ msgid ""
 "service.</i>"
 msgstr ""
 "<i><b>Hinweis:</b> Der 'Dynamizer port' ist nur relevant, wenn Sie "
-"'dynamische Wiedergabelisten' benutzen wollen. "
-"Um die  <code>cantata-dynamic</code> Funktion "
-"zu benutzen <b>muss</b> diese bereits auf der aktuellen MPD Instanz "
-"installiert und gestartet sein."
-"Cantata kann diesen Dienst nicht von sich aus starten oder stoppen.</i>"
+"'dynamische Wiedergabelisten' benutzen wollen. Um die  <code>cantata-"
+"dynamic</code> Funktion zu benutzen <b>muss</b> diese bereits auf der "
+"aktuellen MPD Instanz installiert und gestartet sein.Cantata kann diesen "
+"Dienst nicht von sich aus starten oder stoppen.</i>"
 
-#: gui/serversettings.cpp:100
+#: gui/serversettings.cpp:112
 msgid ""
 "<i><b>NOTE:</b> 'Dynamizer port' is only relevant if you wish to use a "
 "system-wide, or non-local, instance of the Cantata dynamizer. For this to "
@@ -2650,16 +2903,15 @@ msgid ""
 "then Cantata will use a per-user instance of the dynamizer to facilitate "
 "dynamic playlists.</i>"
 msgstr ""
-"<i><b>Hinweis:</b> 'Dynamizer port' ist nur relevant, wenn Sie "
-"'dynamische Wiedergabelisten' systemweit und nicht lokal benutzen wollen. "
-"Um die <code>cantata-dynamic</code> Funktion zu benutzen, <b>muss</b> diese "
-"bereits "
-"auf der aktuellen MPD Instanz installiert und gestartet sein. "
-"Cantata kann diesen Dienst nicht von sich aus starten oder stoppen. "
-"Ist dies nicht systemweit gesetzt wird Cantata eine neue Benutzerinstanz für "
-"den Dynamizer benutzen.</i>"
-
-#: gui/serversettings.cpp:109
+"<i><b>Hinweis:</b> 'Dynamizer port' ist nur relevant, wenn Sie 'dynamische "
+"Wiedergabelisten' systemweit und nicht lokal benutzen wollen. Um die "
+"<code>cantata-dynamic</code> Funktion zu benutzen, <b>muss</b> diese bereits "
+"auf der aktuellen MPD Instanz installiert und gestartet sein. Cantata kann "
+"diesen Dienst nicht von sich aus starten oder stoppen. Ist dies nicht "
+"systemweit gesetzt wird Cantata eine neue Benutzerinstanz für den Dynamizer "
+"benutzen.</i>"
+
+#: gui/serversettings.cpp:121
 msgid ""
 "<p>Filename (without extension) to save downloaded covers as.<br/>If left "
 "blank 'cover' will be used.<br/><br/><i>%artist% will be replaced with album "
@@ -2667,193 +2919,257 @@ msgid ""
 "</i></p>"
 msgstr ""
 "<p>Dateiname (ohne Endung) zum Speichern der Cover.<br/>Sollte der Dateiname "
-"leer "
-"sein wird 'cover' benutzt<br/><br/><i>%artist% wird ersetzt durch den "
-"Albumkünstler des "
-"aktuellen Stückes und %album% wird ersetzt durch den Albumnamen."
-"</i></p>"
+"leer sein wird 'cover' benutzt<br/><br/><i>%artist% wird ersetzt durch den "
+"Albumkünstler des aktuellen Stückes und %album% wird ersetzt durch den "
+"Albumnamen.</i></p>"
 
-#: gui/serversettings.cpp:230
+#: gui/serversettings.cpp:257
 msgid ""
 "Which type of collection do you wish to connect to?<br/><ul><li>Standard - "
 "music collection may be shared, is on another machine, or is already setup</"
 "li><li>Basic - music collection is not shared with others, and Cantata will "
 "configure and control the MPD instance</li></ul>"
 msgstr ""
-"Zu welcher Art von Sammlung möchten Sie sich verbinden?<br/><li> Standard: <"
-"br>Musiksammlung kann geteilt werden, ist auf einem anderen Rechner, oder ist "
-"bereits eingerichtet. </"
-"li><li> Einfach: <br>Musiksammlung ist nicht mit anderen geteilt und Cantata "
-"wird Konfiguration und Steuerung der MPD-Instanz übernehmen.</ li></ ul>"
+"Zu welcher Art von Sammlung möchten Sie sich verbinden?<br/><li> Standard: "
+"<br>Musiksammlung kann geteilt werden, ist auf einem anderen Rechner, oder "
+"ist bereits eingerichtet. </li><li> Einfach: <br>Musiksammlung ist nicht mit "
+"anderen geteilt und Cantata wird Konfiguration und Steuerung der MPD-Instanz "
+"übernehmen.</ li></ ul>"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:260
 msgid "Add Collection"
 msgstr "Füge Sammlung hinzu"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:260
 msgid "Standard"
 msgstr "Standard"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:260
 msgid "Basic"
 msgstr "Einfach"
 
-#: gui/serversettings.cpp:264
+#: gui/serversettings.cpp:302
 msgid "Delete <b>%1</b>?"
 msgstr "Lösche <b>%1</b>?"
 
-#: gui/serversettings.cpp:265
+#: gui/serversettings.cpp:303
 msgid "Delete"
 msgstr "Lösche"
 
-#: gui/serversettings.cpp:303
+#: gui/serversettings.cpp:341
 msgid "New Collection %1"
 msgstr "Neue Sammlung %1"
 
-#: gui/serversettings.cpp:319 mpd/mpdconnection.cpp:145
+#: gui/serversettings.cpp:357 mpd/mpdconnection.cpp:173
 msgid "Default"
 msgstr "Voreinstellung"
 
+#: gui/shortcutssettingspage.cpp:76
+msgid "Multi-Media Keys"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:82
+msgid "Do not use media keys to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:83 gui/shortcutssettingspage.cpp:97
+msgid "Use media keys to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:86 gui/shortcutssettingspage.cpp:104
+msgid "Use media keys, as configured in desktop settings, to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:87 gui/shortcutssettingspage.cpp:105
+msgid ""
+"Use media keys, as configured in GNOME/Unity settings, to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:90 gui/shortcutssettingspage.cpp:107
+#: online/onlineservicespage.cpp:99 streams/streamspage.cpp:99
+#: support/fancytabwidget.cpp:825
+msgid "Configure..."
+msgstr "Einstellungen…"
+
 #: gui/stdactions.cpp:55
+msgid "Previous Track"
+msgstr "Vorheriges Stück"
+
+#: gui/stdactions.cpp:56
+msgid "Next Track"
+msgstr "Nächstes Stück"
+
+#: gui/stdactions.cpp:57
+msgid "Play/Pause"
+msgstr "Abspielen/Pause"
+
+#: gui/stdactions.cpp:59
+msgid "Stop After Current Track"
+msgstr "Stoppe nach aktuellem Stück"
+
+#: gui/stdactions.cpp:61
+msgid "Increase Volume"
+msgstr "Lautstärke anheben"
+
+#: gui/stdactions.cpp:62
+msgid "Decrease Volume"
+msgstr "Lautstärke verringern"
+
+#: gui/stdactions.cpp:63
 msgid "Save As"
 msgstr "Speichern unter"
 
-#: gui/stdactions.cpp:56
+#: gui/stdactions.cpp:64
 msgid "Add To Play Queue"
 msgstr "In Warteschlange einreihen"
 
-#: gui/stdactions.cpp:57
+#: gui/stdactions.cpp:65
+msgid "Add Albums In Random Order"
+msgstr ""
+
+#: gui/stdactions.cpp:66
 msgid "Replace Play Queue"
 msgstr "Warteschlange ersetzen"
 
-#: gui/stdactions.cpp:58
+#: gui/stdactions.cpp:67
 msgid "Add With Priority"
 msgstr "Hinzufügen mit Priorität"
 
-#: gui/stdactions.cpp:59
+#: gui/stdactions.cpp:68
 msgid "Highest Priority (255)"
 msgstr "Höchste Priorität (255)"
 
-#: gui/stdactions.cpp:60
+#: gui/stdactions.cpp:69
 msgid "High Priority (200)"
 msgstr "Hohe Priorität (200)"
 
-#: gui/stdactions.cpp:61
+#: gui/stdactions.cpp:70
 msgid "Medium Priority (125)"
 msgstr "Mittlere Priorität (125)"
 
-#: gui/stdactions.cpp:62
+#: gui/stdactions.cpp:71
 msgid "Low Priority (50)"
 msgstr "Niedrige Priorität (50)"
 
-#: gui/stdactions.cpp:63
+#: gui/stdactions.cpp:72
 msgid "Default Priority (0)"
 msgstr "Normale Priorität (0)"
 
-#: gui/stdactions.cpp:64
+#: gui/stdactions.cpp:73
 msgid "Custom Priority..."
 msgstr "Angepasste Priorität"
 
-#: gui/stdactions.cpp:65
+#: gui/stdactions.cpp:74
 msgid "Add To Playlist"
 msgstr "Zur Wiedergabeliste hinzufügen"
 
-#: gui/stdactions.cpp:67 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:66
 msgid "Organize Files"
 msgstr "Dateien organisieren"
 
-#: gui/stdactions.cpp:68
+#: gui/stdactions.cpp:77
 msgid "Edit Tags"
 msgstr "Bearbeite Tags"
 
-#: gui/stdactions.cpp:71 replaygain/rgdialog.cpp:115
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:106
 msgid "ReplayGain"
 msgstr "ReplayGain"
 
-#: gui/stdactions.cpp:74
+#: gui/stdactions.cpp:83
 msgid "Copy Songs To Device"
 msgstr "Kopiere Stücke auf Gerät"
 
-#: gui/stdactions.cpp:78
+#: gui/stdactions.cpp:87
 msgid "Set Image"
 msgstr "Setze Bild"
 
-#: gui/stdactions.cpp:79
-msgid "Refresh Database"
-msgstr "Aktualisiere Datenbank"
-
-#: gui/stdactions.cpp:80
+#: gui/stdactions.cpp:88
 msgid "Back"
 msgstr "Zurück"
 
-#: gui/trayitem.cpp:165
+#: gui/stdactions.cpp:91
+msgid "Find"
+msgstr ""
+
+#: gui/trayitem.cpp:210
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%1 auf %2"
 
-#: gui/trayitem.cpp:166
+#: gui/trayitem.cpp:211
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%1 auf %2 (%3)"
 
-#: gui/trayitem.cpp:168
+#: gui/trayitem.cpp:213
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%1 vom %2 auf %3"
 
-#: gui/trayitem.cpp:169
+#: gui/trayitem.cpp:214
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr "%1 von %2 auf %3 (%4)"
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:241
 msgid "Now playing"
 msgstr "Spiele jetzt"
 
-#: http/httpserversettings.cpp:40
+#: http/httpserversettings.cpp:39
 #, fuzzy
 msgid "Local loopback (%1)"
 msgstr "Local loopback (%1)"
 
-#: http/httpserversettings.cpp:43
+#: http/httpserversettings.cpp:42
 #, fuzzy
 msgid "Wired (%1)"
 msgstr "Wired (%1)"
 
-#: http/httpserversettings.cpp:46
+#: http/httpserversettings.cpp:45
 #, fuzzy
 msgid "Wireless (%1)"
 msgstr "Wireless (%1)"
 
-#: http/httpserversettings.cpp:53
+#: http/httpserversettings.cpp:52
 msgid "First active interface"
 msgstr "Erstes aktives Interface"
 
-#: http/httpserversettings.cpp:98
-msgid "Inactive"
-msgstr "Inaktiv"
+#: models/albumsmodel.cpp:260 models/musicmodel.cpp:254
+msgctxt "Album by Artist"
+msgid "%1 by %2"
+msgstr "%1 von %2"
+
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:221
+#: models/musicmodel.cpp:133
+msgid "Cue Sheet"
+msgstr "Cue Sheet"
+
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:220
+#: models/musicmodel.cpp:133
+msgid "Playlist"
+msgstr "Playlist"
 
-#: models/devicesmodel.cpp:108
+#: models/devicesmodel.cpp:116
 msgid "Configure Device"
 msgstr "Geräteeinstellungen"
 
-#: models/devicesmodel.cpp:109
+#: models/devicesmodel.cpp:117
 msgid "Refresh Device"
 msgstr "Aktualisiere Gerät"
 
-#: models/devicesmodel.cpp:110
+#: models/devicesmodel.cpp:118
 msgid "Connect Device"
 msgstr "Mit Gerät verbinden"
 
-#: models/devicesmodel.cpp:111
+#: models/devicesmodel.cpp:119
 msgid "Disconnect Device"
 msgstr "Vom Gerät trennen"
 
-#: models/devicesmodel.cpp:113
+#: models/devicesmodel.cpp:121
 msgid "Edit CD Details"
 msgstr "Bearbeite CD-Details"
 
-#: models/devicesmodel.cpp:687
+#: models/devicesmodel.cpp:730
 msgid "No Devices Attached"
 msgstr "Keine Geräte verbunden"
 
@@ -2865,224 +3181,258 @@ msgstr "Nicht eingeloggt"
 msgid "Logged in"
 msgstr "Eingeloggt"
 
-#: models/digitallyimported.cpp:184 models/digitallyimported.cpp:206
+#: models/digitallyimported.cpp:185 models/digitallyimported.cpp:211
 msgid "Unknown error"
 msgstr "Unbekannter Fehler"
 
-#: models/digitallyimported.cpp:193
+#: models/digitallyimported.cpp:198
 msgid "No subscriptions"
 msgstr "Keine Abonnements"
 
-#: models/digitallyimported.cpp:200
+#: models/digitallyimported.cpp:205
 msgid "You do not have an active subscription"
 msgstr "Sie haben noch ein aktives Abonnement"
 
-#: models/digitallyimported.cpp:219
+#: models/digitallyimported.cpp:224
 msgid "Logged in (expiry:%1)"
 msgstr "Eingeloggt seit (expiry:%1)"
 
-#: models/digitallyimported.cpp:227
+#: models/digitallyimported.cpp:232
 msgid "Session expired"
 msgstr "Sitzung abgelaufen"
 
-#: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:560
+#: models/dirviewmodel.cpp:204 models/dirviewmodel.cpp:212
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:696
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "Ein Eintrag"
 msgstr[1] "%1 Einträge"
 
-#: models/dirviewmodel.cpp:190
+#: models/dirviewmodel.cpp:219
 msgid "Audio File"
 msgstr "Audio-Datei"
 
-#: models/dirviewmodel.cpp:191 models/musicmodel.cpp:120
-msgid "Playlist"
-msgstr "Playlist"
-
-#: models/dirviewmodel.cpp:192 models/musicmodel.cpp:120
-msgid "Cue Sheet"
-msgstr "Cue Sheet"
-
-#: models/musiclibraryitemartist.cpp:218 models/musiclibraryitemartist.cpp:231
-#: models/musiclibraryitemroot.cpp:798
+#: models/musiclibraryitemartist.cpp:248 models/musiclibraryitemartist.cpp:261
+#: models/musiclibraryitemroot.cpp:840
 msgid "Single Tracks"
 msgstr "Einzelne Lieder"
 
-#: models/musicmodel.cpp:158 models/onlineservicesmodel.cpp:146
-#: widgets/groupedview.cpp:353
+#: models/musicmodel.cpp:190 models/onlineservicesmodel.cpp:167
+#: widgets/groupedview.cpp:364
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "Ein Stück"
 msgstr[1] "%1 Stücke"
 
-#: models/musicmodel.cpp:164
+#: models/musicmodel.cpp:196
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "Ein Künstler"
 msgstr[1] "%1 Künstler"
 
-#: models/musicmodel.cpp:172
+#: models/musicmodel.cpp:203
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "Ein Album"
 msgstr[1] "%1 Alben"
 
-#: models/onlineservicesmodel.cpp:76
-msgid "Configure Online Service"
-msgstr "Bearbeite Onlinedienst"
+#: models/musicmodel.cpp:209
+msgid "1 Episode"
+msgid_plural "%1 Episodes"
+msgstr[0] "Eine Episode"
+msgstr[1] "%1 Episoden"
+
+#. i18n: file: online/onlinesettings.ui:47
+#. i18n: ectx: property (text), widget (QPushButton, configureButton)
+#: models/onlineservicesmodel.cpp:91 po/rc.cpp:872 rc.cpp:872
+msgid "Configure Service"
+msgstr "Dienst einrichten"
 
-#: models/onlineservicesmodel.cpp:77
-msgid "Refresh Online Service"
-msgstr "Aktualisiere Onlinedienst"
+#: models/onlineservicesmodel.cpp:92
+msgid "Refresh Service"
+msgstr "Aktualisiere Dienst"
 
-#: models/onlineservicesmodel.cpp:125
+#: models/onlineservicesmodel.cpp:93
+msgid "Add Subscription"
+msgstr "Abonnements hinzufügen"
+
+#: models/onlineservicesmodel.cpp:94
+msgid "Remove Subscription"
+msgstr "Abonnement entfernen"
+
+#: models/onlineservicesmodel.cpp:95
+msgid "Refresh Subscription"
+msgstr "Abonnement aktualisieren"
+
+#: models/onlineservicesmodel.cpp:145
 msgid "Last Search:%1"
 msgstr "Letzte Suche: %1"
 
-#: models/onlineservicesmodel.cpp:136
-msgid "Searching..."
-msgstr "Suche..."
-
-#: models/onlineservicesmodel.cpp:139 models/streamsearchmodel.cpp:117
-#: models/streamsmodel.cpp:544
+#: models/onlineservicesmodel.cpp:160 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:691
 msgid "Not Loaded"
 msgstr "Nicht geladen"
 
-#: models/onlineservicesmodel.cpp:142
+#: models/onlineservicesmodel.cpp:163
 msgid "Use search to locate tracks"
 msgstr "Benutzen Sie die Suche, um Stücke zu finden"
 
-#: models/playlistsmodel.cpp:78
+#: models/onlineservicesmodel.cpp:174
+msgid "1 Podcast"
+msgid_plural "%1 Podcasts"
+msgstr[0] "Ein Podcast"
+msgstr[1] "%1 Podcasts"
+
+#: models/onlineservicesmodel.cpp:185
+msgid "(Downloading: %1%)"
+msgstr "(Lädt herunter: %1%)"
+
+#: models/onlineservicesmodel.cpp:243
+msgctxt "podcast name (num unplayed episodes)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: models/playlistsmodel.cpp:105
 msgid "New Playlist..."
 msgstr "Neue Wiedergabeliste…"
 
-#: models/playqueuemodel.cpp:105
-msgctxt "Track Number (#)"
-msgid "#"
-msgstr "#"
+#: models/playlistsmodel.cpp:321
+msgid "Smart Playlist"
+msgstr "Intelligente Wiedergabeliste"
 
-#: models/playqueuemodel.cpp:106
+#: models/playqueuemodel.cpp:109
 msgid "Length"
 msgstr "Länge"
 
-#: models/playqueuemodel.cpp:107
+#: models/playqueuemodel.cpp:110
 msgid "Disc"
 msgstr "Disk"
 
-#. i18n: file: devices/filenameschemedialog.ui:199
+#. i18n: file: devices/filenameschemedialog.ui:174
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:108 po/rc.cpp:187 rc.cpp:187
+#: models/playqueuemodel.cpp:111 po/rc.cpp:248 rc.cpp:248
 msgid "Year"
 msgstr "Jahr"
 
-#: models/playqueuemodel.cpp:363
+#: models/playqueuemodel.cpp:158
+msgid "Undo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:160
+msgid "Redo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:404
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(Priorität: %1)</b>"
 
-#: models/streamsearchmodel.cpp:119 models/streamsmodel.cpp:557
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:693
 msgid "Loading..."
 msgstr "Lade..."
 
-#: models/streamsmodel.cpp:235
+#: models/streamsmodel.cpp:302
 msgid "Bookmarks"
 msgstr "Lesezeichen"
 
-#: models/streamsmodel.cpp:461
+#: models/streamsmodel.cpp:576
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:464
+#: models/streamsmodel.cpp:579
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:465
+#: models/streamsmodel.cpp:580
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:466
+#: models/streamsmodel.cpp:583
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:467
+#: models/streamsmodel.cpp:584
+msgid "Radio GFM"
+msgstr ""
+
+#: models/streamsmodel.cpp:585
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: models/streamsmodel.cpp:468
+#: models/streamsmodel.cpp:586
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:469
+#: models/streamsmodel.cpp:587
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:470
+#: models/streamsmodel.cpp:588
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:471
+#: models/streamsmodel.cpp:589
 msgid "Favorites"
 msgstr "Favoriten"
 
-#: models/streamsmodel.cpp:474
+#: models/streamsmodel.cpp:590
+msgid "Listen Live"
+msgstr "Höre Live"
+
+#: models/streamsmodel.cpp:595
 msgid "Bookmark Category"
 msgstr "Kategorie zu Lesezeichen hinzufügen"
 
-#: models/streamsmodel.cpp:475
+#: models/streamsmodel.cpp:596
 msgid "Add Stream To Favorites"
 msgstr "Füge Stream den Favoriten hinzu"
 
-#: models/streamsmodel.cpp:476
+#: models/streamsmodel.cpp:597
 msgid "Configure Streams"
 msgstr "Konfiguriere Streams"
 
-#: models/streamsmodel.cpp:545
+#: models/streamsmodel.cpp:681
 msgid "%1 (Read-Only)"
 msgstr "%1 (Nur-Lesen)"
 
-#: models/streamsmodel.cpp:1064
+#: models/streamsmodel.cpp:1261
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr ""
 "Fehler beim Speichern der heruntergeladenen Stückliste. Bitte prüfen ob %1 "
 "beschreibbar ist."
 
-#: models/streamsmodel.cpp:1455
+#: models/streamsmodel.cpp:1659
 msgid "All"
 msgstr "Alle"
 
-#: models/streamsmodel.cpp:1641
-msgid "Listen Live"
-msgstr "Höre Live"
-
-#: mpd/mpdconnection.cpp:151
+#: mpd/mpdconnection.cpp:179
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "\"%1\""
 
-#: mpd/mpdconnection.cpp:153
+#: mpd/mpdconnection.cpp:181
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr "\"%1\" (%2:%3)"
 
-#: mpd/mpdconnection.cpp:361 mpd/mpdconnection.cpp:401
-#: mpd/mpdconnection.cpp:446 mpd/mpdconnection.cpp:984
-#: mpd/mpdconnection.cpp:1011
+#: mpd/mpdconnection.cpp:406 mpd/mpdconnection.cpp:451
+#: mpd/mpdconnection.cpp:501 mpd/mpdconnection.cpp:1137
+#: mpd/mpdconnection.cpp:1164
 msgid "Connection to %1 failed"
 msgstr "Verbindung zu %1 fehlgeschlagen"
 
-#: mpd/mpdconnection.cpp:367 mpd/mpdconnection.cpp:405
+#: mpd/mpdconnection.cpp:412 mpd/mpdconnection.cpp:455
 msgid "Connection to %1 failed - incorrect password"
 msgstr "Verbindung zu %1 fehlgeschlagen – falsches Passwort"
 
-#: mpd/mpdconnection.cpp:436
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to send command to %1 - not connected"
 msgstr "Fehler beim Senden von Kommando zu %1 – nicht verbunden"
 
-#: mpd/mpdconnection.cpp:472
+#: mpd/mpdconnection.cpp:539
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr "Fehler beim Laden. Bitte prüfen ob \"mpd\" Leseberechtigung besitzt."
 
-#: mpd/mpdconnection.cpp:474
+#: mpd/mpdconnection.cpp:541
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
@@ -3090,40 +3440,42 @@ msgstr ""
 "Fehler beim Laden. MPD kann nur lokale Dateien abspielen, wenn eine "
 "Verbindung über einen lokalen Socket besteht."
 
-#: mpd/mpdconnection.cpp:480 mpd/mpdconnection.cpp:487
+#: mpd/mpdconnection.cpp:547 mpd/mpdconnection.cpp:558
 msgid "Failed to send command. Disconnected from %1"
 msgstr "Fehler beim Senden des Kommandos. Verbindung  zu %1 unterbrochen"
 
-#: mpd/mpdconnection.cpp:1146
+#: mpd/mpdconnection.cpp:1306
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr "Fehler beim Umbenennen von <b>%1</b> nach <b>%2</b>"
 
-#: mpd/mpdconnection.cpp:1158
+#: mpd/mpdconnection.cpp:1318
 msgid "Failed to save <b>%1</b>"
 msgstr "Fehler beim Speichern von <b>%1</b>"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1331
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr ""
 "Sie können keine Teile eines Cue-Sheets zu einer Wiedergabeliste hinzufügen."
 
-#: mpd/mpdconnection.cpp:1174
+#: mpd/mpdconnection.cpp:1334
 msgid "You cannot add a playlist to another playlist!"
 msgstr ""
 "Sie können eine Wiedergabeliste nicht zu einer anderen Wiedergabeliste "
 "hinzufügen."
 
-#: mpd/mpdparseutils.cpp:663
-msgid "1 day %2"
-msgid_plural "%1 days %2"
-msgstr[0] "1 Tag %2"
-msgstr[1] "%1 Tage %2"
-
-#: mpd/mpduser.cpp:55
+#: mpd/mpduser.cpp:56
 msgid "Personal"
 msgstr "Persönlich"
 
-#: mpd/song.cpp:305
+#: mpd/song.cpp:62
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: mpd/song.cpp:63
+msgid "Various Artists"
+msgstr "Verschiedene Künstler:"
+
+#: mpd/song.cpp:427
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3165,19 +3517,19 @@ msgstr "Ogg"
 msgid "Streaming format:"
 msgstr "Streaming-Format:"
 
-#: online/magnatuneservice.cpp:161
+#: online/magnatuneservice.cpp:160
 msgid "Streaming"
 msgstr "Streaming"
 
-#: online/magnatuneservice.cpp:180
+#: online/magnatuneservice.cpp:179
 msgid "MP3 128k"
 msgstr "MP3 128k"
 
-#: online/magnatuneservice.cpp:181
+#: online/magnatuneservice.cpp:180
 msgid "MP3 VBR"
 msgstr "MP3 VBR"
 
-#: online/magnatuneservice.cpp:184
+#: online/magnatuneservice.cpp:183
 msgid "WAV"
 msgstr "WAV"
 
@@ -3185,10 +3537,6 @@ msgstr "WAV"
 msgid "Magnatune Settings"
 msgstr "Magnatune-Einstellungen"
 
-#: online/magnatunesettingsdialog.cpp:49
-msgid "Membership:"
-msgstr "Mitgliedschaft:"
-
 #. i18n: file: network/proxysettings.ui:96
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
@@ -3197,8 +3545,8 @@ msgstr "Mitgliedschaft:"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: online/magnatunesettingsdialog.cpp:51 po/rc.cpp:694 po/rc.cpp:706
-#: rc.cpp:694 rc.cpp:706
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:863 po/rc.cpp:881
+#: rc.cpp:863 rc.cpp:881
 msgid "Username:"
 msgstr "Benutzername:"
 
@@ -3206,7 +3554,7 @@ msgstr "Benutzername:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:231
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3x)
-#. i18n: file: gui/initialsettingswizard.ui:409
+#. i18n: file: gui/initialsettingswizard.ui:408
 #. i18n: ectx: property (text), widget (BuddyLabel, passwordLabel)
 #. i18n: file: gui/serversettings.ui:112
 #. i18n: ectx: property (text), widget (BuddyLabel, passwordLabel)
@@ -3218,7 +3566,7 @@ msgstr "Benutzername:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:231
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3x)
-#. i18n: file: gui/initialsettingswizard.ui:409
+#. i18n: file: gui/initialsettingswizard.ui:408
 #. i18n: ectx: property (text), widget (BuddyLabel, passwordLabel)
 #. i18n: file: gui/serversettings.ui:112
 #. i18n: ectx: property (text), widget (BuddyLabel, passwordLabel)
@@ -3226,262 +3574,590 @@ msgstr "Benutzername:"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPasswordLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: online/magnatunesettingsdialog.cpp:53 po/rc.cpp:214 po/rc.cpp:232
-#: po/rc.cpp:401 po/rc.cpp:636 po/rc.cpp:697 po/rc.cpp:709 rc.cpp:214
-#: rc.cpp:232 rc.cpp:401 rc.cpp:636 rc.cpp:697 rc.cpp:709
+#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:281 po/rc.cpp:299
+#: po/rc.cpp:476 po/rc.cpp:802 po/rc.cpp:866 po/rc.cpp:884 rc.cpp:281
+#: rc.cpp:299 rc.cpp:476 rc.cpp:802 rc.cpp:866 rc.cpp:884
 msgid "Password:"
 msgstr "Kennwort:"
 
-#: online/magnatunesettingsdialog.cpp:55
+#: online/magnatunesettingsdialog.cpp:51
+msgid "Membership:"
+msgstr "Mitgliedschaft:"
+
+#: online/magnatunesettingsdialog.cpp:57
 msgid "Downloads:"
 msgstr "Downloads:"
 
-#: online/onlineservice.cpp:67 online/onlineservice.cpp:155
+#: online/onlineservice.cpp:68 online/onlineservice.cpp:156
 msgid "Dowloading"
 msgstr "Lade herunter"
 
-#: online/onlineservice.cpp:97
+#: online/onlineservice.cpp:98
 msgid "Updating display"
 msgstr "Aktualisiere Anzeige"
 
-#: online/onlineservice.cpp:108
+#: online/onlineservice.cpp:109
 msgid "Grouping tracks"
 msgstr "Gruppiere Stücke"
 
-#: online/onlineservice.cpp:131
+#: online/onlineservice.cpp:132
 msgid "Parsing response"
 msgstr "Analyseergebnis"
 
-#: online/onlineservice.cpp:143 online/onlineservice.cpp:146
+#: online/onlineservice.cpp:144 online/onlineservice.cpp:147
 msgid "Failed to parse"
 msgstr "Fehler beim Analysieren"
 
-#: online/onlineservice.cpp:149
+#: online/onlineservice.cpp:150
 msgid "Failed to download"
 msgstr "Fehler beim Herunterladen"
 
-#: online/onlineservicespage.cpp:58
+#: online/onlineservicespage.cpp:61
 msgid "Download To Library"
 msgstr "Herunterladen in Bibliothek"
 
-#: online/onlineservicespage.cpp:282
+#: online/onlineservicespage.cpp:62
+msgid "Download Podcast Episodes"
+msgstr ""
+
+#: online/onlineservicespage.cpp:63
+msgid "Delete Downloaded Podcast Episodes"
+msgstr ""
+
+#: online/onlineservicespage.cpp:320
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "Suche %1:"
 
-#: online/onlineservicespage.cpp:396
+#: online/onlineservicespage.cpp:458
 msgid "Re-download music listing for %1?"
 msgstr "Musikliste noch einmal für %1 herunterladen?"
 
-#. i18n: file: context/othersettings.ui:19
-#. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
-#: po/rc.cpp:3 rc.cpp:3
-msgid "Use backdrop:"
-msgstr "Benutzer Hintergrund:"
-
-#. i18n: file: context/othersettings.ui:32
-#. i18n: ectx: property (text), widget (BuddyLabel, contextDarkBackgroundLabel)
-#: po/rc.cpp:6 rc.cpp:6
-msgid "Dark background:"
-msgstr "Dunkler Hintergrund:"
+#: online/onlineservicespage.cpp:544
+msgid "Unsubscribe from <b>%1</b>?"
+msgstr ""
 
-#. i18n: file: context/othersettings.ui:45
-#. i18n: ectx: property (text), widget (BuddyLabel, wikipediaIntroOnlyLabel)
-#: po/rc.cpp:9 rc.cpp:9
-msgid "Only show basic wikipedia text:"
-msgstr "Zeige nur einfachen Wikipedia-Text:"
+#: online/onlineservicespage.cpp:565
+msgid "Refresh all podcast listings?"
+msgstr ""
 
-#. i18n: file: context/othersettings.ui:86
-#. i18n: ectx: property (text), widget (StateLabel, wikipediaIntroOnlyNote)
-#: po/rc.cpp:13 rc.cpp:13
-#, no-c-format
-msgid ""
-"<i><b>NOTE:</b> Cantata does not show the full wikipedia pages (with images, "
-"links, etc), instead it shows a trimmed down version. This trimming is not "
-"always 100% accurate, hence by default Cantata will only show the basic "
-"introduction to each article. If you elect to show the full article, then "
-"there may be parsing errors. You will also need to remove any currently "
-"cached articles (using the 'Cache' page).</i>"
+#: online/onlineservicespage.cpp:586
+msgid "Refresh episode listing from <b>%1</b>?"
 msgstr ""
-"<i><b>Hinweis:</b> Cantata zeigt nicht die volle Wikipedia-Seiten (mit "
-"Bildern,Links usw.) sondern zeigt eine minimale Version. "
-"Das Trimmen funktioniert nicht immer zu 100% genau. "
-"Daher wird Cantata standardmäßig nur die grundlegende Einführung zu jedem "
-"Artikel anzeigen. "
-"Wenn Sie sich dafür entscheiden den ganzen Artikel zeigen kann es zu "
-"Verarbeitungsfehlern kommen. "
-"Der Zwischenspeicher für Artikel muss geleert werden (über die "
-"„Zwischenpeicher“  Seite).<i>"
 
-#. i18n: file: context/togglelist.ui:17
-#. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:16 rc.cpp:16
-msgid "Available:"
-msgstr "Verfügbar:"
+#: online/onlineservicespage.cpp:652
+msgid "All selected podcasts have already been downloaded!"
+msgstr ""
 
-#. i18n: file: context/togglelist.ui:24
-#. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:19 rc.cpp:19
-msgid "Selected:"
-msgstr "Ausgewählt:"
+#: online/onlineservicespage.cpp:656
+msgid "Do you wish to download the following podcast episode?"
+msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:30
-#. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:22 rc.cpp:22
-msgid "Copy songs from:"
-msgstr "Kopiere Titel von:"
+#: online/onlineservicespage.cpp:659
+msgid "Do you wish to download the following podcast episodes?"
+msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:39
-#. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
-#. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
-#. i18n: file: streams/digitallyimportedsettings.ui:122
-#. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#. i18n: file: devices/actiondialog.ui:39
-#. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
-#. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
-#. i18n: file: streams/digitallyimportedsettings.ui:122
-#. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#: po/rc.cpp:25 po/rc.cpp:31 po/rc.cpp:49 po/rc.cpp:721 rc.cpp:25 rc.cpp:31
+#: online/onlineservicespage.cpp:662
+#, fuzzy
+msgid "Do you wish to download the selected podcast episodes?"
+msgstr "Sind Sie sicher das Sie das Gerät vergessen möchten?"
+
+#: online/onlineservicespage.cpp:710
+msgid "All selected downloaded podcast episodes have already been deleted!"
+msgstr ""
+
+#: online/onlineservicespage.cpp:714
+msgid ""
+"Do you wish to delete the downloaded file of the following podcast episode?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:717
+msgid ""
+"Do you wish to the delete downloaded files of the following podcast episodes?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:720
+msgid ""
+"Do you wish to the delete downloaded files of the selected podcast episodes?"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:253
+msgid "RSS:"
+msgstr "RSS:"
+
+#: online/podcastsearchdialog.cpp:255
+msgid "Website:"
+msgstr "Webseite:"
+
+#: online/podcastsearchdialog.cpp:262
+msgid "Podcast details"
+msgstr "Podcastdetails"
+
+#: online/podcastsearchdialog.cpp:262
+msgid "Select a podcast to display its details"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:333
+msgid "Enter search term..."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:383
+msgid "Failed to fetch podcasts from %1"
+msgstr "Fehler beim Herunterladen des Podcasts von %1"
+
+#: online/podcastsearchdialog.cpp:389
+msgid "There was a problem parsing the response from %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:450
+#, fuzzy
+msgid "Failed to download directory listing"
+msgstr "Fehler beim herunterladen der Streamliste"
+
+#: online/podcastsearchdialog.cpp:458
+#, fuzzy
+msgid "Failed to parse directory listing"
+msgstr "Fehler beim Analysieren der heruntergeladenen Stückliste"
+
+#: online/podcastsearchdialog.cpp:508
+msgid "URL"
+msgstr "URL"
+
+#: online/podcastsearchdialog.cpp:517
+msgid "Enter podcast URL..."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:518
+#, fuzzy
+msgid "Load"
+msgstr "Geladen"
+
+#: online/podcastsearchdialog.cpp:525
+msgid "Enter podcast URL below, and press 'Load'"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:552
+msgid "Invalid URL!"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:562
+#, fuzzy
+msgid "Failed to fetch podcast!"
+msgstr "Fehler beim Analysieren"
+
+#: online/podcastsearchdialog.cpp:567
+#, fuzzy
+msgid "Failed to parse podcast."
+msgstr "Fehler beim Analysieren"
+
+#: online/podcastsearchdialog.cpp:571
+msgid ""
+"Cantata only supports audio podcasts! The URL entered contains only video "
+"podcasts."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:589
+msgid "Subscribe"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:607
+msgid "Enter URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:607
+msgid "Manual podcast URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
+msgid "Search %1"
+msgstr "Suche %1"
+
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
+msgid "Search for podcasts on %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:628
+msgid "Browse %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:628
+msgid "Browse %1 podcasts"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:639
+#, fuzzy
+msgid "Add Podcast Subscription"
+msgstr "Keine Abonnements"
+
+#: online/podcastsearchdialog.cpp:695
+#, fuzzy
+msgid "Subscription added"
+msgstr "Keine Abonnements"
+
+#: online/podcastsearchdialog.cpp:697
+msgid "You are already subscribed to this podcast!"
+msgstr ""
+
+#: online/podcastservice.cpp:103
+msgid "Podcasts"
+msgstr "Podcasts"
+
+#: online/podcastservice.cpp:288
+msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
+msgstr ""
+
+#: online/podcastservice.cpp:290
+#, fuzzy
+msgid "Failed to parse %1"
+msgstr "Fehler beim Analysieren"
+
+#: online/podcastservice.cpp:294
+#, fuzzy
+msgid "Failed to download %1"
+msgstr "Fehler beim Herunterladen"
+
+#: online/podcastsettingsdialog.cpp:59
+msgid "Check for new episodes:"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:60
+#, fuzzy
+msgid "Download episodes to:"
+msgstr "Downloads:"
+
+#: online/podcastsettingsdialog.cpp:67
+#, fuzzy
+msgid "Automatically download new episodes"
+msgstr "Automatisch nachschauen"
+
+#: online/podcastsettingsdialog.cpp:80
+#, fuzzy
+msgid "Podcast Settings"
+msgstr "Proxyeinstellungen"
+
+#: online/podcastsettingsdialog.cpp:82
+msgid "Manually"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:83
+msgid "Every 15 minutes"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:84
+msgid "Every 30 minutes"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:85
+msgid "Every hour"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:86
+msgid "Every 2 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:87
+msgid "Every 6 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:88
+msgid "Every 12 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:89
+msgid "Every day"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:90
+msgid "Every week"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:3 po/rc.cpp:657 rc.cpp:3 rc.cpp:657
+msgid "Background Image"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:36
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_artist)
+#: po/rc.cpp:9 rc.cpp:9
+msgid "Artist image"
+msgstr "Künstlerbilder"
+
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#: po/rc.cpp:12 po/rc.cpp:666 rc.cpp:12 rc.cpp:666
+#, fuzzy
+msgid "Custom image:"
+msgstr "Eigene Einstellung:"
+
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#: po/rc.cpp:15 po/rc.cpp:669 rc.cpp:15 rc.cpp:669
+msgid "Blur:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#: po/rc.cpp:18 po/rc.cpp:672 rc.cpp:18 rc.cpp:672
+msgid "10px"
+msgstr "10px"
+
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: po/rc.cpp:21 po/rc.cpp:675 rc.cpp:21 rc.cpp:675
+msgid "Opacity:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#: po/rc.cpp:25 po/rc.cpp:679 rc.cpp:25 rc.cpp:679
+#, no-c-format
+msgid "40%"
+msgstr "40%"
+
+#. i18n: file: context/othersettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, contextDarkBackground)
+#: po/rc.cpp:28 rc.cpp:28
+msgid "Dark background"
+msgstr "Dunkler Hintergrund"
+
+#. i18n: file: context/othersettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, wikipediaIntroOnly)
+#: po/rc.cpp:31 rc.cpp:31
+msgid "Only show basic wikipedia text"
+msgstr "Zeige nur einfachen Wikipedia-Text"
+
+#. i18n: file: context/othersettings.ui:178
+#. i18n: ectx: property (text), widget (QCheckBox, contextAlwaysCollapsed)
+#: po/rc.cpp:34 rc.cpp:34
+msgid "Always collapse into a single pane"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:207
+#. i18n: ectx: property (text), widget (StateLabel, wikipediaIntroOnlyNote)
+#: po/rc.cpp:38 rc.cpp:38
+#, no-c-format
+msgid ""
+"<i><b>NOTE:</b> Cantata does not show the full wikipedia pages (with images, "
+"links, etc), instead it shows a trimmed down version. This trimming is not "
+"always 100% accurate, hence by default Cantata will only show the basic "
+"introduction to each article. If you elect to show the full article, then "
+"there may be parsing errors. You will also need to remove any currently "
+"cached articles (using the 'Cache' page).</i>"
+msgstr ""
+"<i><b>Hinweis:</b> Cantata zeigt nicht die volle Wikipedia-Seiten (mit "
+"Bildern,Links usw.) sondern zeigt eine minimale Version. Das Trimmen "
+"funktioniert nicht immer zu 100% genau. Daher wird Cantata standardmäßig nur "
+"die grundlegende Einführung zu jedem Artikel anzeigen. Wenn Sie sich dafür "
+"entscheiden den ganzen Artikel zeigen kann es zu Verarbeitungsfehlern "
+"kommen. Der Zwischenspeicher für Artikel muss geleert werden (über die "
+"„Zwischenpeicher“  Seite).<i>"
+
+#. i18n: file: context/togglelist.ui:17
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:41 rc.cpp:41
+msgid "Available:"
+msgstr "Verfügbar:"
+
+#. i18n: file: context/togglelist.ui:24
+#. i18n: ectx: property (text), widget (QLabel, label_3)
+#: po/rc.cpp:44 rc.cpp:44
+msgid "Selected:"
+msgstr "Ausgewählt:"
+
+#. i18n: file: devices/actiondialog.ui:33
+#. i18n: ectx: property (text), widget (QLabel, label)
+#: po/rc.cpp:47 rc.cpp:47
+msgid "Copy songs from:"
+msgstr "Kopiere Titel von:"
+
+#. i18n: file: devices/actiondialog.ui:42
+#. i18n: ectx: property (text), widget (QLabel, sourceLabel)
+#. i18n: file: devices/actiondialog.ui:95
+#. i18n: ectx: property (text), widget (QLabel, destinationLabel)
+#. i18n: file: streams/digitallyimportedsettings.ui:122
+#. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
+#. i18n: file: devices/actiondialog.ui:42
+#. i18n: ectx: property (text), widget (QLabel, sourceLabel)
+#. i18n: file: devices/actiondialog.ui:95
+#. i18n: ectx: property (text), widget (QLabel, destinationLabel)
+#. i18n: file: streams/digitallyimportedsettings.ui:122
+#. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
+#: po/rc.cpp:50 po/rc.cpp:62 po/rc.cpp:896 rc.cpp:50 rc.cpp:62 rc.cpp:896
 #, fuzzy
-#: rc.cpp:49 rc.cpp:721
 msgid "TextLabel"
 msgstr "TextLabel"
 
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#: po/rc.cpp:28 po/rc.cpp:34 rc.cpp:28 rc.cpp:34
+#: po/rc.cpp:56 po/rc.cpp:68 rc.cpp:56 rc.cpp:68
 msgid "(Needs configuring)"
 msgstr "(Einstellungen benötigt)"
 
-#. i18n: file: devices/actiondialog.ui:123
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:37 rc.cpp:37
-msgid "Overwrite songs:"
-msgstr "Titel überschreiben:"
-
-#. i18n: file: devices/actiondialog.ui:150
+#. i18n: file: devices/actiondialog.ui:86
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:40 rc.cpp:40
+#: po/rc.cpp:59 rc.cpp:59
 msgid "Copy songs to:"
 msgstr "Kopiere Titel nach:"
 
-#. i18n: file: devices/actiondialog.ui:157
+#. i18n: file: devices/actiondialog.ui:149
 #. i18n: ectx: property (text), widget (QLabel, codecLabel)
-#: po/rc.cpp:43 rc.cpp:43
+#: po/rc.cpp:71 rc.cpp:71
 msgid "Destination format:"
 msgstr "Zielformat:"
 
-#. i18n: file: devices/actiondialog.ui:171
+#. i18n: file: devices/actiondialog.ui:163
+#. i18n: ectx: property (text), widget (QCheckBox, overwrite)
+#: po/rc.cpp:74 rc.cpp:74
+msgid "Overwrite songs"
+msgstr "Lieder überschreiben"
+
+#. i18n: file: devices/actiondialog.ui:170
 #. i18n: ectx: property (text), widget (QLabel, songCountLabel)
-#: po/rc.cpp:46 rc.cpp:46
+#: po/rc.cpp:77 rc.cpp:77
 msgid "To copy:"
 msgstr "Zum Kopieren:"
 
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#: po/rc.cpp:80 po/rc.cpp:968 po/rc.cpp:995 rc.cpp:80 rc.cpp:968 rc.cpp:995
+msgid ""
+"<i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i>"
+msgstr ""
+
 #. i18n: file: devices/albumdetails.ui:26
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:52 rc.cpp:52
+#: po/rc.cpp:83 rc.cpp:83
 msgid "Album Details"
 msgstr "Album Details"
 
-#. i18n: file: devices/albumdetails.ui:60
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:113
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:60
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:113
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:61 po/rc.cpp:763 rc.cpp:61 rc.cpp:763
-msgid "Genre:"
-msgstr "Genre:"
-
-#. i18n: file: devices/albumdetails.ui:73
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/tageditor.ui:126
+#. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#. i18n: file: devices/albumdetails.ui:73
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/tageditor.ui:126
+#. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#: po/rc.cpp:64 po/rc.cpp:766 rc.cpp:64 rc.cpp:766
+#: po/rc.cpp:98 po/rc.cpp:965 rc.cpp:98 rc.cpp:965
 msgid "Year:"
 msgstr "Jahr:"
 
-#. i18n: file: devices/albumdetails.ui:83
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:67 rc.cpp:67
-msgid "Single artist:"
-msgstr "Einzelner Künstler:"
-
-#. i18n: file: devices/albumdetails.ui:103
+#. i18n: file: devices/albumdetails.ui:102
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:70 rc.cpp:70
+#: po/rc.cpp:101 rc.cpp:101
 msgid "Disc:"
 msgstr "Disk:"
 
-#. i18n: file: devices/audiocdsettings.ui:20
+#. i18n: file: devices/albumdetails.ui:115
+#. i18n: ectx: property (text), widget (QCheckBox, singleArtist)
+#: po/rc.cpp:104 rc.cpp:104
+msgid "Single artist"
+msgstr "Einzelner Künstler"
+
+#. i18n: file: devices/audiocdsettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:85 rc.cpp:85
+#: po/rc.cpp:119 rc.cpp:119
 msgid "Album and Track Information Retrieval"
 msgstr "Album- und Stück-Informationen"
 
-#. i18n: file: devices/audiocdsettings.ui:26
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:88 rc.cpp:88
-msgid "Automatically lookup:"
-msgstr "Automatisch nachschauen:"
-
-#. i18n: file: devices/audiocdsettings.ui:39
+#. i18n: file: devices/audiocdsettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:91 rc.cpp:91
+#: po/rc.cpp:122 rc.cpp:122
 msgid "Initially look up via:"
 msgstr "Zunächst schauen via:"
 
-#. i18n: file: devices/audiocdsettings.ui:52
+#. i18n: file: devices/audiocdsettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:125 rc.cpp:125
 msgid "CDDB Host:"
 msgstr "CDDB-Host:"
 
-#. i18n: file: devices/audiocdsettings.ui:65
+#. i18n: file: devices/audiocdsettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:128 rc.cpp:128
 msgid "CDDB Port:"
 msgstr "CDDB-Port:"
 
-#. i18n: file: devices/audiocdsettings.ui:88
+#. i18n: file: devices/audiocdsettings.ui:84
+#. i18n: ectx: property (text), widget (QCheckBox, cdAuto)
+#: po/rc.cpp:131 rc.cpp:131
+msgid "Lookup information as soon as CD is inserted"
+msgstr ""
+
+#. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:134 rc.cpp:134
 msgid "Audio Extraction"
 msgstr "Audio-Extraktion"
 
-#. i18n: file: devices/audiocdsettings.ui:94
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:103 rc.cpp:103
-msgid "Full paranoia mode (best quality):"
+#. i18n: file: devices/audiocdsettings.ui:100
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaFull)
+#: po/rc.cpp:137 rc.cpp:137
+msgid "Full paranoia mode (best quality)"
 msgstr "Voller Paranoia-Modus (beste Qualität)"
 
 #. i18n: file: devices/audiocdsettings.ui:107
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:106 rc.cpp:106
-msgid "Never skip on read error:"
-msgstr "Niemals Lesefehler überspringen:"
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaNeverSkip)
+#: po/rc.cpp:140 rc.cpp:140
+msgid "Never skip on read error"
+msgstr "Niemals Lesefehler überspringen"
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:109 rc.cpp:109
+#: po/rc.cpp:143 rc.cpp:143
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3491,227 +4167,294 @@ msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:35
 #. i18n: ectx: property (text), widget (BuddyLabel, musicFolderLabel)
-#. i18n: file: gui/initialsettingswizard.ui:426
+#. i18n: file: gui/initialsettingswizard.ui:425
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:612
+#. i18n: file: gui/initialsettingswizard.ui:611
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
 #. i18n: file: gui/serversettings.ui:129
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
-#. i18n: file: gui/serversettings.ui:286
+#. i18n: file: gui/serversettings.ui:325
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
 #. i18n: file: devices/devicepropertieswidget.ui:35
 #. i18n: ectx: property (text), widget (BuddyLabel, musicFolderLabel)
-#. i18n: file: gui/initialsettingswizard.ui:426
+#. i18n: file: gui/initialsettingswizard.ui:425
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:612
+#. i18n: file: gui/initialsettingswizard.ui:611
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
 #. i18n: file: gui/serversettings.ui:129
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
-#. i18n: file: gui/serversettings.ui:286
+#. i18n: file: gui/serversettings.ui:325
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
-#: po/rc.cpp:112 po/rc.cpp:404 po/rc.cpp:422 po/rc.cpp:639 po/rc.cpp:654
-#: rc.cpp:112 rc.cpp:404 rc.cpp:422 rc.cpp:639 rc.cpp:654
+#: po/rc.cpp:146 po/rc.cpp:479 po/rc.cpp:497 po/rc.cpp:805 po/rc.cpp:826
+#: rc.cpp:146 rc.cpp:479 rc.cpp:497 rc.cpp:805 rc.cpp:826
 msgid "Music folder:"
 msgstr "Musikverzeichnis:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:115 rc.cpp:115
+#: po/rc.cpp:149 rc.cpp:149
 msgid "Copy album covers as:"
 msgstr "Kopiere Albencovers als:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:152 rc.cpp:152
 msgid "Maximum cover size:"
 msgstr "Maximale Größe des Albumcovers:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:82
-#. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:121 rc.cpp:121
-msgid "'Various Artists' workaround:"
-msgstr "Verschiedene Künstler Problembehebung:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, autoScanLabel)
-#: po/rc.cpp:124 rc.cpp:124
-msgid "Automatically scan music when attached:"
-msgstr "Automatisch nach Musik suchen, wenn verbunden wird:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:108
-#. i18n: ectx: property (text), widget (BuddyLabel, useCacheLabel)
-#: po/rc.cpp:127 rc.cpp:127
-msgid "Use cache:"
-msgstr "Benutzer Zwischenspeicher:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:121
+#. i18n: file: devices/devicepropertieswidget.ui:85
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:130 rc.cpp:130
+#: po/rc.cpp:155 rc.cpp:155
 msgid "Default volume:"
 msgstr "Voreinstellung der Lautstärke:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, fixVariousArtists)
+#: po/rc.cpp:158 rc.cpp:158
+#, fuzzy
+msgid "'Various Artists' workaround"
+msgstr "Verschiedene Künstler Problembehebung:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:99
+#. i18n: ectx: property (text), widget (QCheckBox, autoScan)
+#: po/rc.cpp:161 rc.cpp:161
+msgid "Automatically scan music when attached"
+msgstr "Automatisch nach Musik suchen, wenn verbunden"
+
+#. i18n: file: devices/devicepropertieswidget.ui:106
+#. i18n: ectx: property (text), widget (QCheckBox, useCache)
+#: po/rc.cpp:164 rc.cpp:164
+msgid "Use cache"
+msgstr "Benutze Zwischenspeicher"
+
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#: po/rc.cpp:133 po/rc.cpp:769 rc.cpp:133 rc.cpp:769
+#: po/rc.cpp:167 po/rc.cpp:971 rc.cpp:167 rc.cpp:971
 msgid "Filenames"
 msgstr "Dateinamen"
 
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:136 po/rc.cpp:781 rc.cpp:136 rc.cpp:781
-msgid "Use only ASCII characters:"
-msgstr "Nur ASCII-Zeichen verwenden:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:139 po/rc.cpp:778 rc.cpp:139 rc.cpp:778
-msgid "Replace spaces with underscores:"
-msgstr "Ersetze Leerzeichen mit Unterstrichen:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:142 po/rc.cpp:775 rc.cpp:142 rc.cpp:775
-msgid "Ignore 'The' in artist names:"
-msgstr "Ignoriere „The“ im Künstlernamen"
-
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:145 po/rc.cpp:772 rc.cpp:145 rc.cpp:772
+#: po/rc.cpp:170 po/rc.cpp:974 rc.cpp:170 rc.cpp:974
 msgid "Filename scheme:"
 msgstr "Dateinamenschema"
 
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:148 po/rc.cpp:784 rc.cpp:148 rc.cpp:784
-msgid "VFAT safe:"
-msgstr "VFAT sichern:"
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#: po/rc.cpp:173 po/rc.cpp:977 rc.cpp:173 rc.cpp:977
+msgid "VFAT safe"
+msgstr "VFAT-sicher"
+
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#: po/rc.cpp:176 po/rc.cpp:980 rc.cpp:176 rc.cpp:980
+msgid "Use only ASCII characters"
+msgstr "Nur ASCII-Zeichen verwenden"
+
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#: po/rc.cpp:179 po/rc.cpp:983 rc.cpp:179 rc.cpp:983
+msgid "Replace spaces with underscores"
+msgstr "Ersetze Leerzeichen mit Unterstrichen"
+
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#: po/rc.cpp:182 po/rc.cpp:986 rc.cpp:182 rc.cpp:986
+msgid "Ignore 'The' in artist names"
+msgstr "Ignoriere „The“ im Künstlernamen"
 
-#. i18n: file: devices/devicepropertieswidget.ui:250
+#. i18n: file: devices/devicepropertieswidget.ui:192
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:151 rc.cpp:151
+#: po/rc.cpp:185 rc.cpp:185
 msgid "Transcoding"
 msgstr "Umwandeln"
 
-#. i18n: file: devices/devicepropertieswidget.ui:261
-#. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:154 rc.cpp:154
-msgid "Only transcode if source file is of a different format:"
-msgstr "Nur umwandeln, wenn Quelldatei ein unterschiedliches Format besitzt:"
+#. i18n: file: devices/devicepropertieswidget.ui:201
+#. i18n: ectx: property (text), widget (QCheckBox, transcoderWhenDifferent)
+#: po/rc.cpp:188 rc.cpp:188
+msgid "Only transcode if source file is of a different format"
+msgstr "Nur umwandeln, wenn Quelldatei ein unterschiedliches Format besitzt"
 
-#. i18n: file: devices/filenameschemedialog.ui:29
+#. i18n: file: devices/filenameschemedialog.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:157 rc.cpp:157
+#: po/rc.cpp:191 rc.cpp:191
 msgid "Example:"
 msgstr "Beispiel:"
 
-#. i18n: file: devices/filenameschemedialog.ui:58
+#. i18n: file: devices/filenameschemedialog.ui:67
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:194 rc.cpp:194
 msgid "About filename schemes"
 msgstr "Hinweis zum Dateinamenschema"
 
+#. i18n: file: devices/filenameschemedialog.ui:79
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumArtist)
+#: po/rc.cpp:197 rc.cpp:197
+msgid ""
+"The artist of the album. For most albums, this will be the same as the "
+"<i>Track Artist.</i> For compilations, this will often be <i>Various Artists."
+"</i>"
+msgstr ""
+
 #. i18n: file: devices/filenameschemedialog.ui:82
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:200 rc.cpp:200
 msgid "Album Artist"
 msgstr "Albumkünstler"
 
-#. i18n: file: devices/filenameschemedialog.ui:101
+#. i18n: file: devices/filenameschemedialog.ui:89
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumTitle)
+#: po/rc.cpp:203 rc.cpp:203
+msgid "The name of the album."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:92
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:206 rc.cpp:206
 msgid "Album Title"
 msgstr "Albumname"
 
-#. i18n: file: devices/filenameschemedialog.ui:120
+#. i18n: file: devices/filenameschemedialog.ui:99
+#. i18n: ectx: property (toolTip), widget (QPushButton, composer)
+#: po/rc.cpp:209 rc.cpp:209
+msgid "The composer."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:109
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtist)
+#: po/rc.cpp:215 rc.cpp:215
+msgid "The artist of each track."
+msgstr "Der Künstler der jeweiligen Stücke"
+
+#. i18n: file: devices/filenameschemedialog.ui:112
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:218 rc.cpp:218
 msgid "Track Artist"
 msgstr "Künstler"
 
-#. i18n: file: devices/filenameschemedialog.ui:139
+#. i18n: file: devices/filenameschemedialog.ui:119
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackTitle)
+#: po/rc.cpp:221 rc.cpp:221
+msgid "The track title (without <i>Track Artist</i>)."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:122
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:172 rc.cpp:172
+#: po/rc.cpp:224 rc.cpp:224
 msgid "Track Title"
 msgstr "Titel"
 
-#. i18n: file: devices/filenameschemedialog.ui:158
+#. i18n: file: devices/filenameschemedialog.ui:141
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtistAndTitle)
+#: po/rc.cpp:227 rc.cpp:227
+msgid ""
+"The track title (with <i>Track Artist</i>, if different to <i>Album Artist</"
+"i>)."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:144
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:230 rc.cpp:230
 msgid "Track Title (+Artist)"
 msgstr "Name des Stückes (+Künstler)"
 
-#. i18n: file: devices/filenameschemedialog.ui:165
+#. i18n: file: devices/filenameschemedialog.ui:151
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackNo)
+#: po/rc.cpp:233 rc.cpp:233
+msgid "The track number."
+msgstr "Stücknummer."
+
+#. i18n: file: devices/filenameschemedialog.ui:154
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:236 rc.cpp:236
 msgid "Track #"
 msgstr "Titel #"
 
-#. i18n: file: devices/filenameschemedialog.ui:172
+#. i18n: file: devices/filenameschemedialog.ui:161
+#. i18n: ectx: property (toolTip), widget (QPushButton, cdNo)
+#: po/rc.cpp:239 rc.cpp:239
+msgid ""
+"The album number of a multi-album album. Often compilations consist of "
+"several albums."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:164
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:242 rc.cpp:242
 msgid "CD #"
 msgstr "CD #"
 
+#. i18n: file: devices/filenameschemedialog.ui:171
+#. i18n: ectx: property (toolTip), widget (QPushButton, year)
+#: po/rc.cpp:245 rc.cpp:245
+msgid "The year of the album's release."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:181
+#. i18n: ectx: property (toolTip), widget (QPushButton, genre)
+#: po/rc.cpp:251 rc.cpp:251
+msgid "The genre of the album."
+msgstr ""
+
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:190 rc.cpp:190
+#: po/rc.cpp:257 rc.cpp:257
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
 msgstr ""
-"<i><b>Hinweis:</b> Diese Einstellungen sind nur gültig, wenn das Gerät "
-"nicht "
+"<i><b>Hinweis:</b> Diese Einstellungen sind nur gültig, wenn das Gerät nicht "
 "verbunden ist.</i>"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:149
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:149
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
-#: po/rc.cpp:193 po/rc.cpp:316 po/rc.cpp:679 rc.cpp:193 rc.cpp:316 rc.cpp:679
+#: po/rc.cpp:260 po/rc.cpp:353 po/rc.cpp:848 rc.cpp:260 rc.cpp:353 rc.cpp:848
 msgid "Type:"
 msgstr "Type:"
 
@@ -3723,14 +4466,16 @@ msgstr "Type:"
 #. i18n: ectx: property (text), widget (BuddyLabel, nameLabel)
 #. i18n: file: gui/serversettings.ui:63
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:196 po/rc.cpp:627 streams/streamdialog.cpp:70 rc.cpp:196
-#: rc.cpp:627
+#: po/rc.cpp:263 po/rc.cpp:793 streams/streamdialog.cpp:71 rc.cpp:263
+#: rc.cpp:793
 msgid "Name:"
 msgstr "Name:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:199 rc.cpp:199
+#. i18n: file: gui/interfacesettings.ui:122
+#. i18n: ectx: property (title), widget (QGroupBox, optionsGroup)
+#: po/rc.cpp:266 rc.cpp:266 po/rc.cpp:551 rc.cpp:551
 msgid "Options"
 msgstr "Optionen"
 
@@ -3738,7 +4483,7 @@ msgstr "Optionen"
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:305
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
-#. i18n: file: gui/initialsettingswizard.ui:386
+#. i18n: file: gui/initialsettingswizard.ui:385
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: gui/serversettings.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
@@ -3748,14 +4493,14 @@ msgstr "Optionen"
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:305
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
-#. i18n: file: gui/initialsettingswizard.ui:386
+#. i18n: file: gui/initialsettingswizard.ui:385
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: gui/serversettings.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: network/proxysettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPortLabel)
-#: po/rc.cpp:205 po/rc.cpp:244 po/rc.cpp:398 po/rc.cpp:633 po/rc.cpp:691
-#: rc.cpp:205 rc.cpp:244 rc.cpp:398 rc.cpp:633 rc.cpp:691
+#: po/rc.cpp:272 po/rc.cpp:311 po/rc.cpp:473 po/rc.cpp:799 po/rc.cpp:860
+#: rc.cpp:272 rc.cpp:311 rc.cpp:473 rc.cpp:799 rc.cpp:860
 msgid "Port:"
 msgstr "Port:"
 
@@ -3771,7 +4516,7 @@ msgstr "Port:"
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2x)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:322
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel)
-#: po/rc.cpp:208 po/rc.cpp:226 po/rc.cpp:247 rc.cpp:208 rc.cpp:226 rc.cpp:247
+#: po/rc.cpp:275 po/rc.cpp:293 po/rc.cpp:314 rc.cpp:275 rc.cpp:293 rc.cpp:314
 msgid "User:"
 msgstr "Benutzer:"
 
@@ -3783,7 +4528,7 @@ msgstr "Benutzer:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:218
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2x)
-#: po/rc.cpp:211 po/rc.cpp:229 rc.cpp:211 rc.cpp:229
+#: po/rc.cpp:278 po/rc.cpp:296 rc.cpp:278 rc.cpp:296
 msgid "Domain:"
 msgstr "Domain:"
 
@@ -3795,7 +4540,7 @@ msgstr "Domain:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:248
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2)
-#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:284 po/rc.cpp:302 rc.cpp:284 rc.cpp:302
 msgid "Share:"
 msgstr "Freigabe:"
 
@@ -3807,21 +4552,20 @@ msgstr "Freigabe:"
 #. i18n: ectx: property (text), widget (QLabel, label_4)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:263
 #. i18n: ectx: property (text), widget (QLabel, label_4x)
-#: po/rc.cpp:220 po/rc.cpp:238 rc.cpp:220 rc.cpp:238
+#: po/rc.cpp:287 po/rc.cpp:305 rc.cpp:287 rc.cpp:305
 msgid ""
 "<i><b>NOTE:</b> If you enter a password here, it will be stored "
 "<b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the "
 "password before accessing the share, set the password to '-'</i>"
 msgstr ""
-"<i><b>Hinweis:</b> Wenn Sie hier ein Kennwort eingeben, wird es <b>"
-"unverschlüsselt</b> in Cantatas Konfigurationdatei gespeichert. Wenn Sie "
-"möchten, dass "
-"Cantata sie zur Passworteingabe auffordert, setzen Sie das Kennwort auf '-'<"
-"/i>"
+"<i><b>Hinweis:</b> Wenn Sie hier ein Kennwort eingeben, wird es "
+"<b>unverschlüsselt</b> in Cantatas Konfigurationdatei gespeichert. Wenn Sie "
+"möchten, dass Cantata sie zur Passworteingabe auffordert, setzen Sie das "
+"Kennwort auf '-'</i>"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:223 rc.cpp:223
+#: po/rc.cpp:290 rc.cpp:290
 msgid "Service name:"
 msgstr "Servicename:"
 
@@ -3833,227 +4577,212 @@ msgstr "Servicename:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:390
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#: po/rc.cpp:250 po/rc.cpp:259 rc.cpp:250 rc.cpp:259
+#: po/rc.cpp:317 po/rc.cpp:326 rc.cpp:317 rc.cpp:326
 msgid "Folder:"
 msgstr "Ordner:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:253 rc.cpp:253
+#: po/rc.cpp:320 rc.cpp:320
 msgid "Extra Options:"
 msgstr "Weitere Optionen:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:256 rc.cpp:256
+#: po/rc.cpp:323 rc.cpp:323
 msgid ""
 "<i><b>NOTE:</b> Due to the way sshfs works, a suitable ssh-askpass "
 "application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter "
 "the password.</i>"
 msgstr ""
-"<i><b>Hinweis:</b> Aufgrund der Art wie sshfs arbeitet, benötigen Sie "
-"eine "
+"<i><b>Hinweis:</b> Aufgrund der Art wie sshfs arbeitet, benötigen Sie eine "
 "geeignete ssh-askpass-Anwendung (ksshaskpass, ssh-askpass-gnome usw.), um "
 "ein Kennwort eingeben zu können.</i>"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:329 rc.cpp:329
 msgid ""
 "<i><b>NOTE:</b> This dialog is only used to add remote devices (e.g. via "
 "Samba), or to access locally mounted folders. For normal media players, "
 "attached via USB, Cantata will automatically display the device when it is "
 "attached.</i>"
 msgstr ""
-"<i><b>Hinweis:</b> Dieser Dialog wird nur verwendet, um entfernte (z. B. "
-"via "
+"<i><b>Hinweis:</b> Dieser Dialog wird nur verwendet, um entfernte (z. B. via "
 "samba) Geräte hinzuzufügen, oder auf lokal eingehängte Ordner zuzugreifen. "
 "Für normale Medienabspieler, welche über USB eingehängt wurden, wird Cantata "
 "diese automatisch anzeigen</i>"
 
-#. i18n: file: dynamic/dynamicpage.ui:23
+#. i18n: file: dynamic/dynamicpage.ui:26
 #. i18n: ectx: property (text), widget (StatusLabel, infoLabel)
-#: po/rc.cpp:265 rc.cpp:265
+#: po/rc.cpp:332 rc.cpp:332
 msgid "No dynamizer port defined in server settings."
 msgstr "Kein Port für Dynamizer ist in den Servereinstellungen vorhanden."
 
-#. i18n: file: dynamic/dynamicpage.ui:30
+#. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:335 rc.cpp:335
 msgid "Remote dynamizer is not running."
 msgstr "Entfernter Dynamizer ist nicht aktiv."
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:338 rc.cpp:338
 msgid "Name of Dynamic Rules"
 msgstr "Name der dynamischen Regeln"
 
 #. i18n: file: dynamic/dynamicrules.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, editBtn)
-#: po/rc.cpp:277 streams/streamspage.cpp:64 rc.cpp:277
+#: po/rc.cpp:344 streams/streamspage.cpp:62 rc.cpp:344
 msgid "Edit"
 msgstr "Bearbeiten"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:283 rc.cpp:283
+#: po/rc.cpp:350 rc.cpp:350
 msgid "About Rules"
 msgstr "Über Regeln"
 
-#. i18n: file: dynamic/dynamicrule.ui:38
+#. i18n: file: dynamic/dynamicrule.ui:37
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:356 rc.cpp:356
+msgid "Include songs that match the following:"
+msgstr "Einbeziehung von Stücken, auf welche folgendes zutrifft:"
+
+#. i18n: file: dynamic/dynamicrule.ui:42
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:359 rc.cpp:359
+msgid "Exclude songs that match the following:"
+msgstr "Ausschluss von Stücken, auf welche folgendes zutrifft:"
+
+#. i18n: file: dynamic/dynamicrule.ui:63
+#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
+#: po/rc.cpp:365 rc.cpp:365
+msgid "Artists similar to:"
+msgstr "Künstler ähnlich zu:"
+
+#. i18n: file: dynamic/dynamicrule.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:368 rc.cpp:368
 msgid "Album Artist:"
 msgstr "Albumkünstler:"
 
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:292 po/rc.cpp:754 rc.cpp:292 rc.cpp:754
-msgid "Album:"
-msgstr "Album:"
-
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:141
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:301 rc.cpp:301
+#: po/rc.cpp:383 rc.cpp:383
 msgid "From Year:"
 msgstr "Von Jahr:"
 
-#. i18n: file: dynamic/dynamicrule.ui:106
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:106
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:304 po/rc.cpp:310 rc.cpp:304 rc.cpp:310
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#: po/rc.cpp:386 po/rc.cpp:392 rc.cpp:386 rc.cpp:392
 msgid "Any"
 msgstr "Jegliches"
 
-#. i18n: file: dynamic/dynamicrule.ui:113
+#. i18n: file: dynamic/dynamicrule.ui:164
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:307 rc.cpp:307
+#: po/rc.cpp:389 rc.cpp:389
 msgid "To Year:"
 msgstr "Zu Jahr:"
 
-#. i18n: file: dynamic/dynamicrule.ui:136
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:313 rc.cpp:313
-msgid "Exact match:"
-msgstr "Exakter Treffer:"
-
-#. i18n: file: dynamic/dynamicrule.ui:160
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:319 rc.cpp:319
-msgid "Include songs that match the following:"
-msgstr "Einbeziehung von Stücken, auf welche folgendes zutrifft:"
-
-#. i18n: file: dynamic/dynamicrule.ui:165
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:322 rc.cpp:322
-msgid "Exclude songs that match the following:"
-msgstr "Ausschluss von Stücken, auf welche folgendes zutrifft:"
+#. i18n: file: dynamic/dynamicrule.ui:187
+#. i18n: ectx: property (text), widget (QCheckBox, exactCheck)
+#: po/rc.cpp:395 rc.cpp:395
+msgid "Exact match"
+msgstr "Exakter Treffer"
 
-#. i18n: file: dynamic/dynamicrule.ui:173
-#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:325 rc.cpp:325
-msgid "Artists similar to:"
-msgstr "Künstler ähnlich zu:"
-
-#. i18n: file: dynamic/dynamicrule.ui:223
+#. i18n: file: dynamic/dynamicrule.ui:231
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:328 rc.cpp:328
+#: po/rc.cpp:398 rc.cpp:398
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
-"<i><b>Hinweis:</b> Nur Werte für Tags angeben, welche auch gesucht "
-"werden.</i>"
+"<i><b>Hinweis:</b> Nur Werte für Tags angeben, welche auch gesucht werden.</"
+"i>"
 
-#. i18n: file: dynamic/dynamicrule.ui:249
+#. i18n: file: dynamic/dynamicrule.ui:260
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:331 rc.cpp:331
+#: po/rc.cpp:401 rc.cpp:401
 msgid ""
 "<i><b>NOTE</b> For genre, end string with an asterisk to match various "
 "genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. </i>"
 msgstr ""
 "<i><b>Hinweis:</b> Für Genre nach dem letzten Buchstaben ein * findet "
-"mehrere "
-"Genre. z. B. 'rock*' findet 'Hard Rock' und 'Rock and Roll'.</i>"
+"mehrere Genre. z. B. 'rock*' findet 'Hard Rock' und 'Rock and Roll'.</i>"
 
-#. i18n: file: gui/coverdialog.ui:23
-#. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:334 rc.cpp:334
-msgid "<html><head/><body><p>Cancel current query</p></body></html>"
-msgstr "<html><head/><body><p>Aktuelle Anfrage abbrechen</p></body></html>"
-
-#. i18n: file: gui/coverdialog.ui:37
+#. i18n: file: gui/coverdialog.ui:30
 #. i18n: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:340 rc.cpp:340
-msgid "<html><head/><body><p>Add a local file</p></body></html>"
-msgstr "<html><head/><body><p>Lokale Datei hinzufügen</p></body></html>"
-
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:717
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:717
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:343 po/rc.cpp:431 rc.cpp:343 rc.cpp:431
-msgid "Save downloaded covers in music folder:"
-msgstr "Speichere heruntergeladene Albencover ins Musikverzeichnis:"
-
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:730
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:730
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:346 po/rc.cpp:434 rc.cpp:346 rc.cpp:434
-msgid "Save downloaded lyrics in music folder:"
-msgstr "Speichere heruntergeladene Songtexte ins Musikverzeichnis:"
-
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:747
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:747
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:349 po/rc.cpp:437 rc.cpp:349 rc.cpp:437
-msgid "Save list of favorite streams in music folder:"
-msgstr "Speichere die Liste der favorisierten Streams ins Musikverzeichnis:"
+#: po/rc.cpp:407 rc.cpp:407
+msgid "Add a local file"
+msgstr ""
 
-#. i18n: file: gui/filesettings.ui:93
-#. i18n: ectx: property (text), widget (QLabel, label_2)
-#. i18n: file: gui/initialsettingswizard.ui:780
-#. i18n: ectx: property (text), widget (QLabel, persNote)
-#. i18n: file: gui/filesettings.ui:93
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#: po/rc.cpp:413 po/rc.cpp:506 rc.cpp:413 rc.cpp:506
+msgid "Save downloaded covers in music folder"
+msgstr "Speichere heruntergeladene Albencover ins Musikverzeichnis"
+
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#: po/rc.cpp:416 po/rc.cpp:509 rc.cpp:416 rc.cpp:509
+msgid "Save downloaded lyrics in music folder"
+msgstr "Speichere heruntergeladene Songtexte ins Musikverzeichnis"
+
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#: po/rc.cpp:419 po/rc.cpp:512 rc.cpp:419 rc.cpp:512
+msgid "Save downloaded backdrops in music folder"
+msgstr "Speichere heruntergeladene Hintergrundbilder ins Musikverzeichnis"
+
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#: po/rc.cpp:422 po/rc.cpp:515 rc.cpp:422 rc.cpp:515
+msgid "Save list of favorite streams in music folder"
+msgstr "Speichere die Liste der favorisierten Streams ins Musikverzeichnis"
+
+#. i18n: file: gui/filesettings.ui:79
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#. i18n: file: gui/initialsettingswizard.ui:780
-#. i18n: ectx: property (text), widget (QLabel, persNote)
-#: po/rc.cpp:352 po/rc.cpp:440 rc.cpp:352 rc.cpp:440
+#: po/rc.cpp:425 rc.cpp:425
 #, fuzzy
 msgid ""
-"<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
-"the music folder, and you do not have write access to this folder, then "
-"Cantata will revert to saving the files in your personal cache folder. "
-"However, for streams, if you do not have write access, then you will only be "
-"able to view (and play) the streams stored in the music folder, and not add "
-"(or edit) any streams. If you elect not to store streams within the music "
-"folder, then these will be saved in your local config folder - and will only "
-"be accessible to yourself.</i>"
+"<i><b>NOTE:</b> If you elect to have Cantata store covers, lyrics, or "
+"backdrops, within the music folder, and you do not have write access to this "
+"folder, then Cantata will revert to saving the files in your personal cache "
+"folder. However, for streams, if you do not have write access, then you will "
+"only be able to view (and play) the streams stored in the music folder, and "
+"not add (or edit) any streams. If you elect not to store streams within the "
+"music folder, then these will be saved in your local config folder - and "
+"will only be accessible to yourself.</i>"
 msgstr ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
 "the music folder, and you do not have write access to this folder, then "
@@ -4064,38 +4793,46 @@ msgstr ""
 "folder, then these will be saved in your local config folder - and will only "
 "be accessible to yourself.</i>"
 
-#. i18n: file: gui/filesettings.ui:128
+#. i18n: file: gui/filesettings.ui:108
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:428 rc.cpp:428
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. (i.e. 'Artist/Album/Tracks')"
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:140
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:355 rc.cpp:355
+#: po/rc.cpp:431 rc.cpp:431
 msgid ""
 "<i><b>NOTE:</b> If you change the location where streams are stored (i.e. "
-"you toggle the 'Save list of favorite streams in music folder' option), "
-"then Cantata will only display streams that are stored in the relevant "
-"location. Therefore, before changing this setting, it is recommended that "
-"you export your existing streams. You can then re-import these to the new "
-"location (after you have toggled the setting).</i>"
-msgstr ""
-"<i><b>Hinweis:</b> Wenn Sie den Speicherort der Streams ändern (z. B. "
-"ändern "
+"you toggle the 'Save list of favorite streams in music folder' option), then "
+"Cantata will only display streams that are stored in the relevant location. "
+"Therefore, before changing this setting, it is recommended that you export "
+"your existing streams. You can then re-import these to the new location "
+"(after you have toggled the setting).</i>"
+msgstr ""
+"<i><b>Hinweis:</b> Wenn Sie den Speicherort der Streams ändern (z. B. ändern "
 "der 'Speichere die Liste der Streams'-Einstellung wird Cantata nur den "
 "gültigen Speicherort anzeigen. Bevor Sie dies also tun, exportieren Sie die "
 "Liste der Streams. Sie können dann Liste der Stream wieder importieren.</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:358 rc.cpp:358
+#: po/rc.cpp:434 rc.cpp:434
 msgid "Cantata First Run"
 msgstr "Cantata erster Start"
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:361 rc.cpp:361
+#: po/rc.cpp:437 rc.cpp:437
 msgid "Welcome to Cantata"
 msgstr "Willkommen bei Cantata"
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:440 rc.cpp:440
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4106,23 +4843,23 @@ msgid ""
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
 "<html><head/><body><p>Cantata ist ein umfangreiches Clientprogramm für den "
-"Music Player "
-"Daemon (MPD). Damit Cantata funktioniert, muss eine laufende Installation von "
-"MPD vorhanden sein.</p><p>Für weitere Information zu MPD besuchen Sie bitte "
-"dessen Webseite unter <a href=\"http://www.musicpd.org\"><span style=\" text-"
-"decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></a></"
-"p><br/><p>Diese 'Hilfsdialog' wird Sie durch die Konfiguration begleiten. "
-"damit Cantata richtig funktioniert.</p></body></html>"
+"Music Player Daemon (MPD). Damit Cantata funktioniert, muss eine laufende "
+"Installation von MPD vorhanden sein.</p><p>Für weitere Information zu MPD "
+"besuchen Sie bitte dessen Webseite unter <a href=\"http://www.musicpd.org"
+"\"><span style=\" text-decoration: underline; color:#0000ff;\">http://www."
+"musicpd.org</span></a></p><br/><p>Diese 'Hilfsdialog' wird Sie durch die "
+"Konfiguration begleiten. damit Cantata richtig funktioniert.</p></body></"
+"html>"
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:443 rc.cpp:443
 msgid "<html><head/><body><p>Welcome to Cantata</p></body></html>"
 msgstr "<html><head/><body><p>Willkommen bei Cantata</p></body></html>"
 
 #. i18n: file: gui/initialsettingswizard.ui:128
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:370 rc.cpp:370
+#: po/rc.cpp:446 rc.cpp:446
 #, fuzzy
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
@@ -4138,31 +4875,14 @@ msgstr ""
 "(or startup) MPD:</p></body></html>"
 
 #. i18n: file: gui/initialsettingswizard.ui:166
-#. i18n: ectx: property (text), widget (QRadioButton, basic)
-#: po/rc.cpp:373 rc.cpp:373
-msgid "Basic single user setup"
-msgstr "Einfache Konfiguration für Einzelnutzer"
-
-#. i18n: file: gui/initialsettingswizard.ui:189
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:449 rc.cpp:449
 msgid "Standard multi-user/server setup"
 msgstr "Standard Mehrbenutzer/Server-Konfiguration"
 
-#. i18n: file: gui/initialsettingswizard.ui:203
-#. i18n: ectx: property (text), widget (BuddyLabel, label_9)
-#: po/rc.cpp:379 rc.cpp:379
-msgid ""
-"<i>Select this option if your music collection is not shared with others, "
-"and you wish Cantata to configure and control the MPD instance.</i>"
-msgstr ""
-"<i>Wählen Sie diese Option, wenn Ihre Musik-Sammlung ist nicht mit anderen "
-"geteilt ist und Sie möchten, dass Cantata zur Konfiguration und Steuerung der "
-"MPD-Instanz dient.</i>"
-
-#. i18n: file: gui/initialsettingswizard.ui:225
+#. i18n: file: gui/initialsettingswizard.ui:179
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:383 rc.cpp:383
+#: po/rc.cpp:452 rc.cpp:452
 #, fuzzy
 msgid ""
 "<i>Select this option if your music collection is shared between users, your "
@@ -4177,9 +4897,26 @@ msgstr ""
 "starting and stopping of the MPD server. You will therfore need to ensure "
 "that MPD is already configured and running.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:260
+#. i18n: file: gui/initialsettingswizard.ui:211
+#. i18n: ectx: property (text), widget (QRadioButton, basic)
+#: po/rc.cpp:455 rc.cpp:455
+msgid "Basic single user setup"
+msgstr "Einfache Konfiguration für Einzelnutzer"
+
+#. i18n: file: gui/initialsettingswizard.ui:224
+#. i18n: ectx: property (text), widget (BuddyLabel, label_9)
+#: po/rc.cpp:458 rc.cpp:458
+msgid ""
+"<i>Select this option if your music collection is not shared with others, "
+"and you wish Cantata to configure and control the MPD instance.</i>"
+msgstr ""
+"<i>Wählen Sie diese Option, wenn Ihre Musik-Sammlung ist nicht mit anderen "
+"geteilt ist und Sie möchten, dass Cantata zur Konfiguration und Steuerung "
+"der MPD-Instanz dient.</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:386 rc.cpp:386
+#: po/rc.cpp:461 rc.cpp:461
 msgid ""
 "<html><head/><body><p>For more information on MPD itself, please refer to "
 "the MPD website <a href=\"http://www.musicpd.org\"><span style=\" text-"
@@ -4188,89 +4925,89 @@ msgid ""
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
 "<html><head/><body><p>Für weitere Informationen für Cantata konsultieren Sie "
-"bitte die MPD-Webseite <a href=\"http://www.musicpd.org\"><span style=\" text-"
-"decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></a></"
-"p><p>Dieser Leitfaden wird Sie durch die Grundeinstellungen für Cantata "
+"bitte die MPD-Webseite <a href=\"http://www.musicpd.org\"><span style=\" "
+"text-decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></"
+"a></p><p>Dieser Leitfaden wird Sie durch die Grundeinstellungen für Cantata "
 "führen.</p></body></html>"
 
-#. i18n: file: gui/initialsettingswizard.ui:319
+#. i18n: file: gui/initialsettingswizard.ui:318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:389 rc.cpp:389
+#: po/rc.cpp:464 rc.cpp:464
 msgid "Connection details"
 msgstr "Verbindungdetails"
 
-#. i18n: file: gui/initialsettingswizard.ui:342
+#. i18n: file: gui/initialsettingswizard.ui:341
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:392 rc.cpp:392
+#: po/rc.cpp:467 rc.cpp:467
 msgid ""
 "The settings below are the basic settings required by Cantata. Please enter "
 "the relevant details, and use the 'Connect' button to test the connection."
 msgstr ""
 "Die folgenden Einstellungen sind die grundlegenden Einstellungen, welche "
-"Cantata benötigt. Bitte die nötigen Details eingeben und die "
-"„Verbinden“-Schaltfläche zum Testen der Verbindung drücken."
+"Cantata benötigt. Bitte die nötigen Details eingeben und die „Verbinden“-"
+"Schaltfläche zum Testen der Verbindung drücken."
 
-#. i18n: file: gui/initialsettingswizard.ui:373
+#. i18n: file: gui/initialsettingswizard.ui:372
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: gui/serversettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
-#. i18n: file: gui/initialsettingswizard.ui:373
+#. i18n: file: gui/initialsettingswizard.ui:372
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: gui/serversettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
-#: po/rc.cpp:395 po/rc.cpp:630 rc.cpp:395 rc.cpp:630
+#: po/rc.cpp:470 po/rc.cpp:796 rc.cpp:470 rc.cpp:796
 msgid "Host (or local socket):"
 msgstr "Host (oder lokaler Socket):"
 
-#. i18n: file: gui/initialsettingswizard.ui:495
+#. i18n: file: gui/initialsettingswizard.ui:494
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:410 rc.cpp:410
+#: po/rc.cpp:485 rc.cpp:485
+#, fuzzy
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
-"lyrics, etc.</i>"
+"lyrics, etc. If you're MPD instance is on a remote host, you may set this to "
+"a HTTP URL.</i>"
 msgstr ""
-"<i><b>Hinweis:</b> Die Musikverzeichnis-Einstellungen dienen der Suche "
-"nach "
+"<i><b>Hinweis:</b> Die Musikverzeichnis-Einstellungen dienen der Suche nach "
 "Covern, Texten usw.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:521
+#. i18n: file: gui/initialsettingswizard.ui:520
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#. i18n: file: gui/serversettings.ui:212
+#. i18n: file: gui/serversettings.ui:225
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#. i18n: file: gui/initialsettingswizard.ui:521
+#. i18n: file: gui/initialsettingswizard.ui:520
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#. i18n: file: gui/serversettings.ui:212
+#. i18n: file: gui/serversettings.ui:225
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#: po/rc.cpp:413 po/rc.cpp:651 rc.cpp:413 rc.cpp:651
+#: po/rc.cpp:488 po/rc.cpp:820 rc.cpp:488 rc.cpp:820
 msgid ""
 "<i><b>NOTE:</b> When using a local socket the full absolute path to the "
 "socket needs to be set. (Port number is not required.)</i>"
 msgstr ""
-"<i><b>Hinweis:</b>Wenn Sie einen lokalen Domain-Socket benutzen, müssen "
-"Sie "
+"<i><b>Hinweis:</b> Wenn Sie einen lokalen Domain-Socket benutzen, müssen Sie "
 "den absoluten Pfad dorthin angeben. (Portnummer wird dann nicht benötigt.)</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:554
+#. i18n: file: gui/initialsettingswizard.ui:553
 #. i18n: ectx: property (text), widget (QLabel, label_13)
-#: po/rc.cpp:416 rc.cpp:416
+#: po/rc.cpp:491 rc.cpp:491
 msgid "Music folder"
 msgstr "Musikverzeichnis"
 
-#. i18n: file: gui/initialsettingswizard.ui:577
+#. i18n: file: gui/initialsettingswizard.ui:576
 #. i18n: ectx: property (text), widget (QLabel, label_12)
-#: po/rc.cpp:419 rc.cpp:419
+#: po/rc.cpp:494 rc.cpp:494
 msgid "Please choose the folder containing your music collection."
 msgstr "Bitte wählen Sie den Ordner mit ihrem Musikverzeichnis."
 
-#. i18n: file: gui/initialsettingswizard.ui:663
+#. i18n: file: gui/initialsettingswizard.ui:662
 #. i18n: ectx: property (text), widget (QLabel, label_6f)
-#: po/rc.cpp:425 rc.cpp:425
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Covers, Lyrics, and Streams"
 msgstr "Cover, Texte und Streams"
 
-#. i18n: file: gui/initialsettingswizard.ui:686
+#. i18n: file: gui/initialsettingswizard.ui:685
 #. i18n: ectx: property (text), widget (QLabel, label_5f)
-#: po/rc.cpp:428 rc.cpp:428
+#: po/rc.cpp:503 rc.cpp:503
 msgid ""
 "<p>Cantata will download missing covers, and lyrics, from the internet. "
 "Cantata also allows you to save a list of internet streams (e.g. Radio "
@@ -4279,31 +5016,63 @@ msgid ""
 "music folder, or within your personal cache/config folders.</p>"
 msgstr ""
 "<p>Cantata wird fehlende Cover und Texte aus dem Internet herunterladen. "
-"Cantata kann auch eine Liste von Streams (z. B. Radiostationen) speichern.</p>"
-"<p>Für jeden dieser Einträge bestätigen Sie bitte, wohin dieser gespeichert "
-"werden soll.</p>"
+"Cantata kann auch eine Liste von Streams (z. B. Radiostationen) speichern.</"
+"p><p>Für jeden dieser Einträge bestätigen Sie bitte, wohin dieser "
+"gespeichert werden soll.</p>"
 
-#. i18n: file: gui/initialsettingswizard.ui:808
-#. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:443 rc.cpp:443
+#. i18n: file: gui/initialsettingswizard.ui:758
+#. i18n: ectx: property (text), widget (QLabel, persNote)
+#: po/rc.cpp:518 rc.cpp:518
+#, fuzzy
+msgid ""
+"<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
+"the music folder, and you do not have write access to this folder, then "
+"Cantata will revert to saving the files in your personal cache folder. "
+"However, for streams, if you do not have write access, then you will only be "
+"able to view (and play) the streams stored in the music folder, and not add "
+"(or edit) any streams. If you elect not to store streams within the music "
+"folder, then these will be saved in your local config folder - and will only "
+"be accessible to yourself.</i>"
+msgstr ""
+"<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
+"the music folder, and you do not have write access to this folder, then "
+"Cantata will revert to saving the files in your personal cache folder. "
+"However, for streams, if you do not have write access, then you will only be "
+"able to view (and play) the streams stored in the music folder, and not add "
+"(or edit) any streams. If you elect not to store streams within the music "
+"folder, then these will be saved in your local config folder - and will only "
+"be accessible to yourself.</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:784
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:521 rc.cpp:521
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. i.e. 'Artist/Album/Tracks'."
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/initialsettingswizard.ui:810
+#. i18n: ectx: property (text), widget (StateLabel, httpNote)
+#: po/rc.cpp:524 rc.cpp:524
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata "
 "currently cannot upload files to external HTTP servers. Therefore, the above "
-"settings should be left disabled.</i>"
+"settings should be left un-checked.</i>"
 msgstr ""
-"<i><b>Hinweis:</b> Das Musikverzeichnis zeigt auf eine  HTTP-Adresse "
-"und Cantata kann aktuell keine Dateien hoch laden. "
-"Daher sollten die obigen Einstellungen deaktiviert werden.</i>"
+"<i><b>Hinweis:</b> Das Musikverzeichnis zeigt auf eine HTTP-Adresse und "
+"Cantata kann aktuell keine Dateien hochladen. Daher sollten die obigen "
+"Einstellungen deaktiviert werden.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:841
+#. i18n: file: gui/initialsettingswizard.ui:843
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:446 rc.cpp:446
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Finished!"
-msgstr "Fertig!"
+msgstr "Fertig."
 
-#. i18n: file: gui/initialsettingswizard.ui:864
+#. i18n: file: gui/initialsettingswizard.ui:866
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:449 rc.cpp:449
+#: po/rc.cpp:530 rc.cpp:530
 msgid ""
 "Cantata is now configured! If you wish to further configure Cantata (to add "
 "extra MPD hosts, etc) then Canta's configuration dialog may be accessed from "
@@ -4313,9 +5082,9 @@ msgstr ""
 "(zusätzliche MPD-Hosts usw.) möchten, dann kann über die Schaltfläche in der "
 "oberen rechten Ecke im Cantata-Hauptfenster darauf zugegriffen werden."
 
-#. i18n: file: gui/initialsettingswizard.ui:902
+#. i18n: file: gui/initialsettingswizard.ui:904
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:452 rc.cpp:452
+#: po/rc.cpp:533 rc.cpp:533
 msgid ""
 "<b>Warning:</b> You are not currently a member of the 'users' group. Cantata "
 "will function better (saving of album covers, lyrics, etc. with the correct "
@@ -4326,364 +5095,435 @@ msgstr ""
 "<b>Achtung:</b> Sie sind aktuell nicht Mitglied der 'users'-Gruppe. Cantata "
 "wird besser funktionieren (Albencover speichern, Texte usw. mit den "
 "richtigen Berechtigungen) wenn Sie  (oder der Systemverwalter) sich selbst "
-"dieser Gruppe hinzufügen. Wenn Sie sich selbst hinzufügen, müssen Sie sich"
-"erneut anmelden, damit die Änderungen aktiv werden."
+"dieser Gruppe hinzufügen. Wenn Sie sich selbst hinzufügen, müssen Sie "
+"sicherneut anmelden, damit die Änderungen aktiv werden."
+
+#. i18n: file: gui/interfacesettings.ui:36
+#. i18n: ectx: attribute (title), widget (QWidget, sidebarTab)
+#: po/rc.cpp:536 rc.cpp:536
+msgid "Sidebar"
+msgstr "Seitenleiste"
+
+#. i18n: file: gui/interfacesettings.ui:42
+#. i18n: ectx: property (title), widget (QGroupBox, viewsGroup)
+#: po/rc.cpp:539 rc.cpp:539
+msgid "Views"
+msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:38
-#. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#. i18n: file: gui/interfacesettings.ui:38
-#. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#: po/rc.cpp:458 po/rc.cpp:477 po/rc.cpp:498 po/rc.cpp:522 rc.cpp:458
-#: rc.cpp:477 rc.cpp:498 rc.cpp:522
-msgid "Style:"
-msgstr "Stil:"
+#. i18n: file: gui/interfacesettings.ui:48
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:542 rc.cpp:542
+msgid "Use the checkboxes below to configure the list of active views."
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, sbPlayQueueLabel)
+#: po/rc.cpp:545 rc.cpp:545
+msgid ""
+"<i><b>NOTE:</b> By default, the play queue appears to the side of the other "
+"views. If you enable the option above, then it will be merged into the "
+"sidebar as per other views.</i>"
+msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:106
+#. i18n: ectx: property (text), widget (StateLabel, sbInfoLabel)
+#: po/rc.cpp:548 rc.cpp:548
+msgid ""
+"<i><b>NOTE:</b> By default, the 'Info' (current song information) view is "
+"accessible by pressing its icon in the main toolbar. If you enable the "
+"option above, then it will be merged into the sidebar as per other views.</i>"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:144
+#. i18n: ectx: property (text), widget (BuddyLabel, sbPositionLabel)
+#: po/rc.cpp:557 rc.cpp:557
+msgid "Position:"
+msgstr "Position:"
+
+#. i18n: file: gui/interfacesettings.ui:157
+#. i18n: ectx: property (text), widget (QCheckBox, sbIconsOnly)
+#: po/rc.cpp:560 rc.cpp:560
+msgid "Only show icons, no text"
+msgstr "Zeige nur Symbole, keinen Text"
+
+#. i18n: file: gui/interfacesettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, sbMonoIcons)
+#: po/rc.cpp:563 rc.cpp:563
+msgid "Use monochrome icons"
+msgstr "Monochrome Symbole"
+
+#. i18n: file: gui/interfacesettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, sbAutoHide)
+#: po/rc.cpp:566 rc.cpp:566
+msgid "Auto-hide"
+msgstr "Seitenleiste automatisch ausblenden"
+
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#: po/rc.cpp:461 po/rc.cpp:480 rc.cpp:461 rc.cpp:480
+#: po/rc.cpp:575 po/rc.cpp:594 rc.cpp:575 rc.cpp:594
 msgid "Covers:"
 msgstr "Cover:"
 
-#. i18n: file: gui/interfacesettings.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:464 rc.cpp:464
-msgid "Show artist images:"
-msgstr "Zeige Künstlerbilder:"
+#. i18n: file: gui/interfacesettings.ui:219
+#. i18n: ectx: property (text), widget (QCheckBox, libraryArtistImage)
+#: po/rc.cpp:578 rc.cpp:578
+msgid "Show artist images"
+msgstr "Zeige Künstlerbilder"
 
-#. i18n: file: gui/interfacesettings.ui:81
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:467 rc.cpp:467
-msgid "Show album year:"
-msgstr "Zeige Veröffentlichungsjahr des Albums:"
+#. i18n: file: gui/interfacesettings.ui:226
+#. i18n: ectx: property (text), widget (QCheckBox, libraryYear)
+#: po/rc.cpp:581 rc.cpp:581
+msgid "Show album year"
+msgstr "Zeige Veröffentlichungsjahr des Albums"
 
-#. i18n: file: gui/interfacesettings.ui:123
+#. i18n: file: gui/interfacesettings.ui:258
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:470 rc.cpp:470
+#: po/rc.cpp:584 rc.cpp:584
 msgid ""
 "<i><b>NOTE:</b> When looking for artist images, Cantata will look for either "
 "artist.jpg, artist.png, 'Artist'.jpg, or 'Artist'.png,\n"
 "within the folder of the current track, or within its parent folder. If no "
-"image is found, Cantata will attempt to download one. When the image is "
-"displayed, it will be cropped (either top/bottom, or left/right) to provide "
-"a square image.</i>"
+"image is found, Cantata will attempt to download one.</i>"
 msgstr ""
-"<i><b>Hinweis:</b> Wenn nach Künstlerbildern gesucht wird, schaut "
-"Cantata "
+"<i><b>Hinweis:</b> Wenn nach Künstlerbildern gesucht wird, schaut Cantata "
 "nach 'Artist'.jpg oder 'Artist'.png\n"
 "im Ordner des aktuellen Titels oder im darüber liegenden Ordner. Ist kein "
-"Bild vorhanden, wird Cantata versuchen eines herunterzuladen. Wenn das Bild "
-"angezeigt wird, ist dieses bereits zugeschnitten auf (oben/unten oder "
-"links/rechts), um ein quadratisches Bild zu bekommen.</i>"
+"Bild vorhanden, wird Cantata versuchen eines herunterzuladen.</i>"
 
-#. i18n: file: gui/interfacesettings.ui:172
+#. i18n: file: gui/interfacesettings.ui:307
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:483 rc.cpp:483
+#: po/rc.cpp:597 rc.cpp:597
 msgid "Sort albums:"
 msgstr "Sortiere Alben:"
 
-#. i18n: file: gui/interfacesettings.ui:183
+#. i18n: file: gui/interfacesettings.ui:318
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:486 rc.cpp:486
+#: po/rc.cpp:600 rc.cpp:600
 msgid "Album/Artist"
 msgstr "Album/Künstler"
 
-#. i18n: file: gui/interfacesettings.ui:188
+#. i18n: file: gui/interfacesettings.ui:323
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:489 rc.cpp:489
+#: po/rc.cpp:603 rc.cpp:603
 msgid "Artist/Album"
 msgstr "Künstler/Album"
 
-#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: file: gui/interfacesettings.ui:328
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:492 rc.cpp:492
+#: po/rc.cpp:606 rc.cpp:606
 msgid "Artist/Year/Album"
 msgstr "Künstler/Jahr/Album"
 
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#: po/rc.cpp:501 po/rc.cpp:531 rc.cpp:501 rc.cpp:531
-#, fuzzy
-msgid "Initially collapse albums:"
-msgstr "Initially collapse albums:"
-
-#. i18n: file: gui/interfacesettings.ui:242
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#: po/rc.cpp:615 po/rc.cpp:645 rc.cpp:615 rc.cpp:645
+msgid "Initially collapse albums"
+msgstr "Alben standardmäßig einklappen"
+
+#. i18n: file: gui/interfacesettings.ui:367
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:504 rc.cpp:504
+#: po/rc.cpp:618 rc.cpp:618
 msgid "Other Views"
 msgstr "Andere Ansichten"
 
-#. i18n: file: gui/interfacesettings.ui:251
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:507 rc.cpp:507
+#. i18n: file: gui/interfacesettings.ui:376
+#. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
+#: po/rc.cpp:621 rc.cpp:621
 msgid "Folder view style:"
 msgstr "Stil der Verzeichnisansicht:"
 
-#. i18n: file: gui/interfacesettings.ui:264
-#. i18n: ectx: property (text), widget (BuddyLabel, label_x)
-#: po/rc.cpp:510 rc.cpp:510
+#. i18n: file: gui/interfacesettings.ui:389
+#. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
+#: po/rc.cpp:624 rc.cpp:624
 msgid "Streams view style:"
 msgstr "Stil der Streamansicht:"
 
-#. i18n: file: gui/interfacesettings.ui:277
-#. i18n: ectx: property (text), widget (BuddyLabel, label_xx)
-#: po/rc.cpp:513 rc.cpp:513
+#. i18n: file: gui/interfacesettings.ui:402
+#. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
+#: po/rc.cpp:627 rc.cpp:627
 msgid "Online view style:"
 msgstr "Stil der Onlineansicht"
 
-#. i18n: file: gui/interfacesettings.ui:290
+#. i18n: file: gui/interfacesettings.ui:415
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:516 rc.cpp:516
+#: po/rc.cpp:630 rc.cpp:630
 msgid "Devices view style:"
 msgstr "Stil der Geräteansicht:"
 
-#. i18n: file: gui/interfacesettings.ui:324
-#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:525 rc.cpp:525
-msgid "Table"
-msgstr "Tabelle"
+#. i18n: file: gui/interfacesettings.ui:469
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueAutoExpand)
+#: po/rc.cpp:648 rc.cpp:648
+msgid "Automatically expand current album"
+msgstr "Automatisch aktuelles Album erweitern"
+
+#. i18n: file: gui/interfacesettings.ui:476
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueScroll)
+#: po/rc.cpp:651 rc.cpp:651
+msgid "Scroll to current track"
+msgstr "Zum aktuellen Stück blättern"
+
+#. i18n: file: gui/interfacesettings.ui:483
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueConfirmClear)
+#: po/rc.cpp:654 rc.cpp:654
+msgid "Prompt before clearing"
+msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:354
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueAutoExpandLabel)
-#: po/rc.cpp:534 rc.cpp:534
-msgid "Automatically expand current album:"
-msgstr "Automatisch aktuelles Album erweitern:"
-
-#. i18n: file: gui/interfacesettings.ui:371
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueScrollLabel)
-#: po/rc.cpp:537 rc.cpp:537
-msgid "Scroll to current track:"
-msgstr "Zum aktuellen Stück blättern:"
-
-#. i18n: file: gui/interfacesettings.ui:384
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueBackgroundLabel)
-#: po/rc.cpp:540 rc.cpp:540
-msgid "Use current album cover as background:"
-msgstr "Benutze aktuelles Cover als Hintergrund:"
-
-#. i18n: file: gui/interfacesettings.ui:398
+#. i18n: file: gui/interfacesettings.ui:509
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_cover)
+#: po/rc.cpp:663 rc.cpp:663
+msgid "Current album cover"
+msgstr "Aktuelles Albencover"
+
+#. i18n: file: gui/interfacesettings.ui:638
 #. i18n: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:543 rc.cpp:543
+#: po/rc.cpp:682 rc.cpp:682
 msgid "External"
 msgstr "Externe Funktionen"
 
-#. i18n: file: gui/interfacesettings.ui:404
-#. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:546 rc.cpp:546
-msgid "Show icon in notification area:"
-msgstr "Zeige Icon in der Systemleiste:"
-
-#. i18n: file: gui/interfacesettings.ui:424
-#. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:549 rc.cpp:549
-msgid "Minimize to notification area when closed:"
-msgstr "Beim Schließen in die Systemleiste minimieren:"
-
-#. i18n: file: gui/interfacesettings.ui:444
-#. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:552 rc.cpp:552
-msgid "Show popup messages when changing tracks:"
-msgstr "Zeige Hinweis beim Liedwechsel:"
-
-#. i18n: file: gui/interfacesettings.ui:461
-#. i18n: ectx: property (text), widget (BuddyLabel, gnomeMediaKeysLabel)
-#: po/rc.cpp:555 rc.cpp:555
-msgid "Support media keys under GNOME/Unity:"
-msgstr "Unterstütze Multimedia-Tasten unter GNOME/Unity"
-
-#. i18n: file: gui/interfacesettings.ui:475
-#. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:558 rc.cpp:558
-msgid "General"
-msgstr "Allgemein"
+#. i18n: file: gui/interfacesettings.ui:644
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayPopup)
+#: po/rc.cpp:685 rc.cpp:685
+msgid "Show popup messages when changing tracks"
+msgstr "Zeige Hinweis beim Liedwechsel"
+
+#. i18n: file: gui/interfacesettings.ui:654
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayCheckBox)
+#: po/rc.cpp:688 rc.cpp:688
+msgid "Show icon in notification area"
+msgstr "Zeige Symbol in der Systemleiste"
+
+#. i18n: file: gui/interfacesettings.ui:664
+#. i18n: ectx: property (text), widget (QCheckBox, minimiseOnClose)
+#: po/rc.cpp:691 rc.cpp:691
+msgid "Minimize to notification area when closed"
+msgstr "Beim Schließen in die Systemleiste minimieren"
+
+#. i18n: file: gui/interfacesettings.ui:671
+#. i18n: ectx: property (title), widget (QGroupBox, startupState)
+#: po/rc.cpp:694 rc.cpp:694
+msgid "On Start-up"
+msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:486
-#. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:561 rc.cpp:561
-msgid "Group single track albums:"
-msgstr "Gruppiere Alben mit nur einem Titel:"
+#. i18n: file: gui/interfacesettings.ui:677
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateShow)
+#: po/rc.cpp:697 rc.cpp:697
+msgid "Show main window"
+msgstr "Zeige Hauptfenster"
 
-#. i18n: file: gui/interfacesettings.ui:503
-#. i18n: ectx: property (text), widget (BuddyLabel, groupMultipleLabel)
-#: po/rc.cpp:564 rc.cpp:564
-msgid "Multiple artist albums:"
-msgstr "Mehrfaches Künstleralbum:"
+#. i18n: file: gui/interfacesettings.ui:684
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateHide)
+#: po/rc.cpp:700 rc.cpp:700
+msgid "Hide main window"
+msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:516
-#. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:567 rc.cpp:567
-msgid "Show delete action in context menus:"
-msgstr "Zeige Löschfunktion im Kontextmenü:"
-
-#. i18n: file: gui/interfacesettings.ui:533
-#. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:570 rc.cpp:570
-msgid "Enforce single-click activation of items:"
-msgstr "Erzwinge Einzelklick zur Aktivierung"
-
-#. i18n: file: gui/interfacesettings.ui:574
-#. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:573 rc.cpp:573
-msgid ""
-"<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
-"setting will require a re-start of Cantata.</i>"
+#. i18n: file: gui/interfacesettings.ui:691
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateRestore)
+#: po/rc.cpp:703 rc.cpp:703
+msgid "Restore previous state"
 msgstr ""
-"<i><b>Hinweis:</b> Änderung von 'Erzwinge Einzelklick'-Einstellung "
-"benötigt "
-"einen Neustart von Cantata.</i>"
 
-#. i18n: file: gui/mainwindow.ui:244
-#. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:576 rc.cpp:576
-msgid "[Dynamic]"
-msgstr "[Dynamik]"
+#. i18n: file: gui/interfacesettings.ui:715
+#. i18n: ectx: attribute (title), widget (QWidget, tab_4)
+#: po/rc.cpp:706 rc.cpp:706
+msgid "General"
+msgstr "Allgemein"
 
-#. i18n: file: gui/playbacksettings.ui:20
-#. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:579 rc.cpp:579
-msgid "Output"
-msgstr "Ausgabe"
+#. i18n: file: gui/interfacesettings.ui:726
+#. i18n: ectx: property (text), widget (QCheckBox, groupSingle)
+#: po/rc.cpp:709 rc.cpp:709
+msgid "Group single track albums"
+msgstr "Gruppiere Alben mit nur einem Titel"
 
-#. i18n: file: gui/playbacksettings.ui:41
-#. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:585 rc.cpp:585
-msgid "Crossfading:"
-msgstr "Überblenden:"
+#. i18n: file: gui/interfacesettings.ui:733
+#. i18n: ectx: property (text), widget (QCheckBox, useComposer)
+#: po/rc.cpp:712 rc.cpp:712
+msgid "Group albums by composer"
+msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:51
-#. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:588 rc.cpp:588
-msgid " seconds"
-msgstr "Sekunden"
+#. i18n: file: gui/interfacesettings.ui:740
+#. i18n: ectx: property (text), widget (QCheckBox, groupMultiple)
+#: po/rc.cpp:715 rc.cpp:715
+msgid "Group multiple artist albums under 'Various Artists'"
+msgstr "Gruppiert unter „Verschiedene Künstler“"
 
-#. i18n: file: gui/playbacksettings.ui:61
-#. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:591 rc.cpp:591
-msgid "Replay gain:"
-msgstr "Lautstärkeanpassung (ReplayGain):"
+#. i18n: file: gui/interfacesettings.ui:747
+#. i18n: ectx: property (text), widget (QCheckBox, fetchCovers)
+#: po/rc.cpp:718 rc.cpp:718
+msgid "Fetch missing covers from Last.fm"
+msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:95
-#. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:594 rc.cpp:594
-msgid "About replay gain"
-msgstr "Über ReplayGain:"
+#. i18n: file: gui/interfacesettings.ui:754
+#. i18n: ectx: property (text), widget (QCheckBox, cacheScaledCovers)
+#: po/rc.cpp:721 rc.cpp:721
+msgid "Cache scaled covers"
+msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:104
-#. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:597 rc.cpp:597
-msgid "Devices:"
-msgstr "Geräte:"
+#. i18n: file: gui/interfacesettings.ui:761
+#. i18n: ectx: property (text), widget (QCheckBox, showDeleteAction)
+#: po/rc.cpp:724 rc.cpp:724
+msgid "Show delete action in context menus"
+msgstr "Zeige Löschfunktion im Kontextmenü"
 
-#. i18n: file: gui/playbacksettings.ui:132
-#. i18n: ectx: property (title), widget (QGroupBox, streamBox)
-#: po/rc.cpp:600 rc.cpp:600
-msgid "HTTP Stream"
-msgstr "HTTP-Stream"
+#. i18n: file: gui/interfacesettings.ui:768
+#. i18n: ectx: property (text), widget (QCheckBox, forceSingleClick)
+#: po/rc.cpp:727 rc.cpp:727
+msgid "Enforce single-click activation of items"
+msgstr "Erzwinge Einzelklick zur Aktivierung von Elementen"
 
-#. i18n: file: gui/playbacksettings.ui:141
-#. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
-#: po/rc.cpp:603 streams/streamdialog.cpp:71 rc.cpp:603
-msgid "URL:"
-msgstr "URL:"
+#. i18n: file: gui/interfacesettings.ui:775
+#. i18n: ectx: property (text), widget (BuddyLabel, langLabel)
+#: po/rc.cpp:730 rc.cpp:730
+msgid "Language:"
+msgstr "Sprache:"
 
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (QLabel, streamUrlInfoLabel)
-#: po/rc.cpp:606 rc.cpp:606
+#. i18n: file: gui/interfacesettings.ui:806
+#. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
+#: po/rc.cpp:733 rc.cpp:733
 msgid ""
-"<i><b>NOTE:</b> This is only of use if you have MPD configured to output to "
-"a HTTP stream, and you wish Cantata to be able to play that stream.</i>"
+"<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
+"setting will require a re-start of Cantata.</i>"
 msgstr ""
-"<i><b>Hinweis:</b> Ausgabe des HTTP-Streams wird nur benutzt, wenn MPD "
-"zur "
-"Benutzung  von HTTP-Streams konfiguriert wurde und Sie wünschen, dass Cantata "
-"diesen benutzt.</i>"
+"<i><b>Hinweis:</b> Zur Änderung der Einzelklick-Einstellung muss Cantata neu "
+"gestartet werden.</i>"
 
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: po/rc.cpp:609 rc.cpp:609
-msgid "Stopping Playback"
-msgstr "Stoppe Wiedergabe"
+#. i18n: file: gui/interfacesettings.ui:835
+#. i18n: ectx: property (text), widget (StateLabel, langNoteLabel)
+#: po/rc.cpp:736 rc.cpp:736
+msgid ""
+"<i><b>NOTE:</b> Changing the language setting will require a re-start of "
+"Cantata.</i>"
+msgstr ""
+"<i><b>Hinweis:</b> Änderung Sprache benötigt "
+"einen Neustart von Cantata.</i>"
+
+#. i18n: file: gui/mainwindow.ui:298
+#. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
+#: po/rc.cpp:739 rc.cpp:739
+msgid "[Dynamic]"
+msgstr "[Dynamik]"
 
-#. i18n: file: gui/playbacksettings.ui:176
+#. i18n: file: gui/playbacksettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:612 rc.cpp:612
+#: po/rc.cpp:745 rc.cpp:745
 msgid "Fadeout on stop:"
 msgstr "Ausblenden bei Stopp:"
 
-#. i18n: file: gui/playbacksettings.ui:189
-#. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:615 rc.cpp:615
-msgid "Stop playback on exit:"
-msgstr "Stoppe Wiedergabe beim Beenden:"
+#. i18n: file: gui/playbacksettings.ui:48
+#. i18n: ectx: property (suffix), widget (QSpinBox, stopFadeDuration)
+#: po/rc.cpp:748 rc.cpp:748
+msgid " ms"
+msgstr " ms"
 
-#. i18n: file: gui/playbacksettings.ui:202
-#. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:618 rc.cpp:618
-msgid "Stop dynamizer on exit:"
-msgstr "Stoppe Dynamizer beim Beenden:"
+#. i18n: file: gui/playbacksettings.ui:58
+#. i18n: ectx: property (text), widget (QCheckBox, stopOnExit)
+#: po/rc.cpp:754 rc.cpp:754
+msgid "Stop playback on exit"
+msgstr "Stoppe Wiedergabe beim Beenden"
+
+#. i18n: file: gui/playbacksettings.ui:65
+#. i18n: ectx: property (text), widget (QCheckBox, stopDynamizerOnExit)
+#: po/rc.cpp:757 rc.cpp:757
+msgid "Stop dynamizer on exit"
+msgstr "Stoppe Dynamizer beim Beenden"
+
+#. i18n: file: gui/playbacksettings.ui:72
+#. i18n: ectx: property (text), widget (QCheckBox, inhibitSuspend)
+#: po/rc.cpp:760 rc.cpp:760
+msgid "Inhibit suspend whilst playing"
+msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:219
+#. i18n: file: gui/playbacksettings.ui:95
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:621 rc.cpp:621
+#: po/rc.cpp:763 rc.cpp:763
 msgid ""
 "<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
 "shown allowing you to choose whether to stop playback now, or after the "
 "current track.</i>"
 msgstr ""
-"<i><b>Hinweis:</b> Wenn Sie die Stopp-Schaltfläche gedrückt halten, "
-"öffnet "
+"<i><b>Hinweis:</b> Wenn Sie die Stopp-Schaltfläche gedrückt halten, öffnet "
 "sich ein Menü für verschiedene Aktionen.</i>"
 
+#. i18n: file: gui/playbacksettings.ui:108
+#. i18n: ectx: property (title), widget (QGroupBox, outputBox)
+#: po/rc.cpp:766 rc.cpp:766
+msgid "Output"
+msgstr "Ausgabe"
+
+#. i18n: file: gui/playbacksettings.ui:129
+#. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
+#: po/rc.cpp:772 rc.cpp:772
+msgid "Crossfade between tracks:"
+msgstr "Überblenden zwischen Stücken:"
+
+#. i18n: file: gui/playbacksettings.ui:139
+#. i18n: ectx: property (suffix), widget (QSpinBox, crossfading)
+#: po/rc.cpp:775 rc.cpp:775
+msgid " s"
+msgstr " s"
+
+#. i18n: file: gui/playbacksettings.ui:152
+#. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
+#: po/rc.cpp:781 rc.cpp:781
+msgid "Replay gain:"
+msgstr "Lautstärkeanpassung (ReplayGain):"
+
+#. i18n: file: gui/playbacksettings.ui:195
+#. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
+#: po/rc.cpp:784 rc.cpp:784
+msgid "About replay gain"
+msgstr "Über ReplayGain"
+
+#. i18n: file: gui/playbacksettings.ui:204
+#. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
+#: po/rc.cpp:787 rc.cpp:787
+msgid "Use the checkboxes below to control the active outputs."
+msgstr ""
+
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:624 rc.cpp:624
+#: po/rc.cpp:790 rc.cpp:790
 msgid "Collection:"
 msgstr "Sammlung:"
 
 #. i18n: file: gui/serversettings.ui:142
 #. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
-#. i18n: file: gui/serversettings.ui:299
+#. i18n: file: gui/serversettings.ui:338
 #. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
 #. i18n: file: gui/serversettings.ui:142
 #. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
-#. i18n: file: gui/serversettings.ui:299
+#. i18n: file: gui/serversettings.ui:338
 #. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
-#: po/rc.cpp:642 po/rc.cpp:657 rc.cpp:642 rc.cpp:657
+#: po/rc.cpp:808 po/rc.cpp:829 rc.cpp:808 rc.cpp:829
 msgid "Cover filename:"
 msgstr "Dateiname des Covers:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:645 rc.cpp:645
+#: po/rc.cpp:811 rc.cpp:811
 msgid "Dynamizer port:"
 msgstr "Dynamizer Port:"
 
-#. i18n: file: gui/serversettings.ui:186
+#. i18n: file: gui/serversettings.ui:168
+#. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
+#: po/rc.cpp:814 rc.cpp:814
+msgid "HTTP stream URL:"
+msgstr "HTTP-Stream-URL:"
+
+#. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:648 rc.cpp:648
+#: po/rc.cpp:817 rc.cpp:817
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art "
 "(either the value specified above, or <code>cover.jpg / cover.png</code> if "
@@ -4691,51 +5531,55 @@ msgid ""
 "folders), then Cantata will save any downloaded covers into the respective "
 "album folder.</i>"
 msgstr ""
-"<i><b>Hinweis:</b> Das Musikverzeichnis wird zur Coversuche benötigt "
-"(z. B. <code>cover.jpg</code>). Wenn Sie die Berechtigung zum Schreiben auf "
-"diese "
+"<i><b>Hinweis:</b> Das Musikverzeichnis wird zur Coversuche benötigt (z. B. "
+"<code>cover.jpg</code>). Wenn Sie die Berechtigung zum Schreiben auf diese "
 "Verzeichnisse (und Unterverzeichnisse) haben, wird Cantata alle "
 "heruntergeladenen Cover in den entsprechenden Albenordner ablegen.</i>"
 
-#. i18n: file: gui/serversettings.ui:314
+#. i18n: file: gui/serversettings.ui:277
+#. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
+#: po/rc.cpp:823 rc.cpp:823
+#, fuzzy
+msgid ""
+"<i><b>NOTE:</b> 'HTTP Stream URL' is only of use if you have MPD configured "
+"to output to a HTTP stream, and you wish Cantata to be able to play that "
+"stream.</i>"
+msgstr ""
+"<i><b>Hinweis:</b> Ausgabe des HTTP-Streams wird nur benutzt, wenn MPD zur "
+"Benutzung  von HTTP-Streams konfiguriert wurde und Sie wünschen, dass "
+"Cantata diesen benutzt.</i>"
+
+#. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:660 rc.cpp:660
+#: po/rc.cpp:832 rc.cpp:832
 msgid ""
 "<i><b>NOTE:</b> If you change the 'Music folder' setting, then you will need "
 "to manually update the music database. This can be performed by pressing the "
 "'Refresh Database' button in the 'Artists' or 'Albums' views.</i>"
 msgstr ""
 "<i><b>Hinweis:</b> Wenn sie die Einstellung zum Musikverzeichnis ändern, "
-"muss "
-"die Musikbibliothek manuell aktualisiert werden. Dies kann über die "
+"muss die Musikbibliothek manuell aktualisiert werden. Dies kann über die "
 "Schaltfläche 'Aktualisiere Datenbank'  ausgeführt werden.</i>"
 
-#. i18n: file: gui/serversettings.ui:340
+#. i18n: file: gui/serversettings.ui:379
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel_2)
-#: po/rc.cpp:663 rc.cpp:663
+#: po/rc.cpp:835 rc.cpp:835
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
 msgstr ""
 "<i><b>Hinweis:</b> Wenn keine Einstellung zum Covernamen angegeben sind, "
-"wird "
-"Cantata den voreingestellten Namen <code>cover</code> nehmen.</i>"
+"wird Cantata den voreingestellten Namen <code>cover</code> nehmen.</i>"
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:666 rc.cpp:666
+#: po/rc.cpp:838 rc.cpp:838
 msgid "Network interface:"
 msgstr "Netzwerkkarte:"
 
-#. i18n: file: http/httpserversettings.ui:38
-#. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:669 rc.cpp:669
-msgid "Current URL:"
-msgstr "Aktuelle URL:"
-
-#. i18n: file: http/httpserversettings.ui:73
+#. i18n: file: http/httpserversettings.ui:57
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:672 rc.cpp:672
+#: po/rc.cpp:841 rc.cpp:841
 msgid ""
 "<i><b>NOTE:</b> MPD usually only plays songs that are stored within its "
 "folders. Cantata contains a minimal HTTP server that can be used to serve "
@@ -4747,250 +5591,306 @@ msgstr ""
 "<i><b>Hinweis:</b> MPD spielt normal nur Stücke welche in seinem "
 "konfigurierten Musikordner sich befinden. Cantata besitzt einen einfachen "
 "HTTP-Server welcher Stücke direkt zu MPD senden kann. Dies funktioniert nur, "
-"wenn Cantata in gestartet ist.<br/>"
-"<br/>\n"
+"wenn Cantata in gestartet ist.<br/><br/>\n"
 "<b>Hinweis:</b> Wenn Sie  'Local loopback' für die  'Netzwerkkarte', "
-"eingestellt "
-"haben <b>muss</b> sich MPD auf dem gleichen Computer befinden.</i>"
+"eingestellt haben <b>muss</b> sich MPD auf dem gleichen Computer befinden.</"
+"i>"
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:676 rc.cpp:676
+#: po/rc.cpp:845 rc.cpp:845
 msgid "Mode:"
 msgstr "Modus:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:682 rc.cpp:682
+#: po/rc.cpp:851 rc.cpp:851
 msgid "HTTP Proxy"
 msgstr "Proxy HTTP"
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:685 rc.cpp:685
+#: po/rc.cpp:854 rc.cpp:854
 msgid "SOCKS Proxy"
 msgstr "Proxy SOCKS"
 
+#. i18n: file: online/onlinesettings.ui:12
+#. i18n: ectx: property (text), widget (QLabel, label)
+#: po/rc.cpp:869 rc.cpp:869
+msgid "Use the checkboxes below to configure the list of active services."
+msgstr ""
+
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:700 rc.cpp:700
+#: po/rc.cpp:875 rc.cpp:875
 msgid ""
 "You can listen for free without an account, but Premium members can listen "
 "to higher quality streams without advertisements. Visit <a href=\"http://www."
 "di.fm/premium/\">http://www.di.fm/premium/</a> to upgrade to a premium "
 "account."
 msgstr ""
-"Sie können auch hören ohne einen Account zu besitzen. Mit einem Premium-Konto "
-"können Sie aber in höherer Qualität und ohne Werbung hören. "
-"Besuchen Sie  <a href=\"http://www.di.fm/premium/\">"
-"http://www.di.fm/premium/</a> um ihr Konto auf Premium "
-"aufzuwerten."
+"Sie können auch hören ohne einen Account zu besitzen. Mit einem Premium-"
+"Konto können Sie aber in höherer Qualität und ohne Werbung hören. Besuchen "
+"Sie  <a href=\"http://www.di.fm/premium/\">http://www.di.fm/premium/</a> um "
+"ihr Konto auf Premium aufzuwerten."
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:703 rc.cpp:703
+#: po/rc.cpp:878 rc.cpp:878
 msgid "Premium Account"
 msgstr "Premium-Konto"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:712 rc.cpp:712
+#: po/rc.cpp:887 rc.cpp:887
 msgid "Stream type:"
 msgstr "Streamtyp:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:715 rc.cpp:715
+#: po/rc.cpp:890 rc.cpp:890
 msgid "Status:"
 msgstr "Status:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:109
 #. i18n: ectx: property (text), widget (QPushButton, loginButton)
-#: po/rc.cpp:718 streams/digitallyimportedsettings.cpp:130
-#: streams/digitallyimportedsettings.cpp:136 rc.cpp:718
+#: po/rc.cpp:893 streams/digitallyimportedsettings.cpp:131
+#: streams/digitallyimportedsettings.cpp:137 rc.cpp:893
 msgid "Login"
 msgstr "Logge ein"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:724 rc.cpp:724
+#: po/rc.cpp:899 rc.cpp:899
 msgid "Session expiry:"
 msgstr "Sitzung abgelaufen:"
 
-#. i18n: file: support/shortcutssettingspage.ui:22
+#. i18n: file: streams/digitallyimportedsettings.ui:151
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:902 rc.cpp:902
+#, fuzzy
+msgid ""
+"<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
+"RockRadio.com, and Sky.fm</i>"
+msgstr ""
+"<i><b>Hinweis:</b> Diese Einstellungen sind nur gültig, wenn das Gerät nicht "
+"verbunden ist.</i>"
+
+#. i18n: file: streams/digitallyimportedsettings.ui:161
+#. i18n: ectx: property (text), widget (QLabel, note2Label)
+#: po/rc.cpp:905 rc.cpp:905
+msgid ""
+"<i><b>NOTE:</b> If you enter account details, then a 'DI' status item will "
+"appear under the list of streams. This will indicate if you are logged in or "
+"not</i>"
+msgstr ""
+
+#. i18n: file: streams/streamssettings.ui:12
+#. i18n: ectx: property (text), widget (QLabel, label)
+#: po/rc.cpp:908 rc.cpp:908
+msgid "Use the checkboxes below to configure the list of active providers."
+msgstr ""
+
+#. i18n: file: streams/streamssettings.ui:47
+#. i18n: ectx: property (text), widget (QPushButton, configureButton)
+#: po/rc.cpp:911 rc.cpp:911
+#, fuzzy
+msgid "Configure Provider"
+msgstr "Geräteeinstellungen"
+
+#. i18n: file: streams/streamssettings.ui:60
+#. i18n: ectx: property (text), widget (QPushButton, installButton)
+#: po/rc.cpp:914 rc.cpp:914
+msgid "Install"
+msgstr ""
+
+#. i18n: file: streams/streamssettings.ui:80
+#. i18n: ectx: property (text), widget (QLabel, note)
+#: po/rc.cpp:920 rc.cpp:920
+#, fuzzy
+msgid ""
+"<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
+"removed.</i>"
+msgstr ""
+"<i><b>Hinweis:</b> Diese Einstellungen sind nur gültig, wenn das Gerät "
+"verbunden ist.</i>"
+
+#. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:727 rc.cpp:727
+#: po/rc.cpp:923 rc.cpp:923
 msgid "Search:"
 msgstr "Suche:"
 
-#. i18n: file: support/shortcutssettingspage.ui:65
+#. i18n: file: support/shortcutssettingswidget.ui:65
 #. i18n: ectx: property (title), widget (QGroupBox, actionBox)
-#: po/rc.cpp:730 rc.cpp:730
+#: po/rc.cpp:926 rc.cpp:926
 msgid "Shortcut for Selected Action"
 msgstr "Tastaturkürzel für gewählte Aktion"
 
-#. i18n: file: support/shortcutssettingspage.ui:71
+#. i18n: file: support/shortcutssettingswidget.ui:71
 #. i18n: ectx: property (text), widget (QRadioButton, useDefault)
-#: po/rc.cpp:733 rc.cpp:733
+#: po/rc.cpp:929 rc.cpp:929
 msgid "Default:"
 msgstr "Voreinstellung:"
 
-#. i18n: file: support/shortcutssettingspage.ui:85
+#. i18n: file: support/shortcutssettingswidget.ui:85
 #. i18n: ectx: property (text), widget (QRadioButton, useCustom)
-#: po/rc.cpp:739 rc.cpp:739
+#: po/rc.cpp:935 rc.cpp:935
 msgid "Custom:"
 msgstr "Eigene Einstellung:"
 
-#. i18n: file: tags/tageditor.ui:22
-#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:742 rc.cpp:742
-msgid "Track:"
-msgstr "Stück:"
-
-#. i18n: file: tags/tageditor.ui:61
+#. i18n: file: tags/tageditor.ui:64
 #. i18n: ectx: property (text), widget (StateLabel, albumArtistLabel)
-#: po/rc.cpp:751 rc.cpp:751
+#: po/rc.cpp:947 rc.cpp:947
 msgid "Album artist:"
 msgstr "Albumkünstler:"
 
-#. i18n: file: tags/tageditor.ui:87
+#. i18n: file: tags/tageditor.ui:103
 #. i18n: ectx: property (text), widget (StateLabel, trackLabel)
-#: po/rc.cpp:757 rc.cpp:757
+#: po/rc.cpp:956 rc.cpp:956
 msgid "Track number:"
 msgstr "Stücknummer:"
 
-#. i18n: file: tags/tageditor.ui:100
+#. i18n: file: tags/tageditor.ui:116
 #. i18n: ectx: property (text), widget (StateLabel, discLabel)
-#: po/rc.cpp:760 rc.cpp:760
+#: po/rc.cpp:959 rc.cpp:959
 msgid "Disc number:"
 msgstr "Disk-Nummer:"
 
-#. i18n: file: tags/trackorganiser.ui:155
+#. i18n: file: tags/trackorganiser.ui:115
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:787 rc.cpp:787
+#: po/rc.cpp:989 rc.cpp:989
 msgid "Original Name"
 msgstr "Ursprünglicher Name"
 
-#. i18n: file: tags/trackorganiser.ui:160
+#. i18n: file: tags/trackorganiser.ui:120
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:790 rc.cpp:790
+#: po/rc.cpp:992 rc.cpp:992
 msgid "New Name"
 msgstr "Neuer Name:"
 
-#: po/rc.cpp:791 rc.cpp:791
+#: po/rc.cpp:996 rc.cpp:996
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "Markus Slopianka"
 
-#: po/rc.cpp:792 rc.cpp:792
+#: po/rc.cpp:997 rc.cpp:997
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "kamikazow at web.de"
 
-#: replaygain/rgdialog.cpp:125
+#: replaygain/rgdialog.cpp:116
 msgid "Show All Tracks"
 msgstr "Zeige alle Stücke"
 
-#: replaygain/rgdialog.cpp:126
+#: replaygain/rgdialog.cpp:117
 msgid "Show Untagged Tracks"
 msgstr "Zeige nicht getaggte Stücke"
 
-#: replaygain/rgdialog.cpp:133 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:124 tags/trackorganiser.cpp:79
 msgid "Remove From List"
 msgstr "Von Liste entfernen"
 
-#: replaygain/rgdialog.cpp:140
-#, fuzzy
+#: replaygain/rgdialog.cpp:131
 msgid "Album Gain"
 msgstr "Album Gain"
 
-#: replaygain/rgdialog.cpp:141
-#, fuzzy
+#: replaygain/rgdialog.cpp:132
 msgid "Track Gain"
 msgstr "Track Gain"
 
-#: replaygain/rgdialog.cpp:142
-#, fuzzy
+#: replaygain/rgdialog.cpp:133
 msgid "Album Peak"
 msgstr "Album Peak"
 
-#: replaygain/rgdialog.cpp:143
-#, fuzzy
+#: replaygain/rgdialog.cpp:134
 msgid "Track Peak"
 msgstr "Track Peak"
 
-#: replaygain/rgdialog.cpp:163 replaygain/rgdialog.cpp:284
+#: replaygain/rgdialog.cpp:154 replaygain/rgdialog.cpp:283
 msgid "Scan"
 msgstr "Untersuche"
 
-#: replaygain/rgdialog.cpp:235
+#: replaygain/rgdialog.cpp:233
 msgid "Update ReplayGain tags in tracks?"
-msgstr "ReplayGain Tags in Dateien aktualisieren?"
+msgstr "ReplayGain-Informationen in den Stücken aktualisieren?"
 
-#: replaygain/rgdialog.cpp:235 replaygain/rgdialog.cpp:236
+#: replaygain/rgdialog.cpp:233 replaygain/rgdialog.cpp:234
 msgid "Update Tags"
 msgstr "Aktualisiere Tags"
 
-#: replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:247
 msgid "Abort scanning of tracks?"
 msgstr "Überprüfung der Stücke abbrechen?"
 
-#: replaygain/rgdialog.cpp:257
+#: replaygain/rgdialog.cpp:256
 msgid "Abort reading of existing tags?"
 msgstr "Lesen der Dateien auf vorhandene Tags abbrechen?"
 
-#: replaygain/rgdialog.cpp:283
+#: replaygain/rgdialog.cpp:282
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
 msgstr ""
-"Suche in <b>allen</b> Stücken?<br><br><i>Hinweis: Alle Stücke besitzen "
-"einen "
+"Suche in <b>allen</b> Stücken?<br><br><i>Hinweis: Alle Stücke besitzen einen "
 "ReplayGain-Tag. </i>"
 
-#: replaygain/rgdialog.cpp:285
+#: replaygain/rgdialog.cpp:284
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr "Wollen Sie alle Dateien untersuchen oder nur die ohne Tags?"
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:285
 msgid "Untagged Tracks"
 msgstr "Nicht getaggte Stücke"
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:285
 msgid "All Tracks"
 msgstr "Alle Stücke"
 
-#: replaygain/rgdialog.cpp:299
+#: replaygain/rgdialog.cpp:295
 msgid "Scanning tracks..."
 msgstr "Untersuche Stücke..."
 
-#: replaygain/rgdialog.cpp:376
+#: replaygain/rgdialog.cpp:362
 msgid "Reading existing tags..."
 msgstr "Lese vorhandene Tags..."
 
-#: replaygain/rgdialog.cpp:447 tags/tageditor.cpp:743
+#: replaygain/rgdialog.cpp:414 tags/tageditor.cpp:798
+msgctxt "filename (Timeout)"
+msgid "%1 (Timeout)"
+msgstr "%1 (Timeout)"
+
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:802
+msgctxt "filename (Corrupt tags?)"
+msgid "%1 (Corrupt tags?)"
+msgstr ""
+
+#: replaygain/rgdialog.cpp:432 tags/tageditor.cpp:812
 msgid "Failed to update the tags of the following tracks:"
 msgstr "Fehler beim aktualisieren der Tags aus den folgenden Stücken:"
 
-#: replaygain/rgdialog.cpp:491 tags/tageditor.cpp:813
-#: tags/trackorganiser.cpp:426
+#: replaygain/rgdialog.cpp:473 tags/tageditor.cpp:885
+#: tags/trackorganiser.cpp:483
 msgid "Device is not connected."
 msgstr "Gerät ist nicht verbunden."
 
-#: replaygain/rgdialog.cpp:529 replaygain/rgdialog.cpp:584
-#: replaygain/rgdialog.cpp:643 replaygain/rgdialog.cpp:645
+#: replaygain/rgdialog.cpp:513 replaygain/rgdialog.cpp:520
+#: replaygain/rgdialog.cpp:599 replaygain/rgdialog.cpp:601
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:559 replaygain/rgdialog.cpp:560
+#: replaygain/rgdialog.cpp:516 replaygain/rgdialog.cpp:517
+#: replaygain/rgdialog.cpp:523 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:575 replaygain/rgdialog.cpp:576
+#: replaygain/rgdialog.cpp:577 replaygain/rgdialog.cpp:578
 msgid "Failed"
 msgstr "Fehler"
 
-#: replaygain/rgdialog.cpp:695 tags/trackorganiser.cpp:380
+#: replaygain/rgdialog.cpp:651 tags/trackorganiser.cpp:428
 msgid "Remove the selected tracks from the list?"
 msgstr "Das ausgewählte Stück von der Liste entfernen?"
 
-#: replaygain/rgdialog.cpp:696 tags/trackorganiser.cpp:381
+#: replaygain/rgdialog.cpp:652 tags/trackorganiser.cpp:429
 msgid "Remove Tracks"
 msgstr "Stücke entfernen?"
 
@@ -5010,18 +5910,22 @@ msgstr "AAC 64k"
 msgid "AAC 128k"
 msgstr "AAC 128k"
 
-#: streams/digitallyimportedsettings.cpp:109
+#: streams/digitallyimportedsettings.cpp:110
 msgid "Logged out"
 msgstr "Ausgeloggt"
 
-#: streams/digitallyimportedsettings.cpp:112
+#: streams/digitallyimportedsettings.cpp:113
 msgid "Logging in..."
 msgstr "Logge ein...."
 
-#: streams/digitallyimportedsettings.cpp:136
+#: streams/digitallyimportedsettings.cpp:137
 msgid "Logout"
 msgstr "Ausloggen"
 
+#: streams/streamdialog.cpp:72
+msgid "URL:"
+msgstr "URL:"
+
 #: streams/streamdialog.cpp:76
 msgid "Just add to play queue, do not save"
 msgstr "Nur zur Warteschlange hinzufügen und nicht speichern"
@@ -5042,245 +5946,237 @@ msgstr "Stream bearbeiten"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>FEHLER:</b> Ungültiges Protokoll</i>"
 
-#: streams/streamfetcher.cpp:198
+#: streams/streamfetcher.cpp:209
 msgid "Fetching %1"
 msgstr "Hole %1"
 
-#: streams/streamspage.cpp:61
+#: streams/streamspage.cpp:59
 msgid "Import Streams Into Favorites"
 msgstr "Stream importieren und den Favoriten hinzufügen"
 
-#: streams/streamspage.cpp:62
+#: streams/streamspage.cpp:60
 msgid "Export Favorite Streams"
 msgstr "Favorisierte Streams exportieren"
 
-#: streams/streamspage.cpp:63
+#: streams/streamspage.cpp:61
 msgid "Add New Stream To Favorites"
 msgstr "Füge neuen Stream zu den Favoriten hinzu"
 
-#: streams/streamspage.cpp:123
-msgid "Search TuneIn:"
-msgstr "Suche in TuneIn:"
+#: streams/streamspage.cpp:125
+msgctxt "Service name"
+msgid "Digitally Imported"
+msgstr "Digitally Imported"
 
-#: streams/streamspage.cpp:239
+#: streams/streamspage.cpp:243
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|XML-Streams"
 
-#: streams/streamspage.cpp:239 streams/streamspage.cpp:241
+#: streams/streamspage.cpp:243 streams/streamspage.cpp:245
 msgid "Import Streams"
 msgstr "Stream importieren"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:246
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "XML-Streams (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:250
+#: streams/streamspage.cpp:254
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr ""
 "Import von <b>%1</b> fehlgeschlagen.<br/>Bitte überprüfen Sie, ob der Typ "
 "korrekt ist."
 
-#: streams/streamspage.cpp:262
+#: streams/streamspage.cpp:266
 msgid "*.xml|XML Streams"
 msgstr "*.xml|XML-Streams"
 
-#: streams/streamspage.cpp:262 streams/streamspage.cpp:264
+#: streams/streamspage.cpp:266 streams/streamspage.cpp:268
 msgid "Export Streams"
 msgstr "Stream exportieren"
 
-#: streams/streamspage.cpp:264
+#: streams/streamspage.cpp:268
 msgid "XML Streams (*.xml)"
 msgstr "XML-Streams (*.xml)"
 
-#: streams/streamspage.cpp:276
+#: streams/streamspage.cpp:280
 msgid "Failed to create <b>%1</b>!"
 msgstr "Fehler beim Erstellen von <b>%1</b>."
 
-#: streams/streamspage.cpp:293 streams/streamspage.cpp:489
+#: streams/streamspage.cpp:297 streams/streamspage.cpp:493
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "Stream existiert bereits.<br/><b>%1</b>"
 
-#: streams/streamspage.cpp:295 streams/streamspage.cpp:491
+#: streams/streamspage.cpp:299 streams/streamspage.cpp:495
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "Der Stream mit dem Namen <b>%1</b> existiert bereits."
 
-#: streams/streamspage.cpp:315
+#: streams/streamspage.cpp:319
 msgid "Bookmark added"
 msgstr "Lesezeichen hinzugefügt"
 
-#: streams/streamspage.cpp:317
+#: streams/streamspage.cpp:321
 msgid "Already bookmarked"
 msgstr "Bereits in den Lesezeichen"
 
-#: streams/streamspage.cpp:363
+#: streams/streamspage.cpp:367
 msgid "Added to favorites"
 msgstr "Zu Favoriten hinzugefügt"
 
-#: streams/streamspage.cpp:365
+#: streams/streamspage.cpp:369
 msgid "Already in favorites"
 msgstr "Existiert bereits in Favoriten"
 
-#: streams/streamspage.cpp:390
+#: streams/streamspage.cpp:394
 msgid "Reload <b>%1</b> streams?"
 msgstr "Erneutes Laden <b>%1</b> der Streams?"
 
-#: streams/streamspage.cpp:408
+#: streams/streamspage.cpp:412
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr "Wollen Sie wirklich das Lesezeichen <b>%1</b> entfernen?"
 
-#: streams/streamspage.cpp:414
+#: streams/streamspage.cpp:418
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr "Wollen Sie wirklich alle <b>%1</b> Lesezeichen entfernen?"
 
-#: streams/streamspage.cpp:442
+#: streams/streamspage.cpp:446
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "Wollen Sie wirklich die gewählten %1 Streams entfernen?"
 
-#: streams/streamspage.cpp:446
+#: streams/streamspage.cpp:450 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "Wollen Sie wirklich <b>%1</b> entfernen?"
 
-#: streams/streamspage.cpp:609
-msgid "Logged into Digitally Imported"
-msgstr "Eingeloggt bei Digitally Imported"
+#: streams/streamspage.cpp:561 streams/streamspage.cpp:577
+msgid "Search %1:"
+msgstr "Suche %1:"
 
-#: streams/streamspage.cpp:609
-msgid "<b>NOT</b> logged into Digitally Imported"
-msgstr "<b>NICHT</b> eingeloggt bei Digitally Imported"
+#: streams/streamssettings.cpp:125
+msgid "*.streams|Cantata Streams"
+msgstr "*.cantata|Cantata-Streams"
 
-#: support/dialog.cpp:89
+#: streams/streamssettings.cpp:125 streams/streamssettings.cpp:127
+#, fuzzy
+msgid "Install Streams"
+msgstr "Stream importieren"
+
+#: streams/streamssettings.cpp:127
+msgid "Cantata Streams (*.streams)"
+msgstr "Cantata-Streams (*.streams)"
+
+#: streams/streamssettings.cpp:144
+msgid "A category named <b>%1</b> already exists!<br/>Overwrite?"
+msgstr ""
+"Eine Kategorie mit Namen <b>%1</b>existiert bereits.<br/> "
+"Überschreiben?"
+
+#: streams/streamssettings.cpp:150
+#, fuzzy
+msgid "Failed top open %1"
+msgstr "Fehler beim Speichern von %1"
+
+#: streams/streamssettings.cpp:163
+msgid "Invalid file format!"
+msgstr ""
+
+#: streams/streamssettings.cpp:170
+#, fuzzy
+msgid "Failed to create stream category folder!"
+msgstr "Fehler beim Erstellen des Zielordners<br/>%1"
+
+#: streams/streamssettings.cpp:176
+#, fuzzy
+msgid "Failed to save stream list!"
+msgstr "Fehler beim herunterladen der Streamliste"
+
+#: streams/streamssettings.cpp:227
+#, fuzzy
+msgid "Failed to remove streams folder!"
+msgstr "Fehler beim Entfernen der bestehenden Regeldatei – %1"
+
+#: support/dialog.cpp:73
 msgid "&OK"
 msgstr "&OK"
 
-#: support/dialog.cpp:90
+#: support/dialog.cpp:74
 msgid "&Cancel"
 msgstr "&Abbrechen"
 
-#: support/dialog.cpp:91
+#: support/dialog.cpp:75
 msgid "&Yes"
 msgstr "&Ja"
 
-#: support/dialog.cpp:92
+#: support/dialog.cpp:76
 msgid "&No"
 msgstr "&Nein"
 
-#: support/dialog.cpp:93
+#: support/dialog.cpp:77
 msgid "&Discard"
 msgstr "&Verwerfen"
 
-#: support/dialog.cpp:94
+#: support/dialog.cpp:78
 msgid "&Save"
 msgstr "&Speichern"
 
-#: support/dialog.cpp:95
+#: support/dialog.cpp:79
 msgid "&Apply"
 msgstr "&Anwenden"
 
-#: support/dialog.cpp:96
+#: support/dialog.cpp:80
 msgid "&Close"
-msgstr "&Schließen"
+msgstr "S&chließen"
 
-#: support/dialog.cpp:98
+#: support/dialog.cpp:82
 msgid "&Overwrite"
 msgstr "&Überschreiben:"
 
-#: support/dialog.cpp:99
+#: support/dialog.cpp:83
 msgid "&Reset"
 msgstr "&Zurücksetzen"
 
-#: support/dialog.cpp:100
+#: support/dialog.cpp:84
 msgid "&Continue"
 msgstr "&Fortsetzen"
 
-#: support/dialog.cpp:101
+#: support/dialog.cpp:85
 msgid "&Delete"
-msgstr "&Lösche"
+msgstr "&Löschen"
 
-#: support/dialog.cpp:102
+#: support/dialog.cpp:86
 msgid "&Stop"
 msgstr "&Stopp"
 
-#: support/dialog.cpp:103
+#: support/dialog.cpp:87
 msgid "&Remove"
 msgstr "&Entfernen"
 
-#: support/dialog.cpp:104
+#: support/dialog.cpp:88
 msgid "&Previous"
-msgstr "&Vorheriger"
+msgstr "&Vorheriges"
 
-#: support/dialog.cpp:105
+#: support/dialog.cpp:89
 msgid "&Next"
-msgstr "&Nächster"
-
-#: support/fancytabwidget.cpp:952
-msgid "Icons Only"
-msgstr "Nur Symbole"
-
-#: support/fancytabwidget.cpp:953
-msgid "Style"
-msgstr "Stil"
-
-#: support/fancytabwidget.cpp:954
-msgid "Large Sidebar"
-msgstr "Große Seitenleiste"
-
-#: support/fancytabwidget.cpp:955
-msgid "Small Sidebar"
-msgstr "Kleine Seitenleiste"
-
-#: support/fancytabwidget.cpp:956
-msgid "Top Bar"
-msgstr "Obere Leiste"
-
-#: support/fancytabwidget.cpp:957
-msgid "Bottom Bar"
-msgstr "Untere Leiste"
-
-#: support/fancytabwidget.cpp:958
-msgid "Tabs On Side"
-msgstr "Karteireiter seitlich"
+msgstr "&Nächstes"
 
-#: support/fancytabwidget.cpp:959
-msgid "Tabs On Top"
-msgstr "Karteireiter oben"
-
-#: support/fancytabwidget.cpp:960
-msgid "Tabs On Bottom"
-msgstr "Karteireiter unten"
-
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Password"
 msgstr "Kennwort"
 
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Please enter password:"
 msgstr "Bitte Kennwort eingeben:"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:124
 msgid "Warning"
 msgstr "Warnung"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:119
 msgid "Question"
 msgstr "Frage"
 
-#: support/messagebox.cpp:76 support/messagebox.h:57
-msgid "Error"
-msgstr "Fehler"
-
-#: support/messagebox.h:60
+#: support/messagebox.h:65
 msgid "Information"
 msgstr "Information"
 
-#: support/onoffbutton.cpp:47
-msgid "ON"
-msgstr "AN"
-
-#: support/onoffbutton.cpp:48
-msgid "OFF"
-msgstr "AUS"
-
 #: support/pathrequester.cpp:50
 msgid "Select Folder"
 msgstr "Gewählter Ordner"
@@ -5289,63 +6185,69 @@ msgstr "Gewählter Ordner"
 msgid "Select File"
 msgstr "Wähle Datei"
 
-#: support/utils.cpp:271 support/utils.cpp:279
+#: support/utils.cpp:390 support/utils.cpp:398
 msgid "%1 B"
 msgstr "%1 B"
 
-#: support/utils.cpp:272
+#: support/utils.cpp:391
 msgid "%1 kB"
 msgstr "%1 kB"
 
-#: support/utils.cpp:273
+#: support/utils.cpp:392
 msgid "%1 MB"
 msgstr "%1 MB"
 
-#: support/utils.cpp:275
+#: support/utils.cpp:394
 msgid "%1 GB"
 msgstr "%1 GB"
 
-#: support/utils.cpp:280
+#: support/utils.cpp:399
 msgid "%1 KiB"
 msgstr "%1 KiB"
 
-#: support/utils.cpp:281
+#: support/utils.cpp:400
 msgid "%1 MiB"
 msgstr "%1 MiB"
 
-#: support/utils.cpp:283
+#: support/utils.cpp:402
 msgid "%1 GiB"
 msgstr "%1 GiB"
 
-#: tags/tageditor.cpp:131
+#: support/utils.cpp:602
+msgid "1 day %2"
+msgid_plural "%1 days %2"
+msgstr[0] "Ein Tag %2"
+msgstr[1] "%1 Tage %2"
+
+#: tags/tageditor.cpp:147
 msgid "Tags"
 msgstr "Tags"
 
-#: tags/tageditor.cpp:144
+#: tags/tageditor.cpp:160
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr "Setze 'Albumkünstler' von 'Künstler'"
 
-#: tags/tageditor.cpp:228 tags/tageditor.cpp:549
+#: tags/tageditor.cpp:261 tags/tageditor.cpp:592
 msgid "All tracks"
 msgstr "Alle Stücke"
 
-#: tags/tageditor.cpp:282
+#: tags/tageditor.cpp:323
 msgid "(Various)"
 msgstr "(Verschiedene)"
 
-#: tags/tageditor.cpp:325
+#: tags/tageditor.cpp:368
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr ""
 "Hinzufügen der „Verschiedene Künstler“ Problembehebung bei <b>allen</b> "
 "Stücken?"
 
-#: tags/tageditor.cpp:367
+#: tags/tageditor.cpp:410
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr ""
 "Zurücksetzen der „Verschiedene Künstler“ Problembehebung bei <b>allen</b> "
 "Stücken?"
 
-#: tags/tageditor.cpp:417
+#: tags/tageditor.cpp:460
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5353,15 +6255,15 @@ msgstr ""
 "Setze 'Albumkünstler'  mit 'Künstler' (wenn 'Albumkünstler' leer ist) bei "
 "<b>allen</b> Stücken?"
 
-#: tags/tageditor.cpp:418
+#: tags/tageditor.cpp:461
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr "Setze 'Albumkünstler' mit 'Künstler' (wenn 'Albumkünstler' leer ist)?"
 
-#: tags/tageditor.cpp:419
+#: tags/tageditor.cpp:462
 msgid "Album Artist from Artist"
 msgstr "Setze Albumkünstler von Künstler"
 
-#: tags/tageditor.cpp:452
+#: tags/tageditor.cpp:495
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5369,45 +6271,53 @@ msgstr ""
 "Ersten Buchstaben von 'Title', 'Artist', 'Album artist', and 'Album' in "
 "Großbuchstaben von <b>allen</b> Stücken?"
 
-#: tags/tageditor.cpp:485
+#: tags/tageditor.cpp:528
 msgid "Adjust the value of each track number by:"
 msgstr "Angleichen des Wertes einer jeden Stücknummer durch:"
 
-#: tags/tageditor.cpp:543
+#: tags/tageditor.cpp:586
 msgid "All tracks [modified]"
 msgstr "Alle Stücke [geändert]"
 
-#: tags/tageditor.cpp:545
+#: tags/tageditor.cpp:588
 msgid "%1 [modified]"
 msgstr "%1 [geändert]"
 
-#: tags/tageditor.cpp:758
+#: tags/tageditor.cpp:827
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr ""
 "Möchten Sie Ihre Song Dateien so umbenennen, dass Sie zu Ihren Tags passen?"
 
-#: tags/tageditor.cpp:759
+#: tags/tageditor.cpp:828
 msgid "Rename Files"
 msgstr "Dateien umbenennen"
 
-#: tags/trackorganiser.cpp:143
+#: tags/trackorganiser.cpp:164
 msgid "Abort renaming of files?"
 msgstr "Umbenennen der Dateien abbrechen?"
 
-#: tags/trackorganiser.cpp:257
+#: tags/trackorganiser.cpp:279
+msgid "Source file does not exist!<br/>%1"
+msgstr "Quelldatei existiert nicht.<br/>%1"
+
+#: tags/trackorganiser.cpp:298
 msgid "Destination file already exists!<br/>%1"
 msgstr "Zieldateiname existiert bereits.<br/>%1"
 
-#: tags/trackorganiser.cpp:279
+#: tags/trackorganiser.cpp:320
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "Fehler beim Erstellen des Zielordners<br/>%1"
 
-#: tags/trackorganiser.cpp:300
+#: tags/trackorganiser.cpp:341
 msgid "Failed to rename %1 to %2"
 msgstr "Fehler beim Umbenennen %1 zu %2"
 
-#: widgets/coverwidget.cpp:258
+#: widgets/coverwidget.cpp:280
+msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
+msgstr "<tr><td align=\"right\">Komponist:</td><td>%1</td></tr>"
+
+#: widgets/coverwidget.cpp:282
 msgid ""
 "<tr><td align=\"right\"><b>Artist:</b></td><td>%1</td></tr><tr><td align="
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Year:"
@@ -5417,35 +6327,85 @@ msgstr ""
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Jahr:"
 "</b></td><td>%3</td></tr>"
 
-#: widgets/genrecombo.cpp:59
+#: widgets/genrecombo.cpp:44
+msgid "Filter On Genre"
+msgstr ""
+
+#: widgets/genrecombo.cpp:66
 msgid "All Genres"
 msgstr "Alle Genre"
 
-#: widgets/groupedview.cpp:266
+#: widgets/groupedview.cpp:265
+msgctxt "album (albumYear)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: widgets/groupedview.cpp:267
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 – %2 (%3)"
 
-#: widgets/itemview.cpp:478
+#: widgets/itemview.cpp:561
 msgid "Go Back"
 msgstr "Zurück"
 
-#: widgets/itemview.cpp:482
+#: widgets/itemview.cpp:566
 msgid "Go Home"
 msgstr "Gehe zur Übersicht"
 
-#: widgets/menubutton.cpp:36
-msgid "Other Actions"
-msgstr "Andere Aktionen"
+#: widgets/menubutton.cpp:39
+msgid "Menu"
+msgstr "Menü"
 
-#: widgets/searchwidget.cpp:62
+#: widgets/searchwidget.cpp:63
 msgid "Search..."
 msgstr "Suche..."
 
-#: widgets/searchwidget.cpp:66
+#: widgets/searchwidget.cpp:67
 msgid "Close Search Bar"
 msgstr "Schließe Suchleiste"
 
+#: widgets/servicestatuslabel.cpp:43
+msgid "Logged into %1"
+msgstr "Angemeldet bei %1"
+
+#: widgets/servicestatuslabel.cpp:44
+msgid "<b>NOT</b> logged into %1"
+msgstr "<b>NICHT</b> eingeloggt bei %1"
+
+#: widgets/songdialog.cpp:49
+msgid ""
+"<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
+"\" setting, and MPD's \"music_directory\" setting.</p>"
+msgstr ""
+
+#: widgets/songdialog.cpp:52
+msgid ""
+"<p>Cannot access song files!<br/><br/>Please check that the device is still "
+"attached.</p>"
+msgstr ""
+
+#: widgets/volumeslider.cpp:115 widgets/volumeslider.cpp:230
+#: widgets/volumeslider.cpp:237
+msgid "Mute"
+msgstr "Stumm"
+
+#: widgets/volumeslider.cpp:198
+msgid "Muted"
+msgstr "Stumm"
+
+#: widgets/volumeslider.cpp:237
+msgid "Unmute"
+msgstr ""
+
+#: widgets/volumeslider.cpp:284
+msgid "Volume %1% (Muted)"
+msgstr "Lautstärke %1% (Stumm)"
+
+#: widgets/volumeslider.cpp:284
+msgid "Volume %1%"
+msgstr "Lautstärke %1%"
+
 #: ../gui/qtplural.h:30
 msgctxt "Singular"
 msgid "1 Track"
@@ -5524,6 +6484,212 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Rules"
 msgstr "%1 Regeln"
 
+#: ../gui/qtplural.h:58
+msgctxt "Singular"
+msgid "1 Podcast"
+msgstr "Ein Podcast"
+
+#: ../gui/qtplural.h:59
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Podcasts"
+msgstr "%1 Podcasts"
+
+#: ../gui/qtplural.h:62
+msgctxt "Singular"
+msgid "1 Episode"
+msgstr "Eine Episode"
+
+#: ../gui/qtplural.h:63
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Episodes"
+msgstr "%1 Episoden"
+
+#~ msgid "Transcoding failed.<br/><br/"
+#~ msgstr "Fehler beim Umwandeln.<br/><br/"
+
+#~ msgid ""
+#~ "Failed to download track - too many redirects encountered.<br/><br/"
+#~ msgstr "Fehler beim Download – zu viele Umleitungen.<br/><br/"
+
+#~ msgid "Failed to download track.<br/><br/"
+#~ msgstr "Fehler beim Herunterladen des Stückes."
+
+#~ msgid "<b>Error</b><br/>"
+#~ msgstr "<b>Fehler</b><br/>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
+#~ "td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Künstler:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Stück:</"
+#~ "td><td>%3</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Destination file:</td><td>%2</td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Quelldatei:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Zieldatei:</td><td>%2</td></tr>"
+
+#~ msgid ""
+#~ "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
+#~ "i></tr>"
+#~ msgstr ""
+#~ "<tr><i><td align=\"right\"><i>Verbleibende Zeit:</i></td><td><i>%5</i></"
+#~ "td></i></tr>"
+
+#, fuzzy
+#~ msgid ""
+#~ "<p>The following variables will be replaced with their corresponding "
+#~ "meaning for each track name.</p><p><table border="
+#~ "\"1\"><tr><th><em>Button</em></th><th><em>Variable</em></"
+#~ "th><th><em>Description</em></th></tr><tr><td>%albumartist%</td><td>%1</"
+#~ "td><td>The artist of the album. For most albums, this will be the same as "
+#~ "the <i>Track Artist.</i> For compilations, this will often be <i>Various "
+#~ "Artists.</i> </td></tr><tr><td>%album%</td><td>%2</td><td>The name of the "
+#~ "album.</td></tr><tr><td>%artist%</td><td>%3</td><td>The artist of each "
+#~ "track.</td></tr><tr><td>%title%</td><td>%4</td><td>The track title "
+#~ "(without <i>Track Artist</i>).</td></tr><tr><td>%artistandtitle%</td><td>"
+#~ "%5</td><td>The track title (with <i>Track Artist</i>, if different to "
+#~ "<i>Album Artist</i>).</td></tr><tr><td>%track%</td><td>%6</td><td>The "
+#~ "track number.</td></tr><tr><td>%discnumber%</td><td>%7</td><td>The album "
+#~ "number of a multi-album album. Often compilations consist of several "
+#~ "albums.</td></tr><tr><td>%year%</td><td>%8</td><td>The year of the "
+#~ "album's release.</td></tr><tr><td>%genre%</td><td>%9</td><td>The genre of "
+#~ "the album.</td></tr></table></p>"
+#~ msgstr ""
+#~ "<p>The following variables will be replaced with their corresponding "
+#~ "meaning for each track name.</p><p><table border="
+#~ "\"1\"><tr><th><em>Button</em></th><th><em>Variable</em></"
+#~ "th><th><em>Description</em></th></tr><tr><td>%1</td><td>%2</td><td>The "
+#~ "artist of the album. For most albums, this will be the same as the "
+#~ "<i>Track Artist.</i> For compilations, this will often be <i>Various "
+#~ "Artists.</i> </td></tr><tr><td>%3</td><td>%4</td><td>The name of the "
+#~ "album.</td></tr><tr><td>%5</td><td>%6</td><td>The artist of each track.</"
+#~ "td></tr><tr><td>%7</td><td>%8</td><td>The track title (without <i>Track "
+#~ "Artist</i>).</td></tr><tr><td>%9</td><td>%10</td><td>The track title "
+#~ "(with <i>Track Artist</i>, if different to <i>Album Artist</i>).</td></"
+#~ "tr><tr><td>%11</td><td>%12</td><td>The track number.</td></tr><tr><td>"
+#~ "%13</td><td>%14</td><td>The album number of a multi-album album. Often "
+#~ "compilations consist of several albums.</td></tr><tr><td>%15</td><td>%16</"
+#~ "td><td>The year of the album's release.</td></tr><tr><td>%17</td><td>%18</"
+#~ "td><td>The genre of the album.</td></tr></table></p>"
+
+#~ msgctxt ""
+#~ "Google\n"
+#~ "width x height (file size)"
+#~ msgid ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+#~ msgstr ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+
+#~ msgctxt ""
+#~ "Discogs\n"
+#~ "width x height"
+#~ msgid ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+#~ msgstr ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+
+#~ msgid "Grouped by 'Album Artist'"
+#~ msgstr "Gruppiert unter 'Albumkünstler'"
+
+#~ msgid "Search Play Queue"
+#~ msgstr "Suche in Warteschlange"
+
+#~ msgid "Volume Disabled"
+#~ msgstr "Lautstärke nicht einstellbar"
+
+#~ msgid "Do not fadeout"
+#~ msgstr "Nicht ausblenden"
+
+#~ msgid "Inactive"
+#~ msgstr "Inaktiv"
+
+#~ msgid "Configure Online Service"
+#~ msgstr "Bearbeite Onlinedienst"
+
+#~ msgid "Refresh Online Service"
+#~ msgstr "Aktualisiere Onlinedienst"
+
+#~ msgctxt "Track Number (#)"
+#~ msgid "#"
+#~ msgstr "#"
+
+#~ msgid "Use backdrop"
+#~ msgstr "Benutzer Hintergrund"
+
+#~ msgid "<html><head/><body><p>Cancel current query</p></body></html>"
+#~ msgstr "<html><head/><body><p>Aktuelle Anfrage abbrechen</p></body></html>"
+
+#~ msgid "<html><head/><body><p>Add a local file</p></body></html>"
+#~ msgstr "<html><head/><body><p>Lokale Datei hinzufügen</p></body></html>"
+
+#~ msgid "Use current album cover as background:"
+#~ msgstr "Benutze aktuelles Cover als Hintergrund:"
+
+#~ msgid "Support media keys under GNOME/Unity:"
+#~ msgstr "Unterstütze Multimedia-Tasten unter GNOME/Unity"
+
+#~ msgid "Multiple artist albums:"
+#~ msgstr "Mehrfaches Künstleralbum:"
+
+#~ msgid "Crossfading:"
+#~ msgstr "Überblenden:"
+
+#~ msgid " seconds"
+#~ msgstr "Sekunden"
+
+#~ msgid "Devices:"
+#~ msgstr "Geräte:"
+
+#~ msgid "Stopping Playback"
+#~ msgstr "Stoppe Wiedergabe"
+
+#~ msgid "Current URL:"
+#~ msgstr "Aktuelle URL:"
+
+#~ msgid "Search TuneIn:"
+#~ msgstr "Suche in TuneIn:"
+
+#~ msgid "Logged into Digitally Imported"
+#~ msgstr "Eingeloggt bei Digitally Imported"
+
+#~ msgid "Icons Only"
+#~ msgstr "Nur Symbole"
+
+#~ msgid "Style"
+#~ msgstr "Stil"
+
+#~ msgid "Small Sidebar"
+#~ msgstr "Kleine Seitenleiste"
+
+#~ msgid "Tabs On Side"
+#~ msgstr "Karteireiter seitlich"
+
+#~ msgid "Tabs On Top"
+#~ msgstr "Karteireiter oben"
+
+#~ msgid "Tabs On Bottom"
+#~ msgstr "Karteireiter unten"
+
+#~ msgid "ON"
+#~ msgstr "AN"
+
+#~ msgid "OFF"
+#~ msgstr "AUS"
+
+#~ msgid "Other Actions"
+#~ msgstr "Andere Aktionen"
+
 #~ msgid "Disc %1"
 #~ msgstr "Disc %1"
 
@@ -5533,9 +6699,6 @@ msgstr "%1 Regeln"
 #~ msgid "Biography"
 #~ msgstr "Biographie"
 
-#~ msgid "Source: %1"
-#~ msgstr "Quelle: %1"
-
 #~ msgid "Stop Immediately"
 #~ msgstr "Sofort stoppen"
 
@@ -5593,9 +6756,6 @@ msgstr "%1 Regeln"
 #~ "Der Einstellungsname %1 ist bereits vorhanden!\n"
 #~ "Überschreiben?"
 
-#~ msgid "Set Cover"
-#~ msgstr "Setze Cover"
-
 #~ msgctxt ""
 #~ "<title> by <artist>\n"
 #~ "Failed\n"
@@ -5612,25 +6772,12 @@ msgstr "%1 Regeln"
 #~ msgid "Disconnect Online Service"
 #~ msgstr "Von Onlineservice trennen"
 
-#~ msgid "Failed to parse downloaded stream list."
-#~ msgstr "Fehler beim Analysieren der heruntergeladenen Stückliste"
-
 #~ msgid "Failed to read downloaded stream list."
 #~ msgstr "Fehler beim Lesen der heruntergeladenen Stückliste"
 
-#~ msgid "Failed to download stream list."
-#~ msgstr "Fehler beim herunterladen der Streamliste"
-
-#~ msgctxt "name (host)"
-#~ msgid "%1 (%2)"
-#~ msgstr "%1 (%2)"
-
 #~ msgid "Failed to reconnect to %1"
 #~ msgstr "Fehler beim Wiederverbinden zu \"%1\""
 
-#~ msgid "Loaded"
-#~ msgstr "Geladen"
-
 #~ msgid "Add Online Service"
 #~ msgstr "Onlineservice hinzufügen"
 
@@ -5755,9 +6902,6 @@ msgstr "%1 Regeln"
 #~ msgid "Category:"
 #~ msgstr "Kategorie:"
 
-#~ msgid "Radio Stations"
-#~ msgstr "Radiostationen"
-
 #~ msgid "From %1"
 #~ msgstr "Von %1"
 
@@ -5767,9 +6911,6 @@ msgstr "%1 Regeln"
 #~ msgid "Music folder not writeable."
 #~ msgstr "Musikverzeichnis nicht beschreibbar"
 
-#~ msgid "*.cantata|Cantata Streams"
-#~ msgstr "*.cantata|Cantata Streams"
-
 #~ msgid "Are you sure you wish to remove the selected categories &streams?"
 #~ msgstr "Wollen Sie wirklich die selektierten Kategorien &Streams entfernen?"
 
@@ -5805,9 +6946,6 @@ msgstr "%1 Regeln"
 #~ msgid "Download streams from %1?"
 #~ msgstr "Lade Streams von %1 herunter?"
 
-#~ msgid "Download %1"
-#~ msgstr "Download %1"
-
 #~ msgctxt ""
 #~ "message \n"
 #~ " url"
@@ -5904,9 +7042,6 @@ msgstr "%1 Regeln"
 #~ msgid "Uptime:"
 #~ msgstr "Betriebszeit:"
 
-#~ msgid "Time playing:"
-#~ msgstr "Abspielzeit:"
-
 #~ msgid "Database"
 #~ msgstr "Datenbank"
 
@@ -5928,18 +7063,12 @@ msgstr "%1 Regeln"
 #~ msgid "Failed to update the tags of some tracks."
 #~ msgstr "Fehler beim aktualisieren einiger Stücke."
 
-#~ msgid "Are you sure you wish to forget the selected device?"
-#~ msgstr "Sind Sie sicher das Sie das Gerät vergessen möchten?"
-
 #~ msgid "Select Music Folder"
 #~ msgstr "Wähle Musikverzeichnis:"
 
 #~ msgid "Small Control Buttons"
 #~ msgstr "Kleine Kontrollknöpfe"
 
-#~ msgid "External Settings"
-#~ msgstr "Einstellungen der externen Funktionen"
-
 #~ msgid ""
 #~ "<table><tr><td align=\"right\"><b>Artist:</b></td><td>%1</td></tr><tr><td "
 #~ "align=\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right"
@@ -6086,11 +7215,6 @@ msgstr "%1 Regeln"
 #~ msgid "Other Protocol"
 #~ msgstr "Anderes Protokoll"
 
-#~ msgid "1 Artist, "
-#~ msgid_plural "%1 Artists, "
-#~ msgstr[0] "1 Künstler,"
-#~ msgstr[1] "%1 Künstler,"
-
 #~ msgid "1 Album, "
 #~ msgid_plural "%1 Albums, "
 #~ msgstr[0] "1 Album,"
@@ -6113,9 +7237,6 @@ msgstr "%1 Regeln"
 #~ msgid "Device is currently busy."
 #~ msgstr "Gerät ist aktuell beschäftigt"
 
-#~ msgid "No lyrics found"
-#~ msgstr "Keine Texte gefunden"
-
 #~ msgid "Library View"
 #~ msgstr "Bibliotheksansicht"
 
@@ -6137,9 +7258,6 @@ msgstr "%1 Regeln"
 #~ msgid "Delete Songs From Device"
 #~ msgstr "Entferne Titel vom Gerät"
 
-#~ msgid "Clear Playlist"
-#~ msgstr "Leere Wiedergabeliste"
-
 #~ msgid ""
 #~ "The MPD connection died unexpectedly.<br/>TThis error is unrecoverable, "
 #~ "please restart %1."
diff --git a/po/en_GB.po b/po/en_GB.po
index 852a90e..74833a7 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-14 20:26+0000\n"
+"POT-Creation-Date: 2014-02-02 20:02+0000\n"
 "PO-Revision-Date: 2013-07-20 19:42+0100\n"
 "Last-Translator: Craig Drummond <craig.p.drummond at gmail.com>\n"
 "Language-Team: British English <craig.p.drummond at gmail.com>\n"
@@ -20,14 +20,13 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr ""
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:307
-#: gui/cachesettings.cpp:262
+#: context/albumview.cpp:71 gui/cachesettings.cpp:269
 msgid "Album Information"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:143
+#. i18n: file: devices/albumdetails.ui:136
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
+#: context/albumview.cpp:175 po/rc.cpp:107 rc.cpp:107
 msgid "Tracks"
 msgstr ""
 
@@ -35,22 +34,22 @@ msgstr ""
 msgid "Refresh Artist Information"
 msgstr ""
 
-#: context/artistview.cpp:92 context/contextwidget.cpp:306
-#: gui/cachesettings.cpp:260
+#: context/artistview.cpp:92 gui/cachesettings.cpp:267
 msgid "Artist Information"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:137
+#. i18n: file: gui/interfacesettings.ui:272
 #. i18n: ectx: attribute (title), widget (QWidget, tab_2)
-#: context/artistview.cpp:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
+#: context/artistview.cpp:314 gui/interfacesettings.cpp:106
+#: gui/mainwindow.cpp:308 po/rc.cpp:588 rc.cpp:588
 msgid "Albums"
 msgstr ""
 
-#: context/artistview.cpp:333
+#: context/artistview.cpp:337
 msgid "Web Links"
 msgstr ""
 
-#: context/artistview.cpp:419
+#: context/artistview.cpp:424
 msgid "Similar Artists"
 msgstr ""
 
@@ -58,22 +57,29 @@ msgstr ""
 msgid "Lyrics Providers"
 msgstr ""
 
-#: context/contextsettings.cpp:37
+#: context/contextsettings.cpp:37 gui/cachesettings.cpp:278
 msgid "Wikipedia Languages"
 msgstr ""
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
-#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1388
+#: models/streamsmodel.cpp:1434 models/streamsmodel.cpp:1642
 msgid "Other"
 msgstr ""
 
-#: context/contextwidget.cpp:98
+#: context/contextwidget.cpp:293
 msgid "Reset Spacing"
 msgstr ""
 
-#: context/contextwidget.cpp:308 context/songview.cpp:105
-#: gui/cachesettings.cpp:259
-msgid "Lyrics"
+#: context/contextwidget.cpp:506
+msgid "&Artist"
+msgstr ""
+
+#: context/contextwidget.cpp:507
+msgid "Al&bum"
+msgstr ""
+
+#: context/contextwidget.cpp:508
+msgid "&Lyrics"
 msgstr ""
 
 #: context/lastfmengine.cpp:63
@@ -91,37 +97,38 @@ msgid ""
 "original song title and artist as displayed in Cantata."
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#: context/lyricsdialog.cpp:64 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
-#: rc.cpp:61 rc.cpp:304 rc.cpp:789
+#: context/lyricsdialog.cpp:64 gui/searchpage.cpp:204 po/rc.cpp:92
+#: po/rc.cpp:377 po/rc.cpp:941 rc.cpp:92 rc.cpp:377 rc.cpp:941
 msgid "Title:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#: context/lyricsdialog.cpp:66 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
-#: rc.cpp:55 rc.cpp:292 rc.cpp:792
+#: context/lyricsdialog.cpp:66 devices/actiondialog.cpp:800
+#: gui/searchpage.cpp:197 po/rc.cpp:86 po/rc.cpp:362 po/rc.cpp:944 rc.cpp:86
+#: rc.cpp:362 rc.cpp:944
 msgid "Artist:"
 msgstr ""
 
@@ -133,95 +140,123 @@ msgstr ""
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr ""
 
-#: context/lyricsettings.cpp:66
-msgid "(Polish Translations)"
+#: context/othersettings.cpp:45 gui/coverdialog.cpp:877
+#: gui/interfacesettings.cpp:174
+msgid "Images (*.png *.jpg)"
 msgstr ""
 
-#: context/lyricsettings.cpp:67
-msgid "(Portuguese Translations)"
+#: context/othersettings.cpp:47 gui/interfacesettings.cpp:176
+msgctxt "pixels"
+msgid "10px"
 msgstr ""
 
-#: context/songview.cpp:89
-msgid "Refresh Lyrics"
+#: context/othersettings.cpp:102 gui/interfacesettings.cpp:524
+msgctxt "value%"
+msgid "%1%"
+msgstr ""
+
+#: context/othersettings.cpp:107 gui/interfacesettings.cpp:529
+#, c-format
+msgctxt "pixels"
+msgid "%1px"
 msgstr ""
 
 #: context/songview.cpp:90
-msgid "Edit Lyrics"
+msgid "Refresh Lyrics"
 msgstr ""
 
 #: context/songview.cpp:91
-msgid "Save Lyrics"
+msgid "Edit Lyrics"
 msgstr ""
 
 #: context/songview.cpp:92
-msgid "Cancel Editing Lyrics"
+msgid "Save Lyrics"
 msgstr ""
 
 #: context/songview.cpp:93
+msgid "Cancel Editing Lyrics"
+msgstr ""
+
+#: context/songview.cpp:94
 msgid "Delete Lyrics File"
 msgstr ""
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:106 gui/cachesettings.cpp:266
+msgid "Lyrics"
+msgstr ""
+
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort editing of lyrics?"
 msgstr ""
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort Editing"
 msgstr ""
 
-#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
-#: replaygain/rgdialog.cpp:252 replaygain/rgdialog.cpp:253
-#: replaygain/rgdialog.cpp:261 replaygain/rgdialog.cpp:262
-#: tags/trackorganiser.cpp:150
+#: context/songview.cpp:120 context/songview.cpp:139 context/songview.cpp:198
+#: replaygain/rgdialog.cpp:247 replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:256 replaygain/rgdialog.cpp:257
+#: tags/trackorganiser.cpp:164
 msgid "Abort"
 msgstr ""
 
-#: context/songview.cpp:121
+#: context/songview.cpp:122
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr ""
 
-#: context/songview.cpp:121 context/songview.cpp:122
-#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
+#: context/songview.cpp:122 context/songview.cpp:123
+#: online/onlineservicespage.cpp:458 online/onlineservicespage.cpp:459
 msgid "Re-download"
 msgstr ""
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Current playing song has changed, still perform search?"
 msgstr ""
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Song Changed"
 msgstr ""
 
-#: context/songview.cpp:148
+#: context/songview.cpp:149
 msgid "Perform Search"
 msgstr ""
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save updated lyrics?"
 msgstr ""
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save"
 msgstr ""
 
-#: context/songview.cpp:185
+#: context/songview.cpp:186
 msgid "Failed to save lyrics."
 msgstr ""
 
-#: context/songview.cpp:207
+#: context/songview.cpp:208
 msgid "Delete lyrics file?"
 msgstr ""
 
-#: context/songview.cpp:207 gui/mainwindow.cpp:292
-#: widgets/messageoverlay.cpp:43
-msgid "Cancel"
+#: context/songview.cpp:208
+msgid "Delete File"
 msgstr ""
 
-#: context/songview.cpp:431
+#: context/songview.cpp:462
 msgid "Fetching lyrics via %1"
 msgstr ""
 
+#: context/ultimatelyricsprovider.cpp:200
+msgid "(Polish Translations)"
+msgstr ""
+
+#: context/ultimatelyricsprovider.cpp:201
+msgid "(Portuguese Translations)"
+msgstr ""
+
+#: context/view.cpp:91 gui/mainwindow.cpp:328 widgets/messageoverlay.cpp:44
+msgid "Cancel"
+msgstr ""
+
 #: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr ""
@@ -244,14 +279,14 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr ""
 
-#: context/wikipediasettings.cpp:99
+#: context/wikipediasettings.cpp:114
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
 msgstr ""
 
-#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
-#: online/podcastsearchdialog.cpp:393
+#: context/wikipediasettings.cpp:115 models/streamsmodel.cpp:598
+#: online/podcastsearchdialog.cpp:404
 msgid "Reload"
 msgstr ""
 
@@ -259,37 +294,47 @@ msgstr ""
 msgid "Cantata is playing a track"
 msgstr ""
 
-#: devices/actiondialog.cpp:76
+#: devices/actiondialog.cpp:83
 msgid "Songs To Be Copied"
 msgstr ""
 
-#: devices/actiondialog.cpp:146
+#: devices/actiondialog.cpp:153
 msgid "<b>INVALID</b>"
 msgstr ""
 
-#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
+#: devices/actiondialog.cpp:167 devices/actiondialog.cpp:170
 msgid "<i>(When different)</i>"
 msgstr ""
 
-#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:185 tags/tageditor.cpp:713
+#: tags/trackorganiser.cpp:444
+msgid ""
+"Cantata has detected that you are connected to a Mopidy server.\n"
+"\n"
+"Currently it is not possible for Cantata to force Mopidy to refresh its "
+"local music listing. Therefore, you will need to stop Cantata, manually "
+"refresh Mopidy's database, and restart Cantata for any changes to be active."
+msgstr ""
+
+#: devices/actiondialog.cpp:211 devices/synccollectionwidget.cpp:274
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr ""
 
-#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
-#: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
+#: devices/actiondialog.cpp:271 devices/mtpdevice.cpp:1622
+#: devices/remotefsdevice.cpp:571 devices/umsdevice.cpp:103
 msgid "%1 free"
 msgstr ""
 
-#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
+#: devices/actiondialog.cpp:284 devices/actiondialog.cpp:288
 msgid "Local Music Library"
 msgstr ""
 
-#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
+#: devices/actiondialog.cpp:286 devices/albumdetailsdialog.cpp:104
+#: gui/preferencesdialog.cpp:115 widgets/groupedview.cpp:251
 msgid "Audio CD"
 msgstr ""
 
-#: devices/actiondialog.cpp:293
+#: devices/actiondialog.cpp:309
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -297,259 +342,273 @@ msgid ""
 "successfully copied."
 msgstr ""
 
-#: devices/actiondialog.cpp:300
+#: devices/actiondialog.cpp:316
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
 msgstr ""
 
-#: devices/actiondialog.cpp:349
+#: devices/actiondialog.cpp:365
 msgid "Copy Songs"
 msgstr ""
 
-#: devices/actiondialog.cpp:349 devices/devicespage.cpp:503
-#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: devices/actiondialog.cpp:365 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:214 gui/folderpage.cpp:270 gui/librarypage.cpp:257
 #: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr ""
 
-#: devices/actiondialog.cpp:380
+#: devices/actiondialog.cpp:402
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
 msgstr ""
 
-#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
+#: devices/actiondialog.cpp:403 devices/actiondialog.cpp:407
 msgid "Not Configured"
 msgstr ""
 
-#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
+#: devices/actiondialog.cpp:404 devices/actiondialog.cpp:408
 msgid "Use Defaults"
 msgstr ""
 
-#: devices/actiondialog.cpp:384
+#: devices/actiondialog.cpp:406
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
 msgstr ""
 
-#: devices/actiondialog.cpp:446
+#: devices/actiondialog.cpp:468
 msgid "Are you sure you wish to stop?"
 msgstr ""
 
-#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
+#: devices/actiondialog.cpp:468 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr ""
 
-#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
-#: tags/trackorganiser.cpp:446
+#: devices/actiondialog.cpp:513 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:468 tags/tageditor.cpp:880
+#: tags/trackorganiser.cpp:478
 msgid "Device has been removed!"
 msgstr ""
 
-#: devices/actiondialog.cpp:491
+#: devices/actiondialog.cpp:515
 msgid "Device is not connected!"
 msgstr ""
 
-#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
-#: tags/trackorganiser.cpp:456
+#: devices/actiondialog.cpp:517 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:478 tags/tageditor.cpp:890
+#: tags/trackorganiser.cpp:488
 msgid "Device is busy?"
 msgstr ""
 
-#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:519 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr ""
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:586
 msgid "Clearing unused folders"
 msgstr ""
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr ""
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "ReplyGain"
 msgstr ""
 
-#: devices/actiondialog.cpp:578
+#: devices/actiondialog.cpp:602
 msgid "Calculate"
 msgstr ""
 
-#: devices/actiondialog.cpp:634
-msgid "The destination filename already exists!<hr/>%1"
+#: devices/actiondialog.cpp:661
+msgid "The destination filename already exists!"
 msgstr ""
 
-#: devices/actiondialog.cpp:637
-msgid "Song already exists!<hr/>%1"
+#: devices/actiondialog.cpp:664
+msgid "Song already exists!"
 msgstr ""
 
-#: devices/actiondialog.cpp:640
-msgid "Song does not exist!<hr/>%1"
+#: devices/actiondialog.cpp:667
+msgid "Song does not exist!"
 msgstr ""
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:670
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
-"permissions.<hr/>%1"
+"permissions."
 msgstr ""
 
-#: devices/actiondialog.cpp:646
-msgid "Source file no longer exists?<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:673
+msgid "Source file no longer exists?"
 msgstr ""
 
-#: devices/actiondialog.cpp:649
-msgid "Failed to copy.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to copy."
 msgstr ""
 
-#: devices/actiondialog.cpp:650
-msgid "Failed to delete.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to delete."
 msgstr ""
 
-#: devices/actiondialog.cpp:653
-msgid "Not connected to device.<hr/>%1"
+#: devices/actiondialog.cpp:679
+msgid "Not connected to device."
 msgstr ""
 
-#: devices/actiondialog.cpp:656
-msgid "Selected codec is not available.<hr/>%1"
+#: devices/actiondialog.cpp:682
+msgid "Selected codec is not available."
 msgstr ""
 
-#: devices/actiondialog.cpp:659
-msgid "Transcoding failed.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:685
+msgid "Transcoding failed."
 msgstr ""
 
-#: devices/actiondialog.cpp:662
+#: devices/actiondialog.cpp:688
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
-"devices.)<hr/>%1"
+"devices.)"
 msgstr ""
 
-#: devices/actiondialog.cpp:665
-msgid "Failed to read source file.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:691
+msgid "Failed to read source file."
 msgstr ""
 
-#: devices/actiondialog.cpp:668
-msgid "Failed to write to destination file.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:694
+msgid "Failed to write to destination file."
 msgstr ""
 
-#: devices/actiondialog.cpp:671
-msgid "No space left on device.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:697
+msgid "No space left on device."
 msgstr ""
 
-#: devices/actiondialog.cpp:674
-msgid "Failed to update metadata.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:700
+msgid "Failed to update metadata."
 msgstr ""
 
-#: devices/actiondialog.cpp:677
-msgid "Failed to download track.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:703
+msgid "Failed to download track."
 msgstr ""
 
-#: devices/actiondialog.cpp:680
-msgid "Failed to lock device.<hr/>%1"
+#: devices/actiondialog.cpp:706
+msgid "Failed to lock device."
 msgstr ""
 
-#: devices/actiondialog.cpp:709
+#: devices/actiondialog.cpp:735
 msgid "Local Music Library Properties"
 msgstr ""
 
-#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
-msgid "<b>Error</b><br/>"
+#: devices/actiondialog.cpp:776 devices/actiondialog.cpp:790
+#: support/messagebox.cpp:108 support/messagebox.cpp:114
+#: support/messagebox.h:62
+msgid "Error"
 msgstr ""
 
-#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:780 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Skip"
 msgstr ""
 
-#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:781 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Auto Skip"
 msgstr ""
 
-#: devices/actiondialog.cpp:759
+#: devices/actiondialog.cpp:785
 msgid "Retry"
 msgstr ""
 
-#: devices/actiondialog.cpp:774
-msgid ""
-"<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
-"td></tr>"
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#: devices/actiondialog.cpp:801 gui/searchpage.cpp:203 po/rc.cpp:374
+#: po/rc.cpp:953 rc.cpp:374 rc.cpp:953
+msgid "Album:"
 msgstr ""
 
-#: devices/actiondialog.cpp:781
-msgid ""
-"<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
-"\"right\">Destination file:</td><td>%2</td></tr>"
+#. i18n: file: tags/tageditor.ui:25
+#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
+#: devices/actiondialog.cpp:802 po/rc.cpp:938 rc.cpp:938
+msgid "Track:"
+msgstr ""
+
+#: devices/actiondialog.cpp:806
+msgid "Source file:"
+msgstr ""
+
+#: devices/actiondialog.cpp:807
+msgid "Destination file:"
 msgstr ""
 
-#: devices/actiondialog.cpp:786
-msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
+#: devices/actiondialog.cpp:809 gui/searchpage.cpp:207
+msgid "File:"
 msgstr ""
 
-#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
-#: gui/cachesettings.cpp:230
+#: devices/actiondialog.cpp:815 gui/cachesettings.cpp:179
+#: gui/cachesettings.cpp:235
 msgid "Calculating..."
 msgstr ""
 
-#: devices/actiondialog.cpp:799
+#: devices/actiondialog.cpp:822
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr ""
 
-#: devices/actiondialog.cpp:802
-msgid ""
-"<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
-"i></tr>"
+#: devices/actiondialog.cpp:824
+msgid "Time remaining:"
 msgstr ""
 
-#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: devices/actiondialog.cpp:847 devices/fsdevice.cpp:762
 #: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
+#: devices/albumdetailsdialog.cpp:139 devices/albumdetailsdialog.cpp:236
+#: tags/tageditor.cpp:158 tags/tageditor.cpp:373
 msgid "Apply \"Various Artists\" Workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
+#: devices/albumdetailsdialog.cpp:140 devices/albumdetailsdialog.cpp:260
+#: tags/tageditor.cpp:159 tags/tageditor.cpp:418
 msgid "Revert \"Various Artists\" Workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
-#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
+#: devices/albumdetailsdialog.cpp:141 devices/albumdetailsdialog.cpp:278
+#: tags/tageditor.cpp:161 tags/tageditor.cpp:499
 msgid "Capitalize"
 msgstr "Capitalise"
 
-#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
-#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
+#: devices/albumdetailsdialog.cpp:142 devices/albumdetailsdialog.cpp:295
+#: tags/tageditor.cpp:162 tags/tageditor.cpp:528
 msgid "Adjust Track Numbers"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
+#: devices/albumdetailsdialog.cpp:144 tags/tageditor.cpp:156
 msgid "Tools"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:369
 msgid "Apply \"Various Artists\" workaround?"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
+#: devices/albumdetailsdialog.cpp:234 tags/tageditor.cpp:371
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:411
 msgid "Revert \"Various Artists\" workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
+#: devices/albumdetailsdialog.cpp:255 tags/tageditor.cpp:413
 msgid ""
 "<i>Where the 'Album artist' is the same as 'Artist' and the 'Title' is of "
 "the format \"TrackArtist - TrackTitle\", 'Artist' will be taken from 'Title' "
@@ -558,37 +617,27 @@ msgid ""
 "will be set to \"Wobble\"</i>"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
+#: devices/albumdetailsdialog.cpp:261 tags/tageditor.cpp:419
 msgid "Revert"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
+#: devices/albumdetailsdialog.cpp:277 tags/tageditor.cpp:497
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr ""
 "Capitalise the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 
-#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
+#: devices/albumdetailsdialog.cpp:295 tags/tageditor.cpp:529
 msgid "Adjust track number by:"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:335 devices/cddbinterface.cpp:143
-#: devices/deviceoptions.cpp:358 devices/musicbrainz.cpp:202
-#: devices/musicbrainz.cpp:324 gui/mainwindow.cpp:1771 gui/mainwindow.cpp:1784
-#: models/musiclibraryitemroot.cpp:362 models/musiclibraryitemroot.cpp:520
-#: models/playqueuemodel.cpp:325 mpd/mpdparseutils.cpp:249
-#: mpd/mpdparseutils.cpp:409 mpd/song.cpp:228 mpd/song.cpp:233
-#: mpd/song.cpp:272 mpd/song.cpp:299 widgets/groupedview.cpp:260
-msgid "Unknown"
-msgstr ""
-
 #: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr ""
 
-#: devices/audiocddevice.cpp:353 gui/mainwindow.cpp:2199
-#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
-#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
+#: devices/audiocddevice.cpp:358 gui/mainwindow.cpp:2345
+#: gui/searchpage.cpp:220 models/albumsmodel.cpp:245 models/musicmodel.cpp:217
+#: models/playlistsmodel.cpp:309 models/playlistsmodel.cpp:324
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] ""
@@ -611,7 +660,7 @@ msgid "Failed to open CD device"
 msgstr ""
 
 #: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
-#: devices/musicbrainz.cpp:217
+#: devices/musicbrainz.cpp:216
 msgid "Track %1"
 msgstr ""
 
@@ -631,19 +680,19 @@ msgstr ""
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:170
+#. i18n: file: devices/albumdetails.ui:163
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:66
-#: models/playqueuemodel.cpp:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
-#: rc.cpp:82
+#: models/playqueuemodel.cpp:106 po/rc.cpp:113 replaygain/rgdialog.cpp:128
+#: rc.cpp:113
 msgid "Artist"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:175
+#. i18n: file: devices/albumdetails.ui:168
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:76
-#: models/playqueuemodel.cpp:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
-#: rc.cpp:85
+#: models/playqueuemodel.cpp:105 po/rc.cpp:116 replaygain/rgdialog.cpp:130
+#: rc.cpp:116
 msgid "Title"
 msgstr ""
 
@@ -713,7 +762,7 @@ msgid ""
 "from the 'Title' tag.</p>"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:99
+#: devices/devicepropertieswidget.cpp:98
 msgid ""
 "<p>If you enable this, then Cantata will create a cache of the device's "
 "music library. This will help to speed up subsequent library scans (as the "
@@ -724,19 +773,19 @@ msgid ""
 "removed, and the contents of the device re-scanned.</p>"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:204
+#: devices/devicepropertieswidget.cpp:209
 msgid "Do not transcode"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:212
+#: devices/devicepropertieswidget.cpp:216
 msgid "Encoder"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:228
+#: devices/devicepropertieswidget.cpp:231
 msgid "Transcode to %1"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:259
+#: devices/devicepropertieswidget.cpp:262
 msgctxt "name (size free)"
 msgid "%1 (%2 free)"
 msgstr ""
@@ -749,11 +798,11 @@ msgstr ""
 msgid "Sync"
 msgstr ""
 
-#: devices/devicespage.cpp:71
+#: devices/devicespage.cpp:70
 msgid "Forget Device"
 msgstr ""
 
-#: devices/devicespage.cpp:114 devices/remotedevicepropertiesdialog.cpp:60
+#: devices/devicespage.cpp:113 devices/remotedevicepropertiesdialog.cpp:60
 msgid "Add Device"
 msgstr ""
 
@@ -762,7 +811,7 @@ msgid "Lookup album and track details?"
 msgstr ""
 
 #: devices/devicespage.cpp:433 devices/devicespage.cpp:445
-#: devices/devicespage.cpp:455
+#: devices/devicespage.cpp:455 gui/mainwindow.cpp:589
 msgid "Refresh"
 msgstr ""
 
@@ -789,8 +838,8 @@ msgstr ""
 msgid "Full"
 msgstr ""
 
-#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
-#: gui/librarypage.cpp:257
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:213 gui/folderpage.cpp:269
+#: gui/librarypage.cpp:256
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -816,11 +865,11 @@ msgstr ""
 msgid "Disconnect"
 msgstr ""
 
-#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1220
 msgid "Please close other dialogs first."
 msgstr ""
 
-#: devices/encoders.cpp:77
+#: devices/encoders.cpp:78
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -831,7 +880,7 @@ msgid ""
 "a reasonable choice for the iPod and some other portable music players."
 msgstr ""
 
-#: devices/encoders.cpp:82
+#: devices/encoders.cpp:83
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>AAC</b> encoder used by Cantata supports a <a "
@@ -849,21 +898,21 @@ msgid ""
 "s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:100 devices/encoders.cpp:140
+#: devices/encoders.cpp:101 devices/encoders.cpp:141
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr ""
 
-#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
-#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:293 devices/encoders.cpp:329
 msgid "Smaller file"
 msgstr ""
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:233 devices/encoders.cpp:329
+#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
+#: devices/encoders.cpp:234 devices/encoders.cpp:330
 msgid "Better sound quality"
 msgstr ""
 
-#: devices/encoders.cpp:119
+#: devices/encoders.cpp:120
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -874,7 +923,7 @@ msgid ""
 "and is widely supported on portable music players."
 msgstr ""
 
-#: devices/encoders.cpp:123
+#: devices/encoders.cpp:124
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>MP3</b> encoder used by Cantata supports a <a "
@@ -890,11 +939,11 @@ msgid ""
 "anything above <b>205kb/s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
+#: devices/encoders.cpp:156 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr ""
 
-#: devices/encoders.cpp:158
+#: devices/encoders.cpp:159
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -905,7 +954,7 @@ msgid ""
 "excellent choice, especially for portable music players that support it."
 msgstr ""
 
-#: devices/encoders.cpp:163
+#: devices/encoders.cpp:164
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Vorbis</b> encoder used by Cantata supports a "
@@ -924,15 +973,15 @@ msgid ""
 "anything above <b>8</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:183
+#: devices/encoders.cpp:184
 msgid "Quality rating"
 msgstr ""
 
-#: devices/encoders.cpp:200
+#: devices/encoders.cpp:201
 msgid "Opus"
 msgstr ""
 
-#: devices/encoders.cpp:203
+#: devices/encoders.cpp:204
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -941,7 +990,7 @@ msgid ""
 "patent-free digital audio codec using a form of lossy data compression."
 msgstr ""
 
-#: devices/encoders.cpp:205
+#: devices/encoders.cpp:206
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Opus</b> encoder used by Cantata supports a <a "
@@ -957,15 +1006,15 @@ msgid ""
 "anything above <b>256kb/s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:222 devices/encoders.cpp:319
+#: devices/encoders.cpp:223 devices/encoders.cpp:320
 msgid "Bitrate"
 msgstr ""
 
-#: devices/encoders.cpp:241
+#: devices/encoders.cpp:242
 msgid "Apple Lossless"
 msgstr ""
 
-#: devices/encoders.cpp:244
+#: devices/encoders.cpp:245
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -976,11 +1025,11 @@ msgid ""
 "FLAC."
 msgstr ""
 
-#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:260 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr ""
 
-#: devices/encoders.cpp:262
+#: devices/encoders.cpp:263
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -991,7 +1040,7 @@ msgid ""
 "compromising on audio quality, FLAC is an excellent choice."
 msgstr ""
 
-#: devices/encoders.cpp:266
+#: devices/encoders.cpp:267
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1006,19 +1055,19 @@ msgid ""
 "file, and are not recommended."
 msgstr ""
 
-#: devices/encoders.cpp:281
+#: devices/encoders.cpp:282
 msgid "Compression level"
 msgstr ""
 
-#: devices/encoders.cpp:291
+#: devices/encoders.cpp:292
 msgid "Faster compression"
 msgstr ""
 
-#: devices/encoders.cpp:298
+#: devices/encoders.cpp:299
 msgid "Windows Media Audio"
 msgstr ""
 
-#: devices/encoders.cpp:301
+#: devices/encoders.cpp:302
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1029,7 +1078,7 @@ msgid ""
 "not support Ogg Vorbis."
 msgstr ""
 
-#: devices/encoders.cpp:305
+#: devices/encoders.cpp:306
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>Due to the limitations of the proprietary <b>WMA</b> "
@@ -1043,163 +1092,107 @@ msgid ""
 "probably overkill."
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:33
+#: devices/filenameschemedialog.cpp:34
 msgid "Filename Scheme"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:62
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:63
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:64
 msgctxt "Example composer"
 msgid "Vivaldi"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:65
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:56
+#: devices/filenameschemedialog.cpp:66
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:57
+#: devices/filenameschemedialog.cpp:67
 msgctxt "Example genre"
 msgid "Dance"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:101
+#: devices/filenameschemedialog.cpp:121
 msgid ""
 "<p>The following variables will be replaced with their corresponding meaning "
 "for each track name.</p>"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:103
+#: devices/filenameschemedialog.cpp:123
 msgid ""
-"<tr><th><em>Button</em></th><th><em>Variable</em></th><th><em>Description</"
+"<tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</"
 "em></th></tr>"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:104
-msgid ""
-"<tr><td>%albumartist%</td><td>%1</td><td>The artist of the album. For most "
-"albums, this will be the same as the <i>Track Artist.</i> For compilations, "
-"this will often be <i>Various Artists.</i> </td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:106
-msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:107
-msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:108
-msgid "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:109
-msgid ""
-"<tr><td>%title%</td><td>%1</td><td>The track title (without <i>Track Artist</"
-"i>).</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:110
-msgid ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>The track title (with <i>Track "
-"Artist</i>, if different to <i>Album Artist</i>).</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:111
-msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:112
-msgid ""
-"<tr><td>%discnumber%</td><td>%1</td><td>The album number of a multi-album "
-"album. Often compilations consist of several albums.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:113
-msgid ""
-"<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:114
-msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
-msgstr ""
-
-#: devices/fsdevice.cpp:668
+#: devices/fsdevice.cpp:675 gui/albumspage.cpp:287 gui/folderpage.cpp:304
+#: gui/librarypage.cpp:414
 msgid "Updating..."
 msgstr ""
 
-#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: devices/fsdevice.cpp:757 online/onlineservice.cpp:94
 #: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr ""
 
-#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
+#: devices/fsdevice.cpp:769 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr ""
 
-#: devices/mtpdevice.cpp:137
+#: devices/mtpdevice.cpp:153
 msgid "Connecting to device..."
 msgstr ""
 
-#: devices/mtpdevice.cpp:139 devices/mtpdevice.cpp:161
+#: devices/mtpdevice.cpp:155 devices/mtpdevice.cpp:202
 msgid "No devices found"
 msgstr ""
 
-#: devices/mtpdevice.cpp:173
+#: devices/mtpdevice.cpp:217
 msgid "Connected to device"
 msgstr ""
 
-#: devices/mtpdevice.cpp:183
+#: devices/mtpdevice.cpp:230
 msgid "Disconnected from device"
 msgstr ""
 
-#: devices/mtpdevice.cpp:250
+#: devices/mtpdevice.cpp:304
 msgid "Updating folders..."
 msgstr ""
 
-#: devices/mtpdevice.cpp:257
+#: devices/mtpdevice.cpp:320
 msgid "Updating files..."
 msgstr ""
 
-#: devices/mtpdevice.cpp:262 devices/remotefsdevice.cpp:465
-#: devices/remotefsdevice.cpp:485
+#: devices/mtpdevice.cpp:334 devices/remotefsdevice.cpp:461
+#: devices/remotefsdevice.cpp:481
 msgid "Updating tracks..."
 msgstr ""
 
-#: devices/mtpdevice.cpp:281 devices/mtpdevice.cpp:383
-#: models/musiclibraryitemroot.cpp:78 models/musiclibraryitemroot.cpp:117
-#: models/musiclibraryitemroot.cpp:171 models/musiclibraryitemroot.cpp:833
-#: models/musiclibraryitemroot.cpp:1012 mpd/song.cpp:371
-msgid "Various Artists"
-msgstr ""
-
-#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
-#: models/devicesmodel.cpp:140
+#: devices/mtpdevice.cpp:1619 devices/remotefsdevice.cpp:564
+#: devices/umsdevice.cpp:100 gui/initialsettingswizard.cpp:57
+#: models/devicesmodel.cpp:157
 msgid "Not Connected"
 msgstr ""
 
-#: devices/musicbrainz.cpp:320
+#: devices/musicbrainz.cpp:319
 msgid "%1 (Disc %2)"
 msgstr ""
 
-#: devices/musicbrainz.cpp:408
+#: devices/musicbrainz.cpp:407
 msgid "No matches found in MusicBrainz"
 msgstr ""
 
@@ -1207,7 +1200,7 @@ msgstr ""
 msgid "Connection"
 msgstr ""
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:261
 msgid "Music Library"
 msgstr ""
 
@@ -1233,79 +1226,79 @@ msgstr ""
 msgid "Locally Mounted Folder"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:612
+#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:608
 msgid "Available"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:610
+#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:606
 msgid "Not Available"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:315
+#: devices/remotefsdevice.cpp:313
 msgid "Failed to resolve connection details for %1"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:330 devices/remotefsdevice.cpp:345
-#: devices/remotefsdevice.cpp:403
+#: devices/remotefsdevice.cpp:328 devices/remotefsdevice.cpp:343
+#: devices/remotefsdevice.cpp:399
 msgid "Connecting..."
 msgstr ""
 
-#: devices/remotefsdevice.cpp:358
+#: devices/remotefsdevice.cpp:356
 msgid ""
 "Password prompting does not work when cantata is started from the "
 "commandline."
 msgstr ""
 
-#: devices/remotefsdevice.cpp:379
+#: devices/remotefsdevice.cpp:375
 msgid ""
 "No suitable ssh-askpass application installed! This is required for entering "
 "passwords."
 msgstr ""
 
-#: devices/remotefsdevice.cpp:386
+#: devices/remotefsdevice.cpp:382
 msgid "Mount point (\"%1\") is not empty!"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:398
+#: devices/remotefsdevice.cpp:394
 msgid "\"sshfs\" is not installed!"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:426 devices/remotefsdevice.cpp:446
+#: devices/remotefsdevice.cpp:422 devices/remotefsdevice.cpp:442
 msgid "Disconnecting..."
 msgstr ""
 
-#: devices/remotefsdevice.cpp:440
+#: devices/remotefsdevice.cpp:436
 msgid "\"fusermount\" is not installed!"
 msgstr ""
 
-#: devices/remotefsdevice.cpp:461 devices/remotefsdevice.cpp:482
+#: devices/remotefsdevice.cpp:457 devices/remotefsdevice.cpp:478
 msgid "Failed to connect to \"%1\""
 msgstr ""
 
-#: devices/remotefsdevice.cpp:462 devices/remotefsdevice.cpp:497
+#: devices/remotefsdevice.cpp:458 devices/remotefsdevice.cpp:493
 msgid "Failed to disconnect from \"%1\""
 msgstr ""
 
-#: devices/remotefsdevice.cpp:573
+#: devices/remotefsdevice.cpp:569
 msgid "Capacity Unknown"
 msgstr ""
 
-#. i18n: file: gui/coverdialog.ui:30
+#. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (text), widget (QPushButton, search)
-#: devices/synccollectionwidget.cpp:53 gui/stdactions.cpp:92
-#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
+#: devices/synccollectionwidget.cpp:54 gui/mainwindow.cpp:323
+#: online/podcastsearchdialog.cpp:334 po/rc.cpp:404 rc.cpp:404
 msgid "Search"
 msgstr ""
 
-#: devices/synccollectionwidget.cpp:62
+#: devices/synccollectionwidget.cpp:63
 msgid "Check Items"
 msgstr ""
 
-#: devices/synccollectionwidget.cpp:64
+#: devices/synccollectionwidget.cpp:65
 msgid "Uncheck Items"
 msgstr ""
 
-#: devices/synccollectionwidget.cpp:266
+#: devices/synccollectionwidget.cpp:272
 msgid "Nothing selected"
 msgstr ""
 
@@ -1329,7 +1322,7 @@ msgstr "Synchronise"
 msgid "Device and library are in sync."
 msgstr ""
 
-#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:190
+#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:188
 msgid "Not Scanned"
 msgstr ""
 
@@ -1337,91 +1330,91 @@ msgstr ""
 msgid " (recommended)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:208
+#: dynamic/dynamic.cpp:215
 msgid "Start Dynamic Playlist"
 msgstr ""
 
-#: dynamic/dynamic.cpp:209
+#: dynamic/dynamic.cpp:216
 msgid "Stop Dynamic Mode"
 msgstr ""
 
-#: dynamic/dynamic.cpp:257
+#: dynamic/dynamic.cpp:264
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] ""
 msgstr[1] ""
 
-#: dynamic/dynamic.cpp:396
+#: dynamic/dynamic.cpp:403
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr ""
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:410
 msgid "Failed to locate rules file - %1"
 msgstr ""
 
-#: dynamic/dynamic.cpp:411
+#: dynamic/dynamic.cpp:418
 msgid "Failed to remove previous rules file - %1"
 msgstr ""
 
-#: dynamic/dynamic.cpp:416
+#: dynamic/dynamic.cpp:423
 msgid "Failed to install rules file - %1 -> %2"
 msgstr ""
 
-#: dynamic/dynamic.cpp:729
+#: dynamic/dynamic.cpp:736
 msgid "Dynamizer has been terminated."
 msgstr "Dynamiser has been terminated."
 
-#: dynamic/dynamic.cpp:816
+#: dynamic/dynamic.cpp:823 mpd/mpdconnection.cpp:150
 msgid "Uknown"
 msgstr ""
 
-#: dynamic/dynamic.cpp:818
+#: dynamic/dynamic.cpp:825
 msgid "Loading list of rules"
 msgstr ""
 
-#: dynamic/dynamic.cpp:819
+#: dynamic/dynamic.cpp:826
 msgid "Saving rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:820
+#: dynamic/dynamic.cpp:827
 msgid "Deleting rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:821
+#: dynamic/dynamic.cpp:828
 msgid "Setting active rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:822
+#: dynamic/dynamic.cpp:829
 msgid "Stopping dynamizer"
 msgstr "Stopping dynamiser"
 
-#: dynamic/dynamic.cpp:823
+#: dynamic/dynamic.cpp:830
 msgid "Requesting ID details"
 msgstr ""
 
-#: dynamic/dynamic.cpp:826
+#: dynamic/dynamic.cpp:833
 msgid "Awaiting response for previous command. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:981
+#: dynamic/dynamic.cpp:988
 msgid "Dynamizer is not active"
 msgstr "Dynamiser is not active"
 
-#: dynamic/dynamic.cpp:989
+#: dynamic/dynamic.cpp:996
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:1020
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to delete rules file. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:1027
+#: dynamic/dynamic.cpp:1034
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Failed to control dynamiser state. (%1)"
 
-#: dynamic/dynamic.cpp:1036
+#: dynamic/dynamic.cpp:1043
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr ""
 
@@ -1437,11 +1430,11 @@ msgstr ""
 msgid "Edit Dynamic Rules"
 msgstr ""
 
-#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:151
+#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:150
 msgid "Remove Dynamic Rules"
 msgstr ""
 
-#: dynamic/dynamicpage.cpp:150
+#: dynamic/dynamicpage.cpp:149
 msgid ""
 "Are you sure you wish to remove the selected rules?\n"
 "This cannot be undone."
@@ -1453,15 +1446,15 @@ msgstr ""
 
 #. i18n: file: dynamic/dynamicrules.ui:53
 #. i18n: ectx: property (text), widget (QPushButton, addBtn)
-#: dynamic/dynamicruledialog.cpp:136 po/rc.cpp:280 rc.cpp:280
+#: dynamic/dynamicruledialog.cpp:145 po/rc.cpp:341 rc.cpp:341
 msgid "Add"
 msgstr ""
 
-#: dynamic/dynamicruledialog.cpp:202
+#: dynamic/dynamicruledialog.cpp:211
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr ""
 
-#: dynamic/dynamicruledialog.cpp:205
+#: dynamic/dynamicruledialog.cpp:214
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1475,27 +1468,27 @@ msgstr ""
 msgid "AlbumArtist"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: file: devices/filenameschemedialog.ui:102
 #. i18n: ectx: property (text), widget (QPushButton, composer)
-#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:212 rc.cpp:212
 msgid "Composer"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:48
+#: models/playqueuemodel.cpp:107 replaygain/rgdialog.cpp:129
 msgid "Album"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:106
-#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:112
+#: po/rc.cpp:254 po/rc.cpp:380 rc.cpp:254 rc.cpp:380
 msgid "Genre"
 msgstr ""
 
@@ -1553,82 +1546,81 @@ msgstr ""
 msgid "Saving %1"
 msgstr ""
 
-#: gui/cachesettings.cpp:168
+#: gui/cachesettings.cpp:173
 msgid "Deleting..."
 msgstr ""
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Name"
 msgstr ""
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Item Count"
 msgstr ""
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Space Used"
 msgstr ""
 
-#: gui/cachesettings.cpp:234
+#: gui/cachesettings.cpp:239
 msgid "Total space used: %1"
 msgstr ""
 
-#: gui/cachesettings.cpp:245
+#: gui/cachesettings.cpp:250
 msgid ""
-"To speed up loading of the music library, Cantata caches a local copy of the "
-"MPD listing. Cantata might also have cached covers, or lyrics, if these have "
-"been downloaded and could not be saved into the MPD folder (because Cantata "
-"cannot access it, or you have configured Cantata to not save these items "
-"there). Below is a summary of Cantata's cache usage."
+"Cantata caches a local copy of the MPD listing to speed up loading of the "
+"music library. Cantata might also have cached covers, lyrics, or artist "
+"images, if these have been downloaded and could not be saved into the MPD "
+"folder (because Cantata cannot access it, or you have configured Cantata to "
+"not save these items there). Below is a summary of Cantata's current cache "
+"usage."
 msgstr ""
 
-#: gui/cachesettings.cpp:257
+#: gui/cachesettings.cpp:263
 msgid "Covers"
 msgstr ""
 
-#: gui/cachesettings.cpp:258
+#: gui/cachesettings.cpp:264
+msgid "Scaled Covers"
+msgstr ""
+
+#: gui/cachesettings.cpp:265
 msgid "Backdrops"
 msgstr ""
 
-#: gui/cachesettings.cpp:263 gui/interfacesettings.cpp:167
-#: gui/mainwindow.cpp:283 gui/preferencesdialog.cpp:85
-#: widgets/groupedview.cpp:256
-msgid "Streams"
+#: gui/cachesettings.cpp:271
+msgid "Stream Listings"
 msgstr ""
 
-#: gui/cachesettings.cpp:264
+#: gui/cachesettings.cpp:274
 msgid "Jamendo"
 msgstr ""
 
-#: gui/cachesettings.cpp:265
+#: gui/cachesettings.cpp:275
 msgid "Magnatune"
 msgstr ""
 
-#: gui/cachesettings.cpp:266
+#: gui/cachesettings.cpp:276
 msgid "Podcast Directories"
 msgstr ""
 
-#: gui/cachesettings.cpp:273
+#: gui/cachesettings.cpp:285
 msgid "Delete All"
 msgstr ""
 
-#: gui/cachesettings.cpp:312
+#: gui/cachesettings.cpp:324
 msgid "Delete all '%1' items?"
 msgstr ""
 
-#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
+#: gui/cachesettings.cpp:325 gui/cachesettings.cpp:335
 msgid "Delete Cache Items"
 msgstr ""
 
-#: gui/cachesettings.cpp:322
+#: gui/cachesettings.cpp:334
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr ""
 
-#: gui/coverdialog.cpp:151 gui/main.cpp:231
-msgid "Last.fm"
-msgstr ""
-
-#: gui/coverdialog.cpp:165
+#: gui/coverdialog.cpp:124
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1637,91 +1629,80 @@ msgid ""
 "%2 x %3 (%4)"
 msgstr ""
 
-#: gui/coverdialog.cpp:184
+#: gui/coverdialog.cpp:126
 msgctxt ""
-"Google\n"
-"width x height (file size)"
+"name\n"
+"width x height"
 msgid ""
-"Google\n"
-"%1 x %2 (%3)"
+"%1\n"
+"%2 x %3"
 msgstr ""
 
-#: gui/coverdialog.cpp:204
-msgctxt ""
-"Discogs\n"
-"width x height"
-msgid ""
-"Discogs\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:162
+msgid "Current Cover"
 msgstr ""
 
-#: gui/coverdialog.cpp:238
-msgctxt ""
-"Current Cover\n"
-"width x height"
-msgid ""
-"Current Cover\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:211 gui/coverdialog.cpp:411
+msgid "CoverArt Archive"
 msgstr ""
 
-#: gui/coverdialog.cpp:256
+#: gui/coverdialog.cpp:242
 msgid "Image"
 msgstr ""
 
-#: gui/coverdialog.cpp:259
+#: gui/coverdialog.cpp:245
 msgid "Downloading..."
 msgstr ""
 
-#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
+#: gui/coverdialog.cpp:290 gui/coverdialog.cpp:325
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr ""
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:446
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
 msgstr ""
 
-#: gui/coverdialog.cpp:433
+#: gui/coverdialog.cpp:447
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
 msgstr ""
 
-#: gui/coverdialog.cpp:440 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:234
-msgctxt "Album by Artist"
-msgid "%1 by %2"
+#: gui/coverdialog.cpp:452
+msgid "'%1' Artist Image"
+msgstr ""
+
+#: gui/coverdialog.cpp:454
+msgctxt "'Artist - Album' Album Cover"
+msgid "'%1 - %2' Album Cover"
 msgstr ""
 
-#: gui/coverdialog.cpp:579
+#: gui/coverdialog.cpp:582
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
 msgstr ""
 
-#: gui/coverdialog.cpp:607
+#: gui/coverdialog.cpp:616
 msgid "Failed to download image!"
 msgstr ""
 
-#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
+#: gui/coverdialog.cpp:875 gui/coverdialog.cpp:877
 msgid "Load Local Cover"
 msgstr ""
 
-#: gui/coverdialog.cpp:795
-msgid "Images (*.png *.jpg)"
-msgstr ""
-
-#: gui/coverdialog.cpp:800
+#: gui/coverdialog.cpp:882
 msgid "File is already in list!"
 msgstr ""
 
-#: gui/coverdialog.cpp:804
+#: gui/coverdialog.cpp:886
 msgid "Failed to read image!"
 msgstr ""
 
-#: gui/coverdialog.cpp:817
+#: gui/coverdialog.cpp:899
 msgid "Display"
 msgstr ""
 
@@ -1733,575 +1714,677 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QPushButton, removeBtn)
 #. i18n: file: streams/streamssettings.ui:73
 #. i18n: ectx: property (text), widget (QPushButton, removeButton)
-#: gui/coverdialog.cpp:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
-#: rc.cpp:286 rc.cpp:765
+#: gui/coverdialog.cpp:900 gui/stdactions.cpp:90 po/rc.cpp:347 po/rc.cpp:917
+#: rc.cpp:347 rc.cpp:917
 msgid "Remove"
 msgstr ""
 
-#: gui/coverdialog.cpp:1181
+#: gui/coverdialog.cpp:1333
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
 msgstr ""
 
-#: gui/coverdialog.cpp:1190
+#: gui/coverdialog.cpp:1342
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
 msgstr ""
 
-#: gui/coverdialog.cpp:1239
+#: gui/coverdialog.cpp:1391
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
 msgstr ""
 
-#: gui/folderpage.cpp:45
+#: gui/coverdialog.cpp:1449 models/onlineservicesmodel.cpp:157
+msgid "Searching..."
+msgstr ""
+
+#: gui/folderpage.cpp:44
 msgid "Open In File Manager"
 msgstr ""
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Established"
 msgstr ""
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Failed"
 msgstr ""
 
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
+#. i18n: file: support/shortcutssettingswidget.ui:78
+#. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
 #. i18n: file: support/shortcutssettingswidget.ui:78
 #. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
-#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
-#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
+#: gui/interfacesettings.cpp:48 gui/playbacksettings.cpp:46
+#: online/magnatuneservice.cpp:159 po/rc.cpp:6 po/rc.cpp:660 po/rc.cpp:751
+#: po/rc.cpp:778 po/rc.cpp:932 rc.cpp:6 rc.cpp:660 rc.cpp:751 rc.cpp:778
+#: rc.cpp:932
 msgid "None"
 msgstr ""
 
-#: gui/interfacesettings.cpp:40
+#: gui/interfacesettings.cpp:49 gui/interfacesettings.cpp:160
 msgid "Small"
 msgstr ""
 
-#: gui/interfacesettings.cpp:41
+#: gui/interfacesettings.cpp:50
 msgid "Medium"
 msgstr ""
 
-#: gui/interfacesettings.cpp:42
+#: gui/interfacesettings.cpp:51 gui/interfacesettings.cpp:159
 msgid "Large"
 msgstr ""
 
-#: gui/interfacesettings.cpp:43
+#: gui/interfacesettings.cpp:52
 msgid "Extra Large"
 msgstr ""
 
-#: gui/interfacesettings.cpp:48
+#: gui/interfacesettings.cpp:57
+msgid "Basic Tree (No Icons)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:58
 msgid "Simple Tree"
 msgstr ""
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:59
 msgid "Detailed Tree"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:329
+#. i18n: file: gui/interfacesettings.ui:449
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
+#: gui/interfacesettings.cpp:61 po/rc.cpp:639 rc.cpp:639
 msgid "Grouped Albums"
 msgstr ""
 
-#: gui/interfacesettings.cpp:53
+#: gui/interfacesettings.cpp:63
 msgid "List"
 msgstr ""
 
-#: gui/interfacesettings.cpp:55
+#: gui/interfacesettings.cpp:65
 msgid "Icon/List"
 msgstr ""
 
-#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+#. i18n: file: gui/interfacesettings.ui:454
+#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
+#: gui/interfacesettings.cpp:68 po/rc.cpp:642 rc.cpp:642
+msgid "Table"
+msgstr ""
+
+#: gui/interfacesettings.cpp:104
+msgid "Play queue"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:182
+#. i18n: ectx: attribute (title), widget (QWidget, tab)
+#: gui/interfacesettings.cpp:105 gui/mainwindow.cpp:307 po/rc.cpp:569
+#: rc.cpp:569
+msgid "Artists"
+msgstr ""
+
+#: gui/interfacesettings.cpp:107 gui/interfacesettings.cpp:138
+#: gui/mainwindow.cpp:309
 msgid "Folders"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:337
+#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
+#: gui/interfacesettings.cpp:108 gui/mainwindow.cpp:310 po/rc.cpp:609
+#: rc.cpp:609
+msgid "Playlists"
+msgstr ""
+
+#: gui/interfacesettings.cpp:110
+msgid "Dynamic Playlists"
+msgstr ""
+
+#: gui/interfacesettings.cpp:114
+msgid "Streams (e.g. Radio Stations)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:121
+msgid "Online Services - Jamendo, Maganatune, SoundCloud, and Podcasts"
+msgstr ""
+
+#: gui/interfacesettings.cpp:128
+msgid "Devices - UMS, MTP (e.g. Android), and AudioCDs"
+msgstr ""
+
+#: gui/interfacesettings.cpp:134
+msgid "Search (via MPD)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:135
+msgid "Info - Current song information (artist, album, and lyrics)"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#: gui/interfacesettings.cpp:165 gui/interfacesettings.cpp:168
-#: gui/interfacesettings.cpp:171 gui/interfacesettings.cpp:174 po/rc.cpp:472
-#: po/rc.cpp:491 po/rc.cpp:512 po/rc.cpp:536 rc.cpp:472 rc.cpp:491 rc.cpp:512
-#: rc.cpp:536
+#: gui/interfacesettings.cpp:139 po/rc.cpp:554 po/rc.cpp:572 po/rc.cpp:591
+#: po/rc.cpp:612 po/rc.cpp:636 rc.cpp:554 rc.cpp:572 rc.cpp:591 rc.cpp:612
+#: rc.cpp:636
 msgid "Style:"
 msgstr ""
 
-#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
-#: gui/preferencesdialog.cpp:89
-msgid "Online"
+#: gui/interfacesettings.cpp:161
+msgid "Tab-bar"
 msgstr ""
 
-#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
-msgid "Devices"
+#: gui/interfacesettings.cpp:162
+msgid "Left"
+msgstr ""
+
+#: gui/interfacesettings.cpp:162
+msgid "Right"
+msgstr ""
+
+#: gui/interfacesettings.cpp:163
+msgid "Top"
 msgstr ""
 
-#: gui/interfacesettings.cpp:178
-msgid "Grouped by 'Album Artist'"
+#: gui/interfacesettings.cpp:164
+msgid "Bottom"
 msgstr ""
 
-#: gui/interfacesettings.cpp:179
-msgid "Grouped under 'Various Artists'"
+#: gui/interfacesettings.cpp:391
+msgid "System default"
 msgstr ""
 
-#: gui/main.cpp:213 gui/mainwindow.cpp:1941 gui/trayitem.cpp:98
-#: gui/trayitem.cpp:100 gui/trayitem.cpp:135 gui/trayitem.cpp:199
-#: gui/trayitem.cpp:209 gui/trayitem.cpp:212 gui/trayitem.cpp:215
-#: gui/trayitem.cpp:228 gui/trayitem.cpp:230
+#: gui/main.cpp:224 gui/mainwindow.cpp:2075 gui/trayitem.cpp:112
+#: gui/trayitem.cpp:118 gui/trayitem.cpp:153 gui/trayitem.cpp:217
+#: gui/trayitem.cpp:227 gui/trayitem.cpp:230 gui/trayitem.cpp:233
+#: gui/trayitem.cpp:246 gui/trayitem.cpp:248
 msgid "Cantata"
 msgstr ""
 
-#: gui/main.cpp:214
+#: gui/main.cpp:225
 msgid "A KDE client for MPD"
 msgstr ""
 
-#: gui/main.cpp:216
-msgid "Copyright (c) 2011–2013 Craig Drummond"
+#: gui/main.cpp:227
+msgid "© 2011-2014 Craig Drummond"
 msgstr ""
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Craig Drummond"
 msgstr ""
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Maintainer"
 msgstr ""
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "Piotr Wicijowski"
 msgstr ""
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "UI Improvements"
 msgstr ""
 
-#: gui/main.cpp:222
+#: gui/main.cpp:233
 msgid "Sander Knopper"
 msgstr ""
 
-#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
+#: gui/main.cpp:233 gui/main.cpp:234 gui/main.cpp:235 gui/main.cpp:236
 msgid "QtMPC author"
 msgstr ""
 
-#: gui/main.cpp:223
+#: gui/main.cpp:234
 msgid "Roeland Douma"
 msgstr ""
 
-#: gui/main.cpp:224
+#: gui/main.cpp:235
 msgid "Daniel Selinger"
 msgstr ""
 
-#: gui/main.cpp:225
+#: gui/main.cpp:236
 msgid "Armin Walland"
 msgstr ""
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid "FanArt.tv"
 msgstr ""
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr ""
 
-#: gui/main.cpp:230
+#: gui/main.cpp:238
 msgid "Wikipedia"
 msgstr ""
 
-#: gui/main.cpp:230 gui/main.cpp:231
+#: gui/main.cpp:238 gui/main.cpp:239
 msgid "Context view metadata"
 msgstr ""
 
-#: gui/main.cpp:235
+#: gui/main.cpp:239
+msgid "Last.fm"
+msgstr ""
+
+#: gui/main.cpp:243
 msgid "URL to open"
 msgstr ""
 
-#: gui/mainwindow.cpp:238
+#: gui/mainwindow.cpp:269
 msgid "Quit"
 msgstr ""
 
-#: gui/mainwindow.cpp:242
+#: gui/mainwindow.cpp:273
 msgid "Show Window"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:469
 #. i18n: ectx: property (text), widget (QPushButton, connectButton)
-#: gui/mainwindow.cpp:245 po/rc.cpp:418 rc.cpp:418
+#: gui/mainwindow.cpp:276 po/rc.cpp:482 rc.cpp:482
 msgid "Connect"
 msgstr ""
 
-#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
+#: gui/mainwindow.cpp:277 gui/preferencesdialog.cpp:83
 msgid "Collection"
 msgstr ""
 
-#: gui/mainwindow.cpp:247
+#: gui/mainwindow.cpp:278
 msgid "Outputs"
 msgstr ""
 
-#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
+#: gui/mainwindow.cpp:279 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr ""
 
-#: gui/mainwindow.cpp:249
+#: gui/mainwindow.cpp:280
 msgid "Add To Stored Playlist"
 msgstr ""
 
-#: gui/mainwindow.cpp:250
+#: gui/mainwindow.cpp:281
 msgid "Remove From Play Queue"
 msgstr ""
 
-#: gui/mainwindow.cpp:251
+#: gui/mainwindow.cpp:282
 msgid "Copy Track Info"
 msgstr ""
 
-#: gui/mainwindow.cpp:252
+#: gui/mainwindow.cpp:283
 msgid "Crop"
 msgstr ""
 
-#: gui/mainwindow.cpp:253
+#: gui/mainwindow.cpp:284
 msgid "Shuffle Tracks"
 msgstr ""
 
-#: gui/mainwindow.cpp:254
+#: gui/mainwindow.cpp:285
 msgid "Shuffle Albums"
 msgstr ""
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:286
 msgid "Add Stream URL"
 msgstr ""
 
-#: gui/mainwindow.cpp:256
+#: gui/mainwindow.cpp:287
 msgid "Clear"
 msgstr ""
 
-#: gui/mainwindow.cpp:257
+#: gui/mainwindow.cpp:288
 msgid "Expanded Interface"
 msgstr ""
 
-#: gui/mainwindow.cpp:258
+#: gui/mainwindow.cpp:289
 msgid "Show Current Song Information"
 msgstr ""
 
-#: gui/mainwindow.cpp:261
+#: gui/mainwindow.cpp:292
 msgid "Full Screen"
 msgstr ""
 
-#: gui/mainwindow.cpp:263
+#: gui/mainwindow.cpp:294
 msgid "Random"
 msgstr ""
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:295
 msgid "Repeat"
 msgstr ""
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid "Single"
 msgstr ""
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
 msgstr ""
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid "Consume"
 msgstr ""
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
 msgstr ""
 
-#: gui/mainwindow.cpp:267
-msgid "Search Play Queue"
-msgstr ""
-
-#: gui/mainwindow.cpp:269
+#: gui/mainwindow.cpp:298
 msgid "Set Priority"
 msgstr ""
 
-#: gui/mainwindow.cpp:271
+#: gui/mainwindow.cpp:300
 msgid "Play Stream"
 msgstr ""
 
-#: gui/mainwindow.cpp:273
+#: gui/mainwindow.cpp:302
 msgid "Locate In Library"
 msgstr ""
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:304
 msgid "Edit Song Tags"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:304
+#. i18n: file: gui/interfacesettings.ui:429
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
+#: gui/mainwindow.cpp:306 po/rc.cpp:633 rc.cpp:633
 msgid "Play Queue"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:27
-#. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
-msgid "Artists"
+#: gui/mainwindow.cpp:312
+msgid "Dynamic"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:202
-#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
-#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
-msgid "Playlists"
+#: gui/mainwindow.cpp:315 gui/preferencesdialog.cpp:89
+#: widgets/groupedview.cpp:251
+msgid "Streams"
 msgstr ""
 
-#: gui/mainwindow.cpp:282
-msgid "Dynamic"
+#: gui/mainwindow.cpp:318 gui/preferencesdialog.cpp:94
+msgid "Online"
 msgstr ""
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:321
+msgid "Devices"
+msgstr ""
+
+#: gui/mainwindow.cpp:324
 msgid "Expand All"
 msgstr ""
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:325
 msgid "Collapse All"
 msgstr ""
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:326
 msgid "Remove All Songs"
 msgstr ""
 
-#: gui/mainwindow.cpp:398
+#: gui/mainwindow.cpp:456
 msgid "Info"
 msgstr ""
 
-#: gui/mainwindow.cpp:405
-msgid "Auto Hide"
-msgstr ""
-
-#: gui/mainwindow.cpp:411
-msgid "Monochrome Icons"
+#: gui/mainwindow.cpp:585
+msgid "Server information..."
 msgstr ""
 
-#: gui/mainwindow.cpp:541
-msgid "Server information..."
+#: gui/mainwindow.cpp:588
+msgid "Refresh Database"
 msgstr ""
 
-#: gui/mainwindow.cpp:552
+#: gui/mainwindow.cpp:602
 msgid "Configure Cantata..."
 msgstr ""
 
-#: gui/mainwindow.cpp:559
+#: gui/mainwindow.cpp:612
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr ""
 
-#: gui/mainwindow.cpp:571
+#: gui/mainwindow.cpp:624
 msgid "&File"
 msgstr ""
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:628
+msgid "&Edit"
+msgstr ""
+
+#: gui/mainwindow.cpp:631
 msgid "&Settings"
 msgstr ""
 
-#: gui/mainwindow.cpp:589 support/dialog.cpp:97
+#: gui/mainwindow.cpp:646 support/dialog.cpp:81
 msgid "&Help"
 msgstr ""
 
-#: gui/mainwindow.cpp:948
+#: gui/mainwindow.cpp:1035
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
 
-#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
+#: gui/mainwindow.cpp:1157 mpd/mpdconnection.cpp:401
 msgid "Connecting to %1"
 msgstr ""
 
-#: gui/mainwindow.cpp:1151
+#: gui/mainwindow.cpp:1189
+msgid "Refresh MPD Database?"
+msgstr ""
+
+#: gui/mainwindow.cpp:1257
 msgid ""
 "Podcasts are currently being downloaded\n"
 "\n"
 "Quiting now will abort all downloads."
 msgstr ""
 
-#: gui/mainwindow.cpp:1152
+#: gui/mainwindow.cpp:1258
 msgid "Abort downloads and quit"
 msgstr ""
 
-#: gui/mainwindow.cpp:1447
+#: gui/mainwindow.cpp:1577
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1448
+#: gui/mainwindow.cpp:1578
 msgctxt "Qt-only"
 msgid ""
-"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html"
-"\">GPLv3</a>"
+"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl."
+"html\">GPLv3</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1450
+#: gui/mainwindow.cpp:1580
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
-"QtMPC Authors<br/>"
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"The QtMPC Authors<br/>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1451
+#: gui/mainwindow.cpp:1581
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1452
+#: gui/mainwindow.cpp:1582
 msgctxt "Qt-only"
 msgid ""
 "Context view metadata courtesy of <a href=\"http://www.wikipedia.org"
 "\">Wikipedia</a> and <a href=\"http://www.last.fm\">Last.fm</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1453
+#: gui/mainwindow.cpp:1583
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1594
 msgid ""
-"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Uptime:</td><td>%4</td></"
-"tr><tr><td align=\"right\">Time playing:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right"
+"\">Protocol version: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Uptime: </td><td>%4</td></tr><tr><td align=\"right"
+"\">Time playing: </td><td>%5</td></tr>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1472
+#: gui/mainwindow.cpp:1602
 msgid ""
 "<tr><td colspan=\"2\"><b>Database</b></td></tr><tr><td align=\"right"
-"\">Artists:</td><td>%1</td></tr><tr><td align=\"right\">Albums:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Songs:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL handlers:</td><td>%4</td></tr><tr><td align=\"right\">Total "
-"duration:</td><td>%5</td></tr><tr><td align=\"right\">Last update:</td><td>"
-"%6</td></tr></table></p>"
+"\">Artists: </td><td>%1</td></tr><tr><td align=\"right\">Albums: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Songs: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Total duration: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Last update: </td><td>%6</td></tr></"
+"table></p>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1481
+#: gui/mainwindow.cpp:1611
 msgid "Server Information"
 msgstr ""
 
-#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
+#: gui/mainwindow.cpp:1859 gui/mainwindow.cpp:1866
 msgid "Cantata (%1)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
+#: gui/mainwindow.cpp:1862 gui/mainwindow.cpp:1869
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
+#: gui/mainwindow.cpp:1863 gui/mainwindow.cpp:1870
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1728
+#: gui/mainwindow.cpp:1874
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1730
+#: gui/mainwindow.cpp:1876
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1773
+#: gui/mainwindow.cpp:1919
 msgid "(Stream)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1775
+#: gui/mainwindow.cpp:1921
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr ""
 
-#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
+#: gui/mainwindow.cpp:1939 widgets/groupedview.cpp:278
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr ""
 
-#: gui/mainwindow.cpp:1843
+#: gui/mainwindow.cpp:1989 mpd/mpdconnection.cpp:543 mpd/mpdconnection.cpp:550
 msgid "MPD reported the following error: %1"
 msgstr ""
 
-#: gui/mainwindow.cpp:1990
+#: gui/mainwindow.cpp:2119
 msgid "Remove all songs from play queue?"
 msgstr ""
 
-#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
+#: gui/mainwindow.cpp:2210 models/playqueuemodel.cpp:113
 msgid "Priority"
 msgstr ""
 
-#: gui/mainwindow.cpp:2080
+#: gui/mainwindow.cpp:2210
 msgid "Enter priority (0..255):"
 msgstr ""
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Playlist Name"
 msgstr ""
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Enter a name for the playlist:"
 msgstr ""
 
-#: gui/mainwindow.cpp:2106
+#: gui/mainwindow.cpp:2236
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr ""
 
-#: gui/mainwindow.cpp:2107
+#: gui/mainwindow.cpp:2237
 msgid "Existing Playlist"
 msgstr ""
 
-#: gui/playbacksettings.cpp:42
-msgid "Do not fadeout"
+#: gui/mainwindow.cpp:2303
+msgid "Stream URL"
 msgstr ""
 
-#: gui/playbacksettings.cpp:43
-msgid " ms"
+#: gui/mainwindow.cpp:2303
+msgid "Enter URL of stream:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:165
+#: gui/mainwindow.cpp:2306
+msgid "Invalid, or unsupported, URL!"
+msgstr ""
+
+#: gui/mainwindow.cpp:2889
+msgid "Can only edit tags of songs within MPD's music collection."
+msgstr ""
+
+#. i18n: file: devices/albumdetails.ui:158
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
-#: gui/playbacksettings.cpp:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
-#: rc.cpp:79
+#: gui/playbacksettings.cpp:47 models/playqueuemodel.cpp:108 po/rc.cpp:110
+#: rc.cpp:110
 msgid "Track"
 msgstr ""
 
-#: gui/playbacksettings.cpp:51
+#: gui/playbacksettings.cpp:49
 msgid "Auto"
 msgstr ""
 
-#: gui/playbacksettings.cpp:164
+#: gui/playbacksettings.cpp:161
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:26
+#. i18n: file: gui/playbacksettings.ui:114
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
+#: gui/playbacksettings.cpp:164 po/rc.cpp:769 rc.cpp:769
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
 msgstr ""
 
-#: gui/playbacksettings.cpp:174
+#: gui/playbacksettings.cpp:171
 msgid ""
 "<p>Replay Gain is a proposed standard published in 2001 to normalize the "
 "perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It "
@@ -2315,133 +2398,199 @@ msgid ""
 "li></ul></p>"
 msgstr ""
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:95 widgets/playqueueview.cpp:160
+msgid "Stretch Columns To Fit Window"
+msgstr ""
+
+#: gui/playlistspage.cpp:146 tags/tageditor.cpp:828 tags/trackorganiser.cpp:72
 msgid "Rename"
 msgstr ""
 
-#: gui/playlistspage.cpp:190
+#: gui/playlistspage.cpp:147 models/playqueuemodel.cpp:156
+msgid "Remove Duplicates"
+msgstr ""
+
+#: gui/playlistspage.cpp:309
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
 msgstr ""
 
-#: gui/playlistspage.cpp:191
+#: gui/playlistspage.cpp:310
 msgid "Remove Playlists"
 msgstr ""
 
-#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
+#: gui/playlistspage.cpp:330 gui/playlistspage.cpp:357
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr ""
 
-#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
+#: gui/playlistspage.cpp:331 gui/playlistspage.cpp:358
 msgid "Overwrite Playlist"
 msgstr ""
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Rename Playlist"
 msgstr ""
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Enter new name for playlist:"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:80
+#: gui/playlistspage.cpp:446
+msgid "Cannot add songs from '%1' to '%2'"
+msgstr ""
+
+#: gui/preferencesdialog.cpp:83
 msgid "Collection Settings"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: file: gui/playbacksettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
+#: gui/preferencesdialog.cpp:84 po/rc.cpp:742 rc.cpp:742
 msgid "Playback"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:84
 msgid "Playback Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "Files"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "File Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:85
+#: gui/preferencesdialog.cpp:89
 msgid "Streams Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:89
+#: gui/preferencesdialog.cpp:94
 msgid "Online Providers"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context View Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:103
+#: gui/preferencesdialog.cpp:115
 msgid "Audio CD Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgid "Proxy"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cache"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cached Items"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:116
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#: gui/preferencesdialog.cpp:128 po/rc.cpp:53 po/rc.cpp:65 po/rc.cpp:410
+#: rc.cpp:53 rc.cpp:65 rc.cpp:410
 msgid "Configure"
 msgstr ""
 
-#: gui/serversettings.cpp:87
-msgid ""
-"<i> This folder will also be used to locate music files for transferring to "
-"(and from) devices.</i>"
-msgstr ""
-
-#: gui/serversettings.cpp:100
-msgid "Not used"
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#: gui/searchpage.cpp:200 po/rc.cpp:89 po/rc.cpp:371 po/rc.cpp:950 rc.cpp:89
+#: rc.cpp:371 rc.cpp:950
+msgid "Composer:"
+msgstr ""
+
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#: gui/searchpage.cpp:205 po/rc.cpp:95 po/rc.cpp:962 rc.cpp:95 rc.cpp:962
+msgid "Genre:"
+msgstr ""
+
+#: gui/searchpage.cpp:206
+msgid "Date:"
+msgstr ""
+
+#: gui/searchpage.cpp:208
+msgid "Any:"
+msgstr ""
+
+#: gui/searchpage.cpp:215
+msgid "No tracks found."
+msgstr ""
+
+#: gui/serversettings.cpp:87
+msgid ""
+"<i> This folder will also be used to locate music files for transferring to "
+"(and from) devices.</i>"
+msgstr ""
+
+#: gui/serversettings.cpp:100
+msgid "Not used"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:75
@@ -2456,8 +2605,8 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
-#: gui/serversettings.cpp:103 po/rc.cpp:208 po/rc.cpp:247 po/rc.cpp:705
-#: rc.cpp:208 rc.cpp:247 rc.cpp:705
+#: gui/serversettings.cpp:103 po/rc.cpp:269 po/rc.cpp:308 po/rc.cpp:857
+#: rc.cpp:269 rc.cpp:308 rc.cpp:857
 msgid "Host:"
 msgstr ""
 
@@ -2502,7 +2651,7 @@ msgid ""
 "</i></p>"
 msgstr ""
 
-#: gui/serversettings.cpp:252
+#: gui/serversettings.cpp:257
 msgid ""
 "Which type of collection do you wish to connect to?<br/><ul><li>Standard - "
 "music collection may be shared, is on another machine, or is already setup</"
@@ -2510,73 +2659,61 @@ msgid ""
 "configure and control the MPD instance</li></ul>"
 msgstr ""
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Add Collection"
 msgstr ""
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Standard"
 msgstr ""
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Basic"
 msgstr ""
 
-#: gui/serversettings.cpp:297
+#: gui/serversettings.cpp:302
 msgid "Delete <b>%1</b>?"
 msgstr ""
 
-#: gui/serversettings.cpp:298
+#: gui/serversettings.cpp:303
 msgid "Delete"
 msgstr ""
 
-#: gui/serversettings.cpp:336
+#: gui/serversettings.cpp:341
 msgid "New Collection %1"
 msgstr ""
 
-#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
+#: gui/serversettings.cpp:357 mpd/mpdconnection.cpp:173
 msgid "Default"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:74
+#: gui/shortcutssettingspage.cpp:76
 msgid "Multi-Media Keys"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:80
+#: gui/shortcutssettingspage.cpp:82
 msgid "Do not use media keys to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:81
+#: gui/shortcutssettingspage.cpp:83 gui/shortcutssettingspage.cpp:97
 msgid "Use media keys to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:84
+#: gui/shortcutssettingspage.cpp:86 gui/shortcutssettingspage.cpp:104
 msgid "Use media keys, as configured in desktop settings, to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:85
+#: gui/shortcutssettingspage.cpp:87 gui/shortcutssettingspage.cpp:105
 msgid ""
 "Use media keys, as configured in GNOME/Unity settings, to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
-#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+#: gui/shortcutssettingspage.cpp:90 gui/shortcutssettingspage.cpp:107
+#: online/onlineservicespage.cpp:99 streams/streamspage.cpp:99
+#: support/fancytabwidget.cpp:825
 msgid "Configure..."
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:95
-msgid "Use media keys to control Cantata:"
-msgstr ""
-
-#: gui/shortcutssettingspage.cpp:106
-msgid "Use media keys, as configured in desktop settings, to control Cantata:"
-msgstr ""
-
-#: gui/shortcutssettingspage.cpp:107
-msgid ""
-"Use media keys, as configured in GNOME/Unity settings, to control Cantata:"
-msgstr ""
-
 #: gui/stdactions.cpp:55
 msgid "Previous Track"
 msgstr ""
@@ -2649,7 +2786,7 @@ msgstr ""
 msgid "Add To Playlist"
 msgstr ""
 
-#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:66
 msgid "Organize Files"
 msgstr "Organise Files"
 
@@ -2657,7 +2794,7 @@ msgstr "Organise Files"
 msgid "Edit Tags"
 msgstr ""
 
-#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:106
 msgid "ReplayGain"
 msgstr ""
 
@@ -2670,88 +2807,89 @@ msgid "Set Image"
 msgstr ""
 
 #: gui/stdactions.cpp:88
-msgid "Refresh Database"
+msgid "Back"
 msgstr ""
 
-#: gui/stdactions.cpp:89
-msgid "Back"
+#: gui/stdactions.cpp:91
+msgid "Find"
 msgstr ""
 
-#: gui/trayitem.cpp:192
+#: gui/trayitem.cpp:210
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr ""
 
-#: gui/trayitem.cpp:193
+#: gui/trayitem.cpp:211
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr ""
 
-#: gui/trayitem.cpp:195
+#: gui/trayitem.cpp:213
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr ""
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:214
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr ""
 
-#: gui/trayitem.cpp:223
+#: gui/trayitem.cpp:241
 msgid "Now playing"
 msgstr ""
 
-#: http/httpserversettings.cpp:40
+#: http/httpserversettings.cpp:39
 msgid "Local loopback (%1)"
 msgstr ""
 
-#: http/httpserversettings.cpp:43
+#: http/httpserversettings.cpp:42
 msgid "Wired (%1)"
 msgstr ""
 
-#: http/httpserversettings.cpp:46
+#: http/httpserversettings.cpp:45
 msgid "Wireless (%1)"
 msgstr ""
 
-#: http/httpserversettings.cpp:53
+#: http/httpserversettings.cpp:52
 msgid "First active interface"
 msgstr ""
 
-#: http/httpserversettings.cpp:98
-msgid "Inactive"
+#: models/albumsmodel.cpp:260 models/musicmodel.cpp:254
+msgctxt "Album by Artist"
+msgid "%1 by %2"
 msgstr ""
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:221
+#: models/musicmodel.cpp:133
 msgid "Cue Sheet"
 msgstr ""
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:220
+#: models/musicmodel.cpp:133
 msgid "Playlist"
 msgstr ""
 
-#: models/devicesmodel.cpp:108
+#: models/devicesmodel.cpp:116
 msgid "Configure Device"
 msgstr ""
 
-#: models/devicesmodel.cpp:109
+#: models/devicesmodel.cpp:117
 msgid "Refresh Device"
 msgstr ""
 
-#: models/devicesmodel.cpp:110
+#: models/devicesmodel.cpp:118
 msgid "Connect Device"
 msgstr ""
 
-#: models/devicesmodel.cpp:111
+#: models/devicesmodel.cpp:119
 msgid "Disconnect Device"
 msgstr ""
 
-#: models/devicesmodel.cpp:113
+#: models/devicesmodel.cpp:121
 msgid "Edit CD Details"
 msgstr ""
 
-#: models/devicesmodel.cpp:690
+#: models/devicesmodel.cpp:730
 msgid "No Devices Attached"
 msgstr ""
 
@@ -2783,42 +2921,42 @@ msgstr ""
 msgid "Session expired"
 msgstr ""
 
-#: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
+#: models/dirviewmodel.cpp:204 models/dirviewmodel.cpp:212
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:696
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/dirviewmodel.cpp:190
+#: models/dirviewmodel.cpp:219
 msgid "Audio File"
 msgstr ""
 
-#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
-#: models/musiclibraryitemroot.cpp:844
+#: models/musiclibraryitemartist.cpp:248 models/musiclibraryitemartist.cpp:261
+#: models/musiclibraryitemroot.cpp:840
 msgid "Single Tracks"
 msgstr ""
 
-#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
-#: widgets/groupedview.cpp:366
+#: models/musicmodel.cpp:190 models/onlineservicesmodel.cpp:167
+#: widgets/groupedview.cpp:364
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/musicmodel.cpp:185
+#: models/musicmodel.cpp:196
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/musicmodel.cpp:192
+#: models/musicmodel.cpp:203
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/musicmodel.cpp:198
+#: models/musicmodel.cpp:209
 msgid "1 Episode"
 msgid_plural "%1 Episodes"
 msgstr[0] ""
@@ -2826,208 +2964,215 @@ msgstr[1] ""
 
 #. i18n: file: online/onlinesettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: models/onlineservicesmodel.cpp:83 po/rc.cpp:720 rc.cpp:720
+#: models/onlineservicesmodel.cpp:91 po/rc.cpp:872 rc.cpp:872
 msgid "Configure Service"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:84
+#: models/onlineservicesmodel.cpp:92
 msgid "Refresh Service"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:85
+#: models/onlineservicesmodel.cpp:93
 msgid "Add Subscription"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:86
+#: models/onlineservicesmodel.cpp:94
 msgid "Remove Subscription"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:87
+#: models/onlineservicesmodel.cpp:95
 msgid "Refresh Subscription"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:137
+#: models/onlineservicesmodel.cpp:145
 msgid "Last Search:%1"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:149
-msgid "Searching..."
-msgstr ""
-
-#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
-#: models/streamsmodel.cpp:670
+#: models/onlineservicesmodel.cpp:160 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:691
 msgid "Not Loaded"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:155
+#: models/onlineservicesmodel.cpp:163
 msgid "Use search to locate tracks"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:166
+#: models/onlineservicesmodel.cpp:174
 msgid "1 Podcast"
 msgid_plural "%1 Podcasts"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/onlineservicesmodel.cpp:177
+#: models/onlineservicesmodel.cpp:185
 msgid "(Downloading: %1%)"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:235
+#: models/onlineservicesmodel.cpp:243
 msgctxt "podcast name (num unplayed episodes)"
 msgid "%1 (%2)"
 msgstr ""
 
-#: models/playlistsmodel.cpp:77
+#: models/playlistsmodel.cpp:105
 msgid "New Playlist..."
 msgstr ""
 
-#: models/playqueuemodel.cpp:102
-msgctxt "Track Number (#)"
-msgid "#"
+#: models/playlistsmodel.cpp:321
+msgid "Smart Playlist"
 msgstr ""
 
-#: models/playqueuemodel.cpp:103
+#: models/playqueuemodel.cpp:109
 msgid "Length"
 msgstr ""
 
-#: models/playqueuemodel.cpp:104
+#: models/playqueuemodel.cpp:110
 msgid "Disc"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:138
+#. i18n: file: devices/filenameschemedialog.ui:174
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
+#: models/playqueuemodel.cpp:111 po/rc.cpp:248 rc.cpp:248
 msgid "Year"
 msgstr ""
 
-#: models/playqueuemodel.cpp:360
+#: models/playqueuemodel.cpp:158
+msgid "Undo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:160
+msgid "Redo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:404
 msgid "<b>(Priority: %1)</b>"
 msgstr ""
 
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:693
 msgid "Loading..."
 msgstr ""
 
-#: models/streamsmodel.cpp:286
+#: models/streamsmodel.cpp:302
 msgid "Bookmarks"
 msgstr ""
 
-#: models/streamsmodel.cpp:560
+#: models/streamsmodel.cpp:576
 msgid "TuneIn"
 msgstr ""
 
-#: models/streamsmodel.cpp:563
+#: models/streamsmodel.cpp:579
 msgid "IceCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:564
+#: models/streamsmodel.cpp:580
 msgid "ShoutCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:567
+#: models/streamsmodel.cpp:583
 msgid "SomaFM"
 msgstr ""
 
-#: models/streamsmodel.cpp:568
+#: models/streamsmodel.cpp:584
+msgid "Radio GFM"
+msgstr ""
+
+#: models/streamsmodel.cpp:585
 msgid "Digitally Imported"
 msgstr ""
 
-#: models/streamsmodel.cpp:569
+#: models/streamsmodel.cpp:586
 msgid "JazzRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:570
+#: models/streamsmodel.cpp:587
 msgid "RockRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:571
+#: models/streamsmodel.cpp:588
 msgid "Sky.fm"
 msgstr ""
 
-#: models/streamsmodel.cpp:572
+#: models/streamsmodel.cpp:589
 msgid "Favorites"
 msgstr "Favourites"
 
-#: models/streamsmodel.cpp:573
+#: models/streamsmodel.cpp:590
 msgid "Listen Live"
 msgstr ""
 
-#: models/streamsmodel.cpp:578
+#: models/streamsmodel.cpp:595
 msgid "Bookmark Category"
 msgstr ""
 
-#: models/streamsmodel.cpp:579
+#: models/streamsmodel.cpp:596
 msgid "Add Stream To Favorites"
 msgstr "Add Stream To Favourites"
 
-#: models/streamsmodel.cpp:580
+#: models/streamsmodel.cpp:597
 msgid "Configure Streams"
 msgstr ""
 
-#: models/streamsmodel.cpp:660
+#: models/streamsmodel.cpp:681
 msgid "%1 (Read-Only)"
 msgstr ""
 
-#: models/streamsmodel.cpp:1241
+#: models/streamsmodel.cpp:1261
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr ""
 
-#: models/streamsmodel.cpp:1639
+#: models/streamsmodel.cpp:1659
 msgid "All"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:154
+#: mpd/mpdconnection.cpp:179
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr ""
 
-#: mpd/mpdconnection.cpp:156
+#: mpd/mpdconnection.cpp:181
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:372 mpd/mpdconnection.cpp:415
-#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
-#: mpd/mpdconnection.cpp:1036
+#: mpd/mpdconnection.cpp:406 mpd/mpdconnection.cpp:451
+#: mpd/mpdconnection.cpp:501 mpd/mpdconnection.cpp:1137
+#: mpd/mpdconnection.cpp:1164
 msgid "Connection to %1 failed"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
+#: mpd/mpdconnection.cpp:412 mpd/mpdconnection.cpp:455
 msgid "Connection to %1 failed - incorrect password"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:455
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to send command to %1 - not connected"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:491
+#: mpd/mpdconnection.cpp:539
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr ""
 
-#: mpd/mpdconnection.cpp:493
+#: mpd/mpdconnection.cpp:541
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
 msgstr ""
 
-#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
+#: mpd/mpdconnection.cpp:547 mpd/mpdconnection.cpp:558
 msgid "Failed to send command. Disconnected from %1"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1306
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1183
+#: mpd/mpdconnection.cpp:1318
 msgid "Failed to save <b>%1</b>"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1196
+#: mpd/mpdconnection.cpp:1331
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1199
+#: mpd/mpdconnection.cpp:1334
 msgid "You cannot add a playlist to another playlist!"
 msgstr ""
 
@@ -3035,7 +3180,15 @@ msgstr ""
 msgid "Personal"
 msgstr ""
 
-#: mpd/song.cpp:343
+#: mpd/song.cpp:62
+msgid "Unknown"
+msgstr ""
+
+#: mpd/song.cpp:63
+msgid "Various Artists"
+msgstr ""
+
+#: mpd/song.cpp:427
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3102,8 +3255,8 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
-#: rc.cpp:711 rc.cpp:729
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:863 po/rc.cpp:881
+#: rc.cpp:863 rc.cpp:881
 msgid "Username:"
 msgstr ""
 
@@ -3131,9 +3284,9 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPasswordLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:220 po/rc.cpp:238
-#: po/rc.cpp:412 po/rc.cpp:647 po/rc.cpp:714 po/rc.cpp:732 rc.cpp:220
-#: rc.cpp:238 rc.cpp:412 rc.cpp:647 rc.cpp:714 rc.cpp:732
+#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:281 po/rc.cpp:299
+#: po/rc.cpp:476 po/rc.cpp:802 po/rc.cpp:866 po/rc.cpp:884 rc.cpp:281
+#: rc.cpp:299 rc.cpp:476 rc.cpp:802 rc.cpp:866 rc.cpp:884
 msgid "Password:"
 msgstr ""
 
@@ -3173,155 +3326,177 @@ msgstr ""
 msgid "Download To Library"
 msgstr ""
 
-#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
-msgid "Search For Podcasts"
-msgstr ""
-
-#: online/onlineservicespage.cpp:63
+#: online/onlineservicespage.cpp:62
 msgid "Download Podcast Episodes"
 msgstr ""
 
-#: online/onlineservicespage.cpp:64
+#: online/onlineservicespage.cpp:63
 msgid "Delete Downloaded Podcast Episodes"
 msgstr ""
 
-#: online/onlineservicespage.cpp:329
+#: online/onlineservicespage.cpp:320
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr ""
 
-#: online/onlineservicespage.cpp:464
+#: online/onlineservicespage.cpp:458
 msgid "Re-download music listing for %1?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:532
-msgid "Subscribe to Podcast"
-msgstr ""
-
-#: online/onlineservicespage.cpp:532
-msgid "Enter podcast URL:"
-msgstr ""
-
-#: online/onlineservicespage.cpp:541
-msgid "Invalid URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:546
-msgid "You are already subscribed to this URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:550
-msgid "Already downloading this URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:579
+#: online/onlineservicespage.cpp:544
 msgid "Unsubscribe from <b>%1</b>?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:600
+#: online/onlineservicespage.cpp:565
 msgid "Refresh all podcast listings?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:621
+#: online/onlineservicespage.cpp:586
 msgid "Refresh episode listing from <b>%1</b>?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:695
+#: online/onlineservicespage.cpp:652
 msgid "All selected podcasts have already been downloaded!"
 msgstr ""
 
-#: online/onlineservicespage.cpp:699
+#: online/onlineservicespage.cpp:656
 msgid "Do you wish to download the following podcast episode?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:702
+#: online/onlineservicespage.cpp:659
 msgid "Do you wish to download the following podcast episodes?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:705
+#: online/onlineservicespage.cpp:662
 msgid "Do you wish to download the selected podcast episodes?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:753
+#: online/onlineservicespage.cpp:710
 msgid "All selected downloaded podcast episodes have already been deleted!"
 msgstr ""
 
-#: online/onlineservicespage.cpp:757
+#: online/onlineservicespage.cpp:714
 msgid ""
 "Do you wish to delete the downloaded file of the following podcast episode?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:760
+#: online/onlineservicespage.cpp:717
 msgid ""
 "Do you wish to the delete downloaded files of the following podcast episodes?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:763
+#: online/onlineservicespage.cpp:720
 msgid ""
 "Do you wish to the delete downloaded files of the selected podcast episodes?"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:243
+#: online/podcastsearchdialog.cpp:253
 msgid "RSS:"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:245
+#: online/podcastsearchdialog.cpp:255
 msgid "Website:"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Podcast details"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Select a podcast to display its details"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:322
+#: online/podcastsearchdialog.cpp:333
 msgid "Enter search term..."
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:372
+#: online/podcastsearchdialog.cpp:383
 msgid "Failed to fetch podcasts from %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:378
+#: online/podcastsearchdialog.cpp:389
 msgid "There was a problem parsing the response from %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:439
+#: online/podcastsearchdialog.cpp:450
 msgid "Failed to download directory listing"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:447
+#: online/podcastsearchdialog.cpp:458
 msgid "Failed to parse directory listing"
 msgstr ""
 
 #: online/podcastsearchdialog.cpp:508
+msgid "URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:517
+msgid "Enter podcast URL..."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:518
+msgid "Load"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:525
+msgid "Enter podcast URL below, and press 'Load'"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:552
+msgid "Invalid URL!"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:562
+msgid "Failed to fetch podcast!"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:567
+msgid "Failed to parse podcast."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:571
+msgid ""
+"Cantata only supports audio podcasts! The URL entered contains only video "
+"podcasts."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:589
 msgid "Subscribe"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:607
+msgid "Enter URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:607
+msgid "Manual podcast URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search for podcasts on %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1 podcasts"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:602
+#: online/podcastsearchdialog.cpp:639
+msgid "Add Podcast Subscription"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:695
 msgid "Subscription added"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:604
+#: online/podcastsearchdialog.cpp:697
 msgid "You are already subscribed to this podcast!"
 msgstr ""
 
@@ -3329,91 +3504,170 @@ msgstr ""
 msgid "Podcasts"
 msgstr ""
 
-#: online/podcastservice.cpp:284
+#: online/podcastservice.cpp:288
 msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
 msgstr ""
 
-#: online/podcastservice.cpp:286
+#: online/podcastservice.cpp:290
 msgid "Failed to parse %1"
 msgstr ""
 
-#: online/podcastservice.cpp:290
+#: online/podcastservice.cpp:294
 msgid "Failed to download %1"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:58
+#: online/podcastsettingsdialog.cpp:59
 msgid "Check for new episodes:"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:59
+#: online/podcastsettingsdialog.cpp:60
 msgid "Download episodes to:"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:60
-msgid "Automatically download new episodes:"
+#: online/podcastsettingsdialog.cpp:67
+msgid "Automatically download new episodes"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:82
+#: online/podcastsettingsdialog.cpp:80
 msgid "Podcast Settings"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:84
+#: online/podcastsettingsdialog.cpp:82
 msgid "Manually"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:85
+#: online/podcastsettingsdialog.cpp:83
 msgid "Every 15 minutes"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:86
+#: online/podcastsettingsdialog.cpp:84
 msgid "Every 30 minutes"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:87
+#: online/podcastsettingsdialog.cpp:85
 msgid "Every hour"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:88
+#: online/podcastsettingsdialog.cpp:86
 msgid "Every 2 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:89
+#: online/podcastsettingsdialog.cpp:87
 msgid "Every 6 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:90
+#: online/podcastsettingsdialog.cpp:88
 msgid "Every 12 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:91
+#: online/podcastsettingsdialog.cpp:89
 msgid "Every day"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:92
+#: online/podcastsettingsdialog.cpp:90
 msgid "Every week"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:19
-#. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
-#: po/rc.cpp:3 rc.cpp:3
-msgid "Use backdrop:"
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:3 po/rc.cpp:657 rc.cpp:3 rc.cpp:657
+msgid "Background Image"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:36
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_artist)
+#: po/rc.cpp:9 rc.cpp:9
+msgid "Artist image"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#: po/rc.cpp:12 po/rc.cpp:666 rc.cpp:12 rc.cpp:666
+msgid "Custom image:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#: po/rc.cpp:15 po/rc.cpp:669 rc.cpp:15 rc.cpp:669
+msgid "Blur:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#: po/rc.cpp:18 po/rc.cpp:672 rc.cpp:18 rc.cpp:672
+msgid "10px"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: po/rc.cpp:21 po/rc.cpp:675 rc.cpp:21 rc.cpp:675
+msgid "Opacity:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#: po/rc.cpp:25 po/rc.cpp:679 rc.cpp:25 rc.cpp:679
+#, no-c-format
+msgid "40%"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, contextDarkBackground)
+#: po/rc.cpp:28 rc.cpp:28
+msgid "Dark background"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:32
-#. i18n: ectx: property (text), widget (BuddyLabel, contextDarkBackgroundLabel)
-#: po/rc.cpp:6 rc.cpp:6
-msgid "Dark background:"
+#. i18n: file: context/othersettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, wikipediaIntroOnly)
+#: po/rc.cpp:31 rc.cpp:31
+msgid "Only show basic wikipedia text"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:45
-#. i18n: ectx: property (text), widget (BuddyLabel, wikipediaIntroOnlyLabel)
-#: po/rc.cpp:9 rc.cpp:9
-msgid "Only show basic wikipedia text:"
+#. i18n: file: context/othersettings.ui:178
+#. i18n: ectx: property (text), widget (QCheckBox, contextAlwaysCollapsed)
+#: po/rc.cpp:34 rc.cpp:34
+msgid "Always collapse into a single pane"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:86
+#. i18n: file: context/othersettings.ui:207
 #. i18n: ectx: property (text), widget (StateLabel, wikipediaIntroOnlyNote)
-#: po/rc.cpp:13 rc.cpp:13
+#: po/rc.cpp:38 rc.cpp:38
 #, no-c-format
 msgid ""
 "<i><b>NOTE:</b> Cantata does not show the full wikipedia pages (with images, "
@@ -3426,188 +3680,172 @@ msgstr ""
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:16 rc.cpp:16
+#: po/rc.cpp:41 rc.cpp:41
 msgid "Available:"
 msgstr ""
 
 #. i18n: file: context/togglelist.ui:24
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:19 rc.cpp:19
+#: po/rc.cpp:44 rc.cpp:44
 msgid "Selected:"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:30
+#. i18n: file: devices/actiondialog.ui:33
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:22 rc.cpp:22
+#: po/rc.cpp:47 rc.cpp:47
 msgid "Copy songs from:"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#: po/rc.cpp:25 po/rc.cpp:31 po/rc.cpp:49 po/rc.cpp:744 rc.cpp:25 rc.cpp:31
-#: rc.cpp:49 rc.cpp:744
+#: po/rc.cpp:50 po/rc.cpp:62 po/rc.cpp:896 rc.cpp:50 rc.cpp:62 rc.cpp:896
 msgid "TextLabel"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#: po/rc.cpp:28 po/rc.cpp:34 rc.cpp:28 rc.cpp:34
+#: po/rc.cpp:56 po/rc.cpp:68 rc.cpp:56 rc.cpp:68
 msgid "(Needs configuring)"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:123
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:37 rc.cpp:37
-msgid "Overwrite songs:"
-msgstr ""
-
-#. i18n: file: devices/actiondialog.ui:150
+#. i18n: file: devices/actiondialog.ui:86
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:40 rc.cpp:40
+#: po/rc.cpp:59 rc.cpp:59
 msgid "Copy songs to:"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:157
+#. i18n: file: devices/actiondialog.ui:149
 #. i18n: ectx: property (text), widget (QLabel, codecLabel)
-#: po/rc.cpp:43 rc.cpp:43
+#: po/rc.cpp:71 rc.cpp:71
 msgid "Destination format:"
 msgstr ""
 
-#. i18n: file: devices/actiondialog.ui:171
+#. i18n: file: devices/actiondialog.ui:163
+#. i18n: ectx: property (text), widget (QCheckBox, overwrite)
+#: po/rc.cpp:74 rc.cpp:74
+msgid "Overwrite songs"
+msgstr ""
+
+#. i18n: file: devices/actiondialog.ui:170
 #. i18n: ectx: property (text), widget (QLabel, songCountLabel)
-#: po/rc.cpp:46 rc.cpp:46
+#: po/rc.cpp:77 rc.cpp:77
 msgid "To copy:"
 msgstr ""
 
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#: po/rc.cpp:80 po/rc.cpp:968 po/rc.cpp:995 rc.cpp:80 rc.cpp:968 rc.cpp:995
+msgid ""
+"<i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i>"
+msgstr ""
+
 #. i18n: file: devices/albumdetails.ui:26
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:52 rc.cpp:52
+#: po/rc.cpp:83 rc.cpp:83
 msgid "Album Details"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#: po/rc.cpp:58 po/rc.cpp:298 po/rc.cpp:798 rc.cpp:58 rc.cpp:298 rc.cpp:798
-msgid "Composer:"
-msgstr ""
-
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
-msgid "Genre:"
-msgstr ""
-
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#: po/rc.cpp:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
+#: po/rc.cpp:98 po/rc.cpp:965 rc.cpp:98 rc.cpp:965
 msgid "Year:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:99
+#. i18n: file: devices/albumdetails.ui:102
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:70 rc.cpp:70
+#: po/rc.cpp:101 rc.cpp:101
 msgid "Disc:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:73 rc.cpp:73
-msgid "Single artist:"
+#. i18n: file: devices/albumdetails.ui:115
+#. i18n: ectx: property (text), widget (QCheckBox, singleArtist)
+#: po/rc.cpp:104 rc.cpp:104
+msgid "Single artist"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:20
+#. i18n: file: devices/audiocdsettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:119 rc.cpp:119
 msgid "Album and Track Information Retrieval"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:26
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:91 rc.cpp:91
-msgid "Automatically lookup:"
-msgstr ""
-
-#. i18n: file: devices/audiocdsettings.ui:39
+#. i18n: file: devices/audiocdsettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:122 rc.cpp:122
 msgid "Initially look up via:"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:52
+#. i18n: file: devices/audiocdsettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:125 rc.cpp:125
 msgid "CDDB Host:"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:65
+#. i18n: file: devices/audiocdsettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:128 rc.cpp:128
 msgid "CDDB Port:"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:88
+#. i18n: file: devices/audiocdsettings.ui:84
+#. i18n: ectx: property (text), widget (QCheckBox, cdAuto)
+#: po/rc.cpp:131 rc.cpp:131
+msgid "Lookup information as soon as CD is inserted"
+msgstr ""
+
+#. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:134 rc.cpp:134
 msgid "Audio Extraction"
 msgstr ""
 
-#. i18n: file: devices/audiocdsettings.ui:94
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:106 rc.cpp:106
-msgid "Full paranoia mode (best quality):"
+#. i18n: file: devices/audiocdsettings.ui:100
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaFull)
+#: po/rc.cpp:137 rc.cpp:137
+msgid "Full paranoia mode (best quality)"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:107
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:109 rc.cpp:109
-msgid "Never skip on read error:"
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaNeverSkip)
+#: po/rc.cpp:140 rc.cpp:140
+msgid "Never skip on read error"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:112 rc.cpp:112
+#: po/rc.cpp:143 rc.cpp:143
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3633,188 +3871,255 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
 #. i18n: file: gui/serversettings.ui:325
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
-#: po/rc.cpp:115 po/rc.cpp:415 po/rc.cpp:433 po/rc.cpp:650 po/rc.cpp:671
-#: rc.cpp:115 rc.cpp:415 rc.cpp:433 rc.cpp:650 rc.cpp:671
+#: po/rc.cpp:146 po/rc.cpp:479 po/rc.cpp:497 po/rc.cpp:805 po/rc.cpp:826
+#: rc.cpp:146 rc.cpp:479 rc.cpp:497 rc.cpp:805 rc.cpp:826
 msgid "Music folder:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:149 rc.cpp:149
 msgid "Copy album covers as:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: po/rc.cpp:152 rc.cpp:152
 msgid "Maximum cover size:"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:82
-#. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:124 rc.cpp:124
-msgid "'Various Artists' workaround:"
+#. i18n: file: devices/devicepropertieswidget.ui:85
+#. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
+#: po/rc.cpp:155 rc.cpp:155
+msgid "Default volume:"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, autoScanLabel)
-#: po/rc.cpp:127 rc.cpp:127
-msgid "Automatically scan music when attached:"
+#. i18n: file: devices/devicepropertieswidget.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, fixVariousArtists)
+#: po/rc.cpp:158 rc.cpp:158
+msgid "'Various Artists' workaround"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:108
-#. i18n: ectx: property (text), widget (BuddyLabel, useCacheLabel)
-#: po/rc.cpp:130 rc.cpp:130
-msgid "Use cache:"
+#. i18n: file: devices/devicepropertieswidget.ui:99
+#. i18n: ectx: property (text), widget (QCheckBox, autoScan)
+#: po/rc.cpp:161 rc.cpp:161
+msgid "Automatically scan music when attached"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:121
-#. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:133 rc.cpp:133
-msgid "Default volume:"
+#. i18n: file: devices/devicepropertieswidget.ui:106
+#. i18n: ectx: property (text), widget (QCheckBox, useCache)
+#: po/rc.cpp:164 rc.cpp:164
+msgid "Use cache"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#: po/rc.cpp:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
+#: po/rc.cpp:167 po/rc.cpp:971 rc.cpp:167 rc.cpp:971
 msgid "Filenames"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
-msgid "Use only ASCII characters:"
-msgstr ""
-
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
-msgid "Replace spaces with underscores:"
-msgstr ""
-
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
-msgid "Ignore 'The' in artist names:"
-msgstr ""
-
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
+#: po/rc.cpp:170 po/rc.cpp:974 rc.cpp:170 rc.cpp:974
 msgid "Filename scheme:"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
-msgid "VFAT safe:"
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#: po/rc.cpp:173 po/rc.cpp:977 rc.cpp:173 rc.cpp:977
+msgid "VFAT safe"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:250
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#: po/rc.cpp:176 po/rc.cpp:980 rc.cpp:176 rc.cpp:980
+msgid "Use only ASCII characters"
+msgstr ""
+
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#: po/rc.cpp:179 po/rc.cpp:983 rc.cpp:179 rc.cpp:983
+msgid "Replace spaces with underscores"
+msgstr ""
+
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#: po/rc.cpp:182 po/rc.cpp:986 rc.cpp:182 rc.cpp:986
+msgid "Ignore 'The' in artist names"
+msgstr ""
+
+#. i18n: file: devices/devicepropertieswidget.ui:192
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:185 rc.cpp:185
 msgid "Transcoding"
 msgstr ""
 
-#. i18n: file: devices/devicepropertieswidget.ui:261
-#. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:157 rc.cpp:157
-msgid "Only transcode if source file is of a different format:"
+#. i18n: file: devices/devicepropertieswidget.ui:201
+#. i18n: ectx: property (text), widget (QCheckBox, transcoderWhenDifferent)
+#: po/rc.cpp:188 rc.cpp:188
+msgid "Only transcode if source file is of a different format"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:29
+#. i18n: file: devices/filenameschemedialog.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:191 rc.cpp:191
 msgid "Example:"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:58
+#. i18n: file: devices/filenameschemedialog.ui:67
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:194 rc.cpp:194
 msgid "About filename schemes"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:70
+#. i18n: file: devices/filenameschemedialog.ui:79
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumArtist)
+#: po/rc.cpp:197 rc.cpp:197
+msgid ""
+"The artist of the album. For most albums, this will be the same as the "
+"<i>Track Artist.</i> For compilations, this will often be <i>Various Artists."
+"</i>"
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:82
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:200 rc.cpp:200
 msgid "Album Artist"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:77
+#. i18n: file: devices/filenameschemedialog.ui:89
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumTitle)
+#: po/rc.cpp:203 rc.cpp:203
+msgid "The name of the album."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:92
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:206 rc.cpp:206
 msgid "Album Title"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:91
+#. i18n: file: devices/filenameschemedialog.ui:99
+#. i18n: ectx: property (toolTip), widget (QPushButton, composer)
+#: po/rc.cpp:209 rc.cpp:209
+msgid "The composer."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:109
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtist)
+#: po/rc.cpp:215 rc.cpp:215
+msgid "The artist of each track."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:112
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:218 rc.cpp:218
 msgid "Track Artist"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:98
+#. i18n: file: devices/filenameschemedialog.ui:119
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackTitle)
+#: po/rc.cpp:221 rc.cpp:221
+msgid "The track title (without <i>Track Artist</i>)."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:122
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:224 rc.cpp:224
 msgid "Track Title"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:117
+#. i18n: file: devices/filenameschemedialog.ui:141
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtistAndTitle)
+#: po/rc.cpp:227 rc.cpp:227
+msgid ""
+"The track title (with <i>Track Artist</i>, if different to <i>Album Artist</"
+"i>)."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:144
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:230 rc.cpp:230
 msgid "Track Title (+Artist)"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:124
+#. i18n: file: devices/filenameschemedialog.ui:151
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackNo)
+#: po/rc.cpp:233 rc.cpp:233
+msgid "The track number."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:154
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:184 rc.cpp:184
+#: po/rc.cpp:236 rc.cpp:236
 msgid "Track #"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:131
+#. i18n: file: devices/filenameschemedialog.ui:161
+#. i18n: ectx: property (toolTip), widget (QPushButton, cdNo)
+#: po/rc.cpp:239 rc.cpp:239
+msgid ""
+"The album number of a multi-album album. Often compilations consist of "
+"several albums."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:164
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:187 rc.cpp:187
+#: po/rc.cpp:242 rc.cpp:242
 msgid "CD #"
 msgstr ""
 
+#. i18n: file: devices/filenameschemedialog.ui:171
+#. i18n: ectx: property (toolTip), widget (QPushButton, year)
+#: po/rc.cpp:245 rc.cpp:245
+msgid "The year of the album's release."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:181
+#. i18n: ectx: property (toolTip), widget (QPushButton, genre)
+#: po/rc.cpp:251 rc.cpp:251
+msgid "The genre of the album."
+msgstr ""
+
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:196 rc.cpp:196
+#: po/rc.cpp:257 rc.cpp:257
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -3822,17 +4127,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
-#: po/rc.cpp:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
+#: po/rc.cpp:260 po/rc.cpp:353 po/rc.cpp:848 rc.cpp:260 rc.cpp:353 rc.cpp:848
 msgid "Type:"
 msgstr ""
 
@@ -3844,14 +4149,16 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, nameLabel)
 #. i18n: file: gui/serversettings.ui:63
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
-#: rc.cpp:638
+#: po/rc.cpp:263 po/rc.cpp:793 streams/streamdialog.cpp:71 rc.cpp:263
+#: rc.cpp:793
 msgid "Name:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:205 rc.cpp:205
+#. i18n: file: gui/interfacesettings.ui:122
+#. i18n: ectx: property (title), widget (QGroupBox, optionsGroup)
+#: po/rc.cpp:266 rc.cpp:266 po/rc.cpp:551 rc.cpp:551
 msgid "Options"
 msgstr ""
 
@@ -3875,8 +4182,8 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: network/proxysettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPortLabel)
-#: po/rc.cpp:211 po/rc.cpp:250 po/rc.cpp:409 po/rc.cpp:644 po/rc.cpp:708
-#: rc.cpp:211 rc.cpp:250 rc.cpp:409 rc.cpp:644 rc.cpp:708
+#: po/rc.cpp:272 po/rc.cpp:311 po/rc.cpp:473 po/rc.cpp:799 po/rc.cpp:860
+#: rc.cpp:272 rc.cpp:311 rc.cpp:473 rc.cpp:799 rc.cpp:860
 msgid "Port:"
 msgstr ""
 
@@ -3892,7 +4199,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2x)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:322
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel)
-#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
+#: po/rc.cpp:275 po/rc.cpp:293 po/rc.cpp:314 rc.cpp:275 rc.cpp:293 rc.cpp:314
 msgid "User:"
 msgstr ""
 
@@ -3904,7 +4211,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:218
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2x)
-#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:278 po/rc.cpp:296 rc.cpp:278 rc.cpp:296
 msgid "Domain:"
 msgstr ""
 
@@ -3916,7 +4223,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:248
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2)
-#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
+#: po/rc.cpp:284 po/rc.cpp:302 rc.cpp:284 rc.cpp:302
 msgid "Share:"
 msgstr ""
 
@@ -3928,7 +4235,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QLabel, label_4)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:263
 #. i18n: ectx: property (text), widget (QLabel, label_4x)
-#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
+#: po/rc.cpp:287 po/rc.cpp:305 rc.cpp:287 rc.cpp:305
 msgid ""
 "<i><b>NOTE:</b> If you enter a password here, it will be stored "
 "<b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the "
@@ -3937,7 +4244,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:229 rc.cpp:229
+#: po/rc.cpp:290 rc.cpp:290
 msgid "Service name:"
 msgstr ""
 
@@ -3949,19 +4256,19 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:390
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
+#: po/rc.cpp:317 po/rc.cpp:326 rc.cpp:317 rc.cpp:326
 msgid "Folder:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:259 rc.cpp:259
+#: po/rc.cpp:320 rc.cpp:320
 msgid "Extra Options:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:323 rc.cpp:323
 msgid ""
 "<i><b>NOTE:</b> Due to the way sshfs works, a suitable ssh-askpass "
 "application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter "
@@ -3970,7 +4277,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:329 rc.cpp:329
 msgid ""
 "<i><b>NOTE:</b> This dialog is only used to add remote devices (e.g. via "
 "Samba), or to access locally mounted folders. For normal media players, "
@@ -3980,178 +4287,160 @@ msgstr ""
 
 #. i18n: file: dynamic/dynamicpage.ui:26
 #. i18n: ectx: property (text), widget (StatusLabel, infoLabel)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:332 rc.cpp:332
 msgid "No dynamizer port defined in server settings."
 msgstr "No dynamiser port defined in server settings."
 
 #. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:274 rc.cpp:274
+#: po/rc.cpp:335 rc.cpp:335
 msgid "Remote dynamizer is not running."
 msgstr "Remote dynamiser is not running."
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:277 rc.cpp:277
+#: po/rc.cpp:338 rc.cpp:338
 msgid "Name of Dynamic Rules"
 msgstr ""
 
 #. i18n: file: dynamic/dynamicrules.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, editBtn)
-#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
+#: po/rc.cpp:344 streams/streamspage.cpp:62 rc.cpp:344
 msgid "Edit"
 msgstr ""
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:350 rc.cpp:350
 msgid "About Rules"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:38
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:295 rc.cpp:295
-msgid "Album Artist:"
+#. i18n: file: dynamic/dynamicrule.ui:37
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:356 rc.cpp:356
+msgid "Include songs that match the following:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
-msgid "Album:"
+#. i18n: file: dynamic/dynamicrule.ui:42
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:359 rc.cpp:359
+msgid "Exclude songs that match the following:"
+msgstr ""
+
+#. i18n: file: dynamic/dynamicrule.ui:63
+#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
+#: po/rc.cpp:365 rc.cpp:365
+msgid "Artists similar to:"
+msgstr ""
+
+#. i18n: file: dynamic/dynamicrule.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
+#: po/rc.cpp:368 rc.cpp:368
+msgid "Album Artist:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:103
+#. i18n: file: dynamic/dynamicrule.ui:141
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:310 rc.cpp:310
+#: po/rc.cpp:383 rc.cpp:383
 msgid "From Year:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#: po/rc.cpp:386 po/rc.cpp:392 rc.cpp:386 rc.cpp:392
 msgid "Any"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:126
+#. i18n: file: dynamic/dynamicrule.ui:164
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:316 rc.cpp:316
+#: po/rc.cpp:389 rc.cpp:389
 msgid "To Year:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:149
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:322 rc.cpp:322
-msgid "Exact match:"
-msgstr ""
-
-#. i18n: file: dynamic/dynamicrule.ui:173
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:328 rc.cpp:328
-msgid "Include songs that match the following:"
-msgstr ""
-
-#. i18n: file: dynamic/dynamicrule.ui:178
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:331 rc.cpp:331
-msgid "Exclude songs that match the following:"
-msgstr ""
-
-#. i18n: file: dynamic/dynamicrule.ui:186
-#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:334 rc.cpp:334
-msgid "Artists similar to:"
+#. i18n: file: dynamic/dynamicrule.ui:187
+#. i18n: ectx: property (text), widget (QCheckBox, exactCheck)
+#: po/rc.cpp:395 rc.cpp:395
+msgid "Exact match"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:236
+#. i18n: file: dynamic/dynamicrule.ui:231
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:337 rc.cpp:337
+#: po/rc.cpp:398 rc.cpp:398
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:262
+#. i18n: file: dynamic/dynamicrule.ui:260
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:340 rc.cpp:340
+#: po/rc.cpp:401 rc.cpp:401
 msgid ""
 "<i><b>NOTE</b> For genre, end string with an asterisk to match various "
 "genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. </i>"
 msgstr ""
 
-#. i18n: file: gui/coverdialog.ui:23
-#. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:343 rc.cpp:343
-msgid "<html><head/><body><p>Cancel current query</p></body></html>"
-msgstr ""
-
-#. i18n: file: gui/coverdialog.ui:37
+#. i18n: file: gui/coverdialog.ui:30
 #. i18n: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:349 rc.cpp:349
-msgid "<html><head/><body><p>Add a local file</p></body></html>"
-msgstr ""
-
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:352 po/rc.cpp:442 rc.cpp:352 rc.cpp:442
-msgid "Save downloaded covers in music folder:"
-msgstr ""
-
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:355 po/rc.cpp:445 rc.cpp:355 rc.cpp:445
-msgid "Save downloaded lyrics in music folder:"
-msgstr ""
-
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#: po/rc.cpp:358 po/rc.cpp:448 rc.cpp:358 rc.cpp:448
-msgid "Save downloaded backdrops in music folder:"
-msgstr ""
-
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:361 po/rc.cpp:451 rc.cpp:361 rc.cpp:451
-msgid "Save list of favorite streams in music folder:"
-msgstr "Save list of favourite streams in music folder:"
-
-#. i18n: file: gui/filesettings.ui:110
+#: po/rc.cpp:407 rc.cpp:407
+msgid "Add a local file"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#: po/rc.cpp:413 po/rc.cpp:506 rc.cpp:413 rc.cpp:506
+msgid "Save downloaded covers in music folder"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#: po/rc.cpp:416 po/rc.cpp:509 rc.cpp:416 rc.cpp:509
+msgid "Save downloaded lyrics in music folder"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#: po/rc.cpp:419 po/rc.cpp:512 rc.cpp:419 rc.cpp:512
+msgid "Save downloaded backdrops in music folder"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#: po/rc.cpp:422 po/rc.cpp:515 rc.cpp:422 rc.cpp:515
+msgid "Save list of favorite streams in music folder"
+msgstr "Save list of favourite streams in music folder"
+
+#. i18n: file: gui/filesettings.ui:79
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:425 rc.cpp:425
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, lyrics, or "
 "backdrops, within the music folder, and you do not have write access to this "
@@ -4163,9 +4452,18 @@ msgid ""
 "will only be accessible to yourself.</i>"
 msgstr ""
 
-#. i18n: file: gui/filesettings.ui:145
+#. i18n: file: gui/filesettings.ui:108
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:428 rc.cpp:428
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. (i.e. 'Artist/Album/Tracks')"
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:140
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:431 rc.cpp:431
 msgid ""
 "<i><b>NOTE:</b> If you change the location where streams are stored (i.e. "
 "you toggle the 'Save list of favorite streams in music folder' option), then "
@@ -4183,19 +4481,19 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:370 rc.cpp:370
+#: po/rc.cpp:434 rc.cpp:434
 msgid "Cantata First Run"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:373 rc.cpp:373
+#: po/rc.cpp:437 rc.cpp:437
 msgid "Welcome to Cantata"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:440 rc.cpp:440
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4208,13 +4506,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:379 rc.cpp:379
+#: po/rc.cpp:443 rc.cpp:443
 msgid "<html><head/><body><p>Welcome to Cantata</p></body></html>"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:128
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:382 rc.cpp:382
+#: po/rc.cpp:446 rc.cpp:446
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4225,13 +4523,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:166
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:385 rc.cpp:385
+#: po/rc.cpp:449 rc.cpp:449
 msgid "Standard multi-user/server setup"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:179
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:388 rc.cpp:388
+#: po/rc.cpp:452 rc.cpp:452
 msgid ""
 "<i>Select this option if your music collection is shared between users, your "
 "MPD instance is running on another machine, or you already have a personal "
@@ -4242,13 +4540,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:211
 #. i18n: ectx: property (text), widget (QRadioButton, basic)
-#: po/rc.cpp:391 rc.cpp:391
+#: po/rc.cpp:455 rc.cpp:455
 msgid "Basic single user setup"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:224
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
-#: po/rc.cpp:394 rc.cpp:394
+#: po/rc.cpp:458 rc.cpp:458
 msgid ""
 "<i>Select this option if your music collection is not shared with others, "
 "and you wish Cantata to configure and control the MPD instance.</i>"
@@ -4256,7 +4554,7 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:397 rc.cpp:397
+#: po/rc.cpp:461 rc.cpp:461
 msgid ""
 "<html><head/><body><p>For more information on MPD itself, please refer to "
 "the MPD website <a href=\"http://www.musicpd.org\"><span style=\" text-"
@@ -4267,13 +4565,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:400 rc.cpp:400
+#: po/rc.cpp:464 rc.cpp:464
 msgid "Connection details"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:341
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:403 rc.cpp:403
+#: po/rc.cpp:467 rc.cpp:467
 msgid ""
 "The settings below are the basic settings required by Cantata. Please enter "
 "the relevant details, and use the 'Connect' button to test the connection."
@@ -4287,16 +4585,17 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: gui/serversettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
-#: po/rc.cpp:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
+#: po/rc.cpp:470 po/rc.cpp:796 rc.cpp:470 rc.cpp:796
 msgid "Host (or local socket):"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:494
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:421 rc.cpp:421
+#: po/rc.cpp:485 rc.cpp:485
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
-"lyrics, etc.</i>"
+"lyrics, etc. If you're MPD instance is on a remote host, you may set this to "
+"a HTTP URL.</i>"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:520
@@ -4307,7 +4606,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
 #. i18n: file: gui/serversettings.ui:225
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#: po/rc.cpp:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
+#: po/rc.cpp:488 po/rc.cpp:820 rc.cpp:488 rc.cpp:820
 msgid ""
 "<i><b>NOTE:</b> When using a local socket the full absolute path to the "
 "socket needs to be set. (Port number is not required.)</i>"
@@ -4315,25 +4614,25 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:553
 #. i18n: ectx: property (text), widget (QLabel, label_13)
-#: po/rc.cpp:427 rc.cpp:427
+#: po/rc.cpp:491 rc.cpp:491
 msgid "Music folder"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:576
 #. i18n: ectx: property (text), widget (QLabel, label_12)
-#: po/rc.cpp:430 rc.cpp:430
+#: po/rc.cpp:494 rc.cpp:494
 msgid "Please choose the folder containing your music collection."
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:662
 #. i18n: ectx: property (text), widget (QLabel, label_6f)
-#: po/rc.cpp:436 rc.cpp:436
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Covers, Lyrics, and Streams"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:685
 #. i18n: ectx: property (text), widget (QLabel, label_5f)
-#: po/rc.cpp:439 rc.cpp:439
+#: po/rc.cpp:503 rc.cpp:503
 msgid ""
 "<p>Cantata will download missing covers, and lyrics, from the internet. "
 "Cantata also allows you to save a list of internet streams (e.g. Radio "
@@ -4342,9 +4641,9 @@ msgid ""
 "music folder, or within your personal cache/config folders.</p>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: file: gui/initialsettingswizard.ui:758
 #. i18n: ectx: property (text), widget (QLabel, persNote)
-#: po/rc.cpp:454 rc.cpp:454
+#: po/rc.cpp:518 rc.cpp:518
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
 "the music folder, and you do not have write access to this folder, then "
@@ -4356,33 +4655,42 @@ msgid ""
 "be accessible to yourself.</i>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:824
-#. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:457 rc.cpp:457
+#. i18n: file: gui/initialsettingswizard.ui:784
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:521 rc.cpp:521
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. i.e. 'Artist/Album/Tracks'."
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/initialsettingswizard.ui:810
+#. i18n: ectx: property (text), widget (StateLabel, httpNote)
+#: po/rc.cpp:524 rc.cpp:524
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata "
 "currently cannot upload files to external HTTP servers. Therefore, the above "
-"settings should be left disabled.</i>"
+"settings should be left un-checked.</i>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:857
+#. i18n: file: gui/initialsettingswizard.ui:843
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:460 rc.cpp:460
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Finished!"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:880
+#. i18n: file: gui/initialsettingswizard.ui:866
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:463 rc.cpp:463
+#: po/rc.cpp:530 rc.cpp:530
 msgid ""
 "Cantata is now configured! If you wish to further configure Cantata (to add "
 "extra MPD hosts, etc) then Canta's configuration dialog may be accessed from "
 "the menu triggered by the button in the top-right of Cantata's main window."
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:918
+#. i18n: file: gui/initialsettingswizard.ui:904
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:466 rc.cpp:466
+#: po/rc.cpp:533 rc.cpp:533
 msgid ""
 "<b>Warning:</b> You are not currently a member of the 'users' group. Cantata "
 "will function better (saving of album covers, lyrics, etc. with the correct "
@@ -4391,284 +4699,392 @@ msgid ""
 "effect."
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:36
+#. i18n: ectx: attribute (title), widget (QWidget, sidebarTab)
+#: po/rc.cpp:536 rc.cpp:536
+msgid "Sidebar"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:42
+#. i18n: ectx: property (title), widget (QGroupBox, viewsGroup)
+#: po/rc.cpp:539 rc.cpp:539
+msgid "Views"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:48
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:542 rc.cpp:542
+msgid "Use the checkboxes below to configure the list of active views."
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, sbPlayQueueLabel)
+#: po/rc.cpp:545 rc.cpp:545
+msgid ""
+"<i><b>NOTE:</b> By default, the play queue appears to the side of the other "
+"views. If you enable the option above, then it will be merged into the "
+"sidebar as per other views.</i>"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:106
+#. i18n: ectx: property (text), widget (StateLabel, sbInfoLabel)
+#: po/rc.cpp:548 rc.cpp:548
+msgid ""
+"<i><b>NOTE:</b> By default, the 'Info' (current song information) view is "
+"accessible by pressing its icon in the main toolbar. If you enable the "
+"option above, then it will be merged into the sidebar as per other views.</i>"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:144
+#. i18n: ectx: property (text), widget (BuddyLabel, sbPositionLabel)
+#: po/rc.cpp:557 rc.cpp:557
+msgid "Position:"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:157
+#. i18n: ectx: property (text), widget (QCheckBox, sbIconsOnly)
+#: po/rc.cpp:560 rc.cpp:560
+msgid "Only show icons, no text"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, sbMonoIcons)
+#: po/rc.cpp:563 rc.cpp:563
+msgid "Use monochrome icons"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, sbAutoHide)
+#: po/rc.cpp:566 rc.cpp:566
+msgid "Auto-hide"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#: po/rc.cpp:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
+#: po/rc.cpp:575 po/rc.cpp:594 rc.cpp:575 rc.cpp:594
 msgid "Covers:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:478 rc.cpp:478
-msgid "Show artist images:"
+#. i18n: file: gui/interfacesettings.ui:219
+#. i18n: ectx: property (text), widget (QCheckBox, libraryArtistImage)
+#: po/rc.cpp:578 rc.cpp:578
+msgid "Show artist images"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:81
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:481 rc.cpp:481
-msgid "Show album year:"
+#. i18n: file: gui/interfacesettings.ui:226
+#. i18n: ectx: property (text), widget (QCheckBox, libraryYear)
+#: po/rc.cpp:581 rc.cpp:581
+msgid "Show album year"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:123
+#. i18n: file: gui/interfacesettings.ui:258
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:484 rc.cpp:484
+#: po/rc.cpp:584 rc.cpp:584
 msgid ""
 "<i><b>NOTE:</b> When looking for artist images, Cantata will look for either "
 "artist.jpg, artist.png, 'Artist'.jpg, or 'Artist'.png,\n"
 "within the folder of the current track, or within its parent folder. If no "
-"image is found, Cantata will attempt to download one. When the image is "
-"displayed, it will be cropped (either top/bottom, or left/right) to provide "
-"a square image.</i>"
+"image is found, Cantata will attempt to download one.</i>"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:172
+#. i18n: file: gui/interfacesettings.ui:307
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:497 rc.cpp:497
+#: po/rc.cpp:597 rc.cpp:597
 msgid "Sort albums:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:183
+#. i18n: file: gui/interfacesettings.ui:318
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:500 rc.cpp:500
+#: po/rc.cpp:600 rc.cpp:600
 msgid "Album/Artist"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:188
+#. i18n: file: gui/interfacesettings.ui:323
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:503 rc.cpp:503
+#: po/rc.cpp:603 rc.cpp:603
 msgid "Artist/Album"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: file: gui/interfacesettings.ui:328
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:506 rc.cpp:506
+#: po/rc.cpp:606 rc.cpp:606
 msgid "Artist/Year/Album"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#: po/rc.cpp:515 po/rc.cpp:545 rc.cpp:515 rc.cpp:545
-msgid "Initially collapse albums:"
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#: po/rc.cpp:615 po/rc.cpp:645 rc.cpp:615 rc.cpp:645
+msgid "Initially collapse albums"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:242
+#. i18n: file: gui/interfacesettings.ui:367
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:518 rc.cpp:518
+#: po/rc.cpp:618 rc.cpp:618
 msgid "Other Views"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:251
+#. i18n: file: gui/interfacesettings.ui:376
 #. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
-#: po/rc.cpp:521 rc.cpp:521
+#: po/rc.cpp:621 rc.cpp:621
 msgid "Folder view style:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:264
+#. i18n: file: gui/interfacesettings.ui:389
 #. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
-#: po/rc.cpp:524 rc.cpp:524
+#: po/rc.cpp:624 rc.cpp:624
 msgid "Streams view style:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:277
+#. i18n: file: gui/interfacesettings.ui:402
 #. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
-#: po/rc.cpp:527 rc.cpp:527
+#: po/rc.cpp:627 rc.cpp:627
 msgid "Online view style:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:290
+#. i18n: file: gui/interfacesettings.ui:415
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:530 rc.cpp:530
+#: po/rc.cpp:630 rc.cpp:630
 msgid "Devices view style:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:324
-#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:539 rc.cpp:539
-msgid "Table"
-msgstr ""
-
-#. i18n: file: gui/interfacesettings.ui:354
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueAutoExpandLabel)
-#: po/rc.cpp:548 rc.cpp:548
-msgid "Automatically expand current album:"
+#. i18n: file: gui/interfacesettings.ui:469
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueAutoExpand)
+#: po/rc.cpp:648 rc.cpp:648
+msgid "Automatically expand current album"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:371
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueScrollLabel)
-#: po/rc.cpp:551 rc.cpp:551
-msgid "Scroll to current track:"
+#. i18n: file: gui/interfacesettings.ui:476
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueScroll)
+#: po/rc.cpp:651 rc.cpp:651
+msgid "Scroll to current track"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:384
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueBackgroundLabel)
-#: po/rc.cpp:554 rc.cpp:554
-msgid "Use current album cover as background:"
+#. i18n: file: gui/interfacesettings.ui:483
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueConfirmClear)
+#: po/rc.cpp:654 rc.cpp:654
+msgid "Prompt before clearing"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:397
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueConfirmClearLabel)
-#: po/rc.cpp:557 rc.cpp:557
-msgid "Prompt before clearing:"
+#. i18n: file: gui/interfacesettings.ui:509
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_cover)
+#: po/rc.cpp:663 rc.cpp:663
+msgid "Current album cover"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:411
+#. i18n: file: gui/interfacesettings.ui:638
 #. i18n: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:560 rc.cpp:560
+#: po/rc.cpp:682 rc.cpp:682
 msgid "External"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:417
-#. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:563 rc.cpp:563
-msgid "Show icon in notification area:"
+#. i18n: file: gui/interfacesettings.ui:644
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayPopup)
+#: po/rc.cpp:685 rc.cpp:685
+msgid "Show popup messages when changing tracks"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:437
-#. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:566 rc.cpp:566
-msgid "Minimize to notification area when closed:"
-msgstr "Minimise to notification area when closed:"
+#. i18n: file: gui/interfacesettings.ui:654
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayCheckBox)
+#: po/rc.cpp:688 rc.cpp:688
+msgid "Show icon in notification area"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:664
+#. i18n: ectx: property (text), widget (QCheckBox, minimiseOnClose)
+#: po/rc.cpp:691 rc.cpp:691
+msgid "Minimize to notification area when closed"
+msgstr "Minimise to notification area when closed"
+
+#. i18n: file: gui/interfacesettings.ui:671
+#. i18n: ectx: property (title), widget (QGroupBox, startupState)
+#: po/rc.cpp:694 rc.cpp:694
+msgid "On Start-up"
+msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:457
-#. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:569 rc.cpp:569
-msgid "Show popup messages when changing tracks:"
+#. i18n: file: gui/interfacesettings.ui:677
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateShow)
+#: po/rc.cpp:697 rc.cpp:697
+msgid "Show main window"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:475
+#. i18n: file: gui/interfacesettings.ui:684
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateHide)
+#: po/rc.cpp:700 rc.cpp:700
+msgid "Hide main window"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:691
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateRestore)
+#: po/rc.cpp:703 rc.cpp:703
+msgid "Restore previous state"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:715
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:572 rc.cpp:572
+#: po/rc.cpp:706 rc.cpp:706
 msgid "General"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:486
-#. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:575 rc.cpp:575
-msgid "Group single track albums:"
+#. i18n: file: gui/interfacesettings.ui:726
+#. i18n: ectx: property (text), widget (QCheckBox, groupSingle)
+#: po/rc.cpp:709 rc.cpp:709
+msgid "Group single track albums"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:503
-#. i18n: ectx: property (text), widget (BuddyLabel, useComposerLabel)
-#: po/rc.cpp:578 rc.cpp:578
-msgid "Group albums by composer:"
+#. i18n: file: gui/interfacesettings.ui:733
+#. i18n: ectx: property (text), widget (QCheckBox, useComposer)
+#: po/rc.cpp:712 rc.cpp:712
+msgid "Group albums by composer"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:520
-#. i18n: ectx: property (text), widget (BuddyLabel, groupMultipleLabel)
-#: po/rc.cpp:581 rc.cpp:581
-msgid "Multiple artist albums:"
+#. i18n: file: gui/interfacesettings.ui:740
+#. i18n: ectx: property (text), widget (QCheckBox, groupMultiple)
+#: po/rc.cpp:715 rc.cpp:715
+msgid "Group multiple artist albums under 'Various Artists'"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:533
-#. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:584 rc.cpp:584
-msgid "Show delete action in context menus:"
+#. i18n: file: gui/interfacesettings.ui:747
+#. i18n: ectx: property (text), widget (QCheckBox, fetchCovers)
+#: po/rc.cpp:718 rc.cpp:718
+msgid "Fetch missing covers from Last.fm"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:550
-#. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:587 rc.cpp:587
-msgid "Enforce single-click activation of items:"
+#. i18n: file: gui/interfacesettings.ui:754
+#. i18n: ectx: property (text), widget (QCheckBox, cacheScaledCovers)
+#: po/rc.cpp:721 rc.cpp:721
+msgid "Cache scaled covers"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:591
+#. i18n: file: gui/interfacesettings.ui:761
+#. i18n: ectx: property (text), widget (QCheckBox, showDeleteAction)
+#: po/rc.cpp:724 rc.cpp:724
+msgid "Show delete action in context menus"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:768
+#. i18n: ectx: property (text), widget (QCheckBox, forceSingleClick)
+#: po/rc.cpp:727 rc.cpp:727
+msgid "Enforce single-click activation of items"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:775
+#. i18n: ectx: property (text), widget (BuddyLabel, langLabel)
+#: po/rc.cpp:730 rc.cpp:730
+msgid "Language:"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:806
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:590 rc.cpp:590
+#: po/rc.cpp:733 rc.cpp:733
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
 msgstr ""
 
-#. i18n: file: gui/mainwindow.ui:287
+#. i18n: file: gui/interfacesettings.ui:835
+#. i18n: ectx: property (text), widget (StateLabel, langNoteLabel)
+#: po/rc.cpp:736 rc.cpp:736
+msgid ""
+"<i><b>NOTE:</b> Changing the language setting will require a re-start of "
+"Cantata.</i>"
+msgstr ""
+
+#. i18n: file: gui/mainwindow.ui:298
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:593 rc.cpp:593
+#: po/rc.cpp:739 rc.cpp:739
 msgid "[Dynamic]"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:20
-#. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:596 rc.cpp:596
-msgid "Output"
+#. i18n: file: gui/playbacksettings.ui:38
+#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
+#: po/rc.cpp:745 rc.cpp:745
+msgid "Fadeout on stop:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:41
-#. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:602 rc.cpp:602
-msgid "Crossfading:"
+#. i18n: file: gui/playbacksettings.ui:48
+#. i18n: ectx: property (suffix), widget (QSpinBox, stopFadeDuration)
+#: po/rc.cpp:748 rc.cpp:748
+msgid " ms"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:51
-#. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:605 rc.cpp:605
-msgid " seconds"
-msgstr ""
+#. i18n: file: gui/playbacksettings.ui:58
+#. i18n: ectx: property (text), widget (QCheckBox, stopOnExit)
+#: po/rc.cpp:754 rc.cpp:754
+msgid "Stop playback on exit"
+msgstr "Stop playback on exit"
 
-#. i18n: file: gui/playbacksettings.ui:61
-#. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:608 rc.cpp:608
-msgid "Replay gain:"
+#. i18n: file: gui/playbacksettings.ui:65
+#. i18n: ectx: property (text), widget (QCheckBox, stopDynamizerOnExit)
+#: po/rc.cpp:757 rc.cpp:757
+msgid "Stop dynamizer on exit"
+msgstr "Stop dynamiser on exit"
+
+#. i18n: file: gui/playbacksettings.ui:72
+#. i18n: ectx: property (text), widget (QCheckBox, inhibitSuspend)
+#: po/rc.cpp:760 rc.cpp:760
+msgid "Inhibit suspend whilst playing"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:95
-#. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:611 rc.cpp:611
-msgid "About replay gain"
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:763 rc.cpp:763
+msgid ""
+"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
+"shown allowing you to choose whether to stop playback now, or after the "
+"current track.</i>"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:104
-#. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:614 rc.cpp:614
-msgid "Devices:"
+#. i18n: file: gui/playbacksettings.ui:108
+#. i18n: ectx: property (title), widget (QGroupBox, outputBox)
+#: po/rc.cpp:766 rc.cpp:766
+msgid "Output"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:141
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:620 rc.cpp:620
-msgid "Fadeout on stop:"
+#. i18n: file: gui/playbacksettings.ui:129
+#. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
+#: po/rc.cpp:772 rc.cpp:772
+msgid "Crossfade between tracks:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:623 rc.cpp:623
-msgid "Stop playback on exit:"
+#. i18n: file: gui/playbacksettings.ui:139
+#. i18n: ectx: property (suffix), widget (QSpinBox, crossfading)
+#: po/rc.cpp:775 rc.cpp:775
+msgid " s"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:626 rc.cpp:626
-msgid "Stop dynamizer on exit:"
-msgstr "Stop dynamiser on exit:"
+#. i18n: file: gui/playbacksettings.ui:152
+#. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
+#: po/rc.cpp:781 rc.cpp:781
+msgid "Replay gain:"
+msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:184
-#. i18n: ectx: property (text), widget (BuddyLabel, inhibitSuspendLabel)
-#: po/rc.cpp:629 rc.cpp:629
-msgid "Inhibit suspend whilst playing:"
+#. i18n: file: gui/playbacksettings.ui:195
+#. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
+#: po/rc.cpp:784 rc.cpp:784
+msgid "About replay gain"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:217
-#. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:632 rc.cpp:632
-msgid ""
-"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
-"shown allowing you to choose whether to stop playback now, or after the "
-"current track.</i>"
+#. i18n: file: gui/playbacksettings.ui:204
+#. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
+#: po/rc.cpp:787 rc.cpp:787
+msgid "Use the checkboxes below to control the active outputs."
 msgstr ""
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:635 rc.cpp:635
+#: po/rc.cpp:790 rc.cpp:790
 msgid "Collection:"
 msgstr ""
 
@@ -4680,25 +5096,25 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
 #. i18n: file: gui/serversettings.ui:338
 #. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
-#: po/rc.cpp:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
+#: po/rc.cpp:808 po/rc.cpp:829 rc.cpp:808 rc.cpp:829
 msgid "Cover filename:"
 msgstr ""
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:656 rc.cpp:656
+#: po/rc.cpp:811 rc.cpp:811
 msgid "Dynamizer port:"
 msgstr "Dynamiser port:"
 
 #. i18n: file: gui/serversettings.ui:168
 #. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
-#: po/rc.cpp:659 rc.cpp:659
+#: po/rc.cpp:814 rc.cpp:814
 msgid "HTTP stream URL:"
 msgstr ""
 
 #. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:662 rc.cpp:662
+#: po/rc.cpp:817 rc.cpp:817
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art "
 "(either the value specified above, or <code>cover.jpg / cover.png</code> if "
@@ -4709,7 +5125,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:277
 #. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
-#: po/rc.cpp:668 rc.cpp:668
+#: po/rc.cpp:823 rc.cpp:823
 msgid ""
 "<i><b>NOTE:</b> 'HTTP Stream URL' is only of use if you have MPD configured "
 "to output to a HTTP stream, and you wish Cantata to be able to play that "
@@ -4718,7 +5134,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:677 rc.cpp:677
+#: po/rc.cpp:832 rc.cpp:832
 msgid ""
 "<i><b>NOTE:</b> If you change the 'Music folder' setting, then you will need "
 "to manually update the music database. This can be performed by pressing the "
@@ -4727,7 +5143,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:379
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel_2)
-#: po/rc.cpp:680 rc.cpp:680
+#: po/rc.cpp:835 rc.cpp:835
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -4735,19 +5151,13 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:683 rc.cpp:683
+#: po/rc.cpp:838 rc.cpp:838
 msgid "Network interface:"
 msgstr ""
 
-#. i18n: file: http/httpserversettings.ui:38
-#. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:686 rc.cpp:686
-msgid "Current URL:"
-msgstr ""
-
-#. i18n: file: http/httpserversettings.ui:73
+#. i18n: file: http/httpserversettings.ui:57
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:689 rc.cpp:689
+#: po/rc.cpp:841 rc.cpp:841
 msgid ""
 "<i><b>NOTE:</b> MPD usually only plays songs that are stored within its "
 "folders. Cantata contains a minimal HTTP server that can be used to serve "
@@ -4759,33 +5169,31 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:693 rc.cpp:693
+#: po/rc.cpp:845 rc.cpp:845
 msgid "Mode:"
 msgstr ""
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:699 rc.cpp:699
+#: po/rc.cpp:851 rc.cpp:851
 msgid "HTTP Proxy"
 msgstr ""
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:702 rc.cpp:702
+#: po/rc.cpp:854 rc.cpp:854
 msgid "SOCKS Proxy"
 msgstr ""
 
 #. i18n: file: online/onlinesettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:717 rc.cpp:717
-msgid ""
-"The following is a list of online providers, to hide a provider simply un-"
-"check its entry in this list."
+#: po/rc.cpp:869 rc.cpp:869
+msgid "Use the checkboxes below to configure the list of active services."
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:723 rc.cpp:723
+#: po/rc.cpp:875 rc.cpp:875
 msgid ""
 "You can listen for free without an account, but Premium members can listen "
 "to higher quality streams without advertisements. Visit <a href=\"http://www."
@@ -4795,38 +5203,38 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:726 rc.cpp:726
+#: po/rc.cpp:878 rc.cpp:878
 msgid "Premium Account"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:735 rc.cpp:735
+#: po/rc.cpp:887 rc.cpp:887
 msgid "Stream type:"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:738 rc.cpp:738
+#: po/rc.cpp:890 rc.cpp:890
 msgid "Status:"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:109
 #. i18n: ectx: property (text), widget (QPushButton, loginButton)
-#: po/rc.cpp:741 streams/digitallyimportedsettings.cpp:130
-#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
+#: po/rc.cpp:893 streams/digitallyimportedsettings.cpp:131
+#: streams/digitallyimportedsettings.cpp:137 rc.cpp:893
 msgid "Login"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:747 rc.cpp:747
+#: po/rc.cpp:899 rc.cpp:899
 msgid "Session expiry:"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:151
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:750 rc.cpp:750
+#: po/rc.cpp:902 rc.cpp:902
 msgid ""
 "<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
 "RockRadio.com, and Sky.fm</i>"
@@ -4834,7 +5242,7 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:161
 #. i18n: ectx: property (text), widget (QLabel, note2Label)
-#: po/rc.cpp:753 rc.cpp:753
+#: po/rc.cpp:905 rc.cpp:905
 msgid ""
 "<i><b>NOTE:</b> If you enter account details, then a 'DI' status item will "
 "appear under the list of streams. This will indicate if you are logged in or "
@@ -4843,27 +5251,25 @@ msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:756 rc.cpp:756
-msgid ""
-"The following is a list of the top-level stream categories, to hide a "
-"category simply un-check its entry in this list."
+#: po/rc.cpp:908 rc.cpp:908
+msgid "Use the checkboxes below to configure the list of active providers."
 msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: po/rc.cpp:759 rc.cpp:759
+#: po/rc.cpp:911 rc.cpp:911
 msgid "Configure Provider"
 msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, installButton)
-#: po/rc.cpp:762 rc.cpp:762
+#: po/rc.cpp:914 rc.cpp:914
 msgid "Install"
 msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:80
 #. i18n: ectx: property (text), widget (QLabel, note)
-#: po/rc.cpp:768 rc.cpp:768
+#: po/rc.cpp:920 rc.cpp:920
 msgid ""
 "<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
 "removed.</i>"
@@ -4871,184 +5277,178 @@ msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:771 rc.cpp:771
+#: po/rc.cpp:923 rc.cpp:923
 msgid "Search:"
 msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:65
 #. i18n: ectx: property (title), widget (QGroupBox, actionBox)
-#: po/rc.cpp:774 rc.cpp:774
+#: po/rc.cpp:926 rc.cpp:926
 msgid "Shortcut for Selected Action"
 msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:71
 #. i18n: ectx: property (text), widget (QRadioButton, useDefault)
-#: po/rc.cpp:777 rc.cpp:777
+#: po/rc.cpp:929 rc.cpp:929
 msgid "Default:"
 msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:85
 #. i18n: ectx: property (text), widget (QRadioButton, useCustom)
-#: po/rc.cpp:783 rc.cpp:783
+#: po/rc.cpp:935 rc.cpp:935
 msgid "Custom:"
 msgstr ""
 
-#. i18n: file: tags/tageditor.ui:25
-#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:786 rc.cpp:786
-msgid "Track:"
-msgstr ""
-
 #. i18n: file: tags/tageditor.ui:64
 #. i18n: ectx: property (text), widget (StateLabel, albumArtistLabel)
-#: po/rc.cpp:795 rc.cpp:795
+#: po/rc.cpp:947 rc.cpp:947
 msgid "Album artist:"
 msgstr ""
 
 #. i18n: file: tags/tageditor.ui:103
 #. i18n: ectx: property (text), widget (StateLabel, trackLabel)
-#: po/rc.cpp:804 rc.cpp:804
+#: po/rc.cpp:956 rc.cpp:956
 msgid "Track number:"
 msgstr ""
 
 #. i18n: file: tags/tageditor.ui:116
 #. i18n: ectx: property (text), widget (StateLabel, discLabel)
-#: po/rc.cpp:807 rc.cpp:807
+#: po/rc.cpp:959 rc.cpp:959
 msgid "Disc number:"
 msgstr ""
 
-#. i18n: file: tags/trackorganiser.ui:155
+#. i18n: file: tags/trackorganiser.ui:115
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:834 rc.cpp:834
+#: po/rc.cpp:989 rc.cpp:989
 msgid "Original Name"
 msgstr ""
 
-#. i18n: file: tags/trackorganiser.ui:160
+#. i18n: file: tags/trackorganiser.ui:120
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:837 rc.cpp:837
+#: po/rc.cpp:992 rc.cpp:992
 msgid "New Name"
 msgstr ""
 
-#: po/rc.cpp:838 rc.cpp:838
+#: po/rc.cpp:996 rc.cpp:996
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr ""
 
-#: po/rc.cpp:839 rc.cpp:839
+#: po/rc.cpp:997 rc.cpp:997
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:121
+#: replaygain/rgdialog.cpp:116
 msgid "Show All Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:122
+#: replaygain/rgdialog.cpp:117
 msgid "Show Untagged Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:124 tags/trackorganiser.cpp:79
 msgid "Remove From List"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:136
+#: replaygain/rgdialog.cpp:131
 msgid "Album Gain"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:137
+#: replaygain/rgdialog.cpp:132
 msgid "Track Gain"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:138
+#: replaygain/rgdialog.cpp:133
 msgid "Album Peak"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:139
+#: replaygain/rgdialog.cpp:134
 msgid "Track Peak"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
+#: replaygain/rgdialog.cpp:154 replaygain/rgdialog.cpp:283
 msgid "Scan"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:238
+#: replaygain/rgdialog.cpp:233
 msgid "Update ReplayGain tags in tracks?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
+#: replaygain/rgdialog.cpp:233 replaygain/rgdialog.cpp:234
 msgid "Update Tags"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:252
+#: replaygain/rgdialog.cpp:247
 msgid "Abort scanning of tracks?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:261
+#: replaygain/rgdialog.cpp:256
 msgid "Abort reading of existing tags?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:287
+#: replaygain/rgdialog.cpp:282
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:289
+#: replaygain/rgdialog.cpp:284
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "Untagged Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "All Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:300
+#: replaygain/rgdialog.cpp:295
 msgid "Scanning tracks..."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:367
+#: replaygain/rgdialog.cpp:362
 msgid "Reading existing tags..."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+#: replaygain/rgdialog.cpp:414 tags/tageditor.cpp:798
 msgctxt "filename (Timeout)"
 msgid "%1 (Timeout)"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:802
 msgctxt "filename (Corrupt tags?)"
 msgid "%1 (Corrupt tags?)"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
+#: replaygain/rgdialog.cpp:432 tags/tageditor.cpp:812
 msgid "Failed to update the tags of the following tracks:"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
-#: tags/trackorganiser.cpp:451
+#: replaygain/rgdialog.cpp:473 tags/tageditor.cpp:885
+#: tags/trackorganiser.cpp:483
 msgid "Device is not connected."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
-#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
+#: replaygain/rgdialog.cpp:513 replaygain/rgdialog.cpp:520
+#: replaygain/rgdialog.cpp:599 replaygain/rgdialog.cpp:601
 msgid "%1 dB"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:520 replaygain/rgdialog.cpp:521
-#: replaygain/rgdialog.cpp:527 replaygain/rgdialog.cpp:528
-#: replaygain/rgdialog.cpp:579 replaygain/rgdialog.cpp:580
-#: replaygain/rgdialog.cpp:581 replaygain/rgdialog.cpp:582
+#: replaygain/rgdialog.cpp:516 replaygain/rgdialog.cpp:517
+#: replaygain/rgdialog.cpp:523 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:575 replaygain/rgdialog.cpp:576
+#: replaygain/rgdialog.cpp:577 replaygain/rgdialog.cpp:578
 msgid "Failed"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
+#: replaygain/rgdialog.cpp:651 tags/trackorganiser.cpp:428
 msgid "Remove the selected tracks from the list?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
+#: replaygain/rgdialog.cpp:652 tags/trackorganiser.cpp:429
 msgid "Remove Tracks"
 msgstr ""
 
@@ -5068,19 +5468,19 @@ msgstr ""
 msgid "AAC 128k"
 msgstr ""
 
-#: streams/digitallyimportedsettings.cpp:109
+#: streams/digitallyimportedsettings.cpp:110
 msgid "Logged out"
 msgstr ""
 
-#: streams/digitallyimportedsettings.cpp:112
+#: streams/digitallyimportedsettings.cpp:113
 msgid "Logging in..."
 msgstr ""
 
-#: streams/digitallyimportedsettings.cpp:136
+#: streams/digitallyimportedsettings.cpp:137
 msgid "Logout"
 msgstr ""
 
-#: streams/streamdialog.cpp:71
+#: streams/streamdialog.cpp:72
 msgid "URL:"
 msgstr ""
 
@@ -5104,7 +5504,7 @@ msgstr ""
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr ""
 
-#: streams/streamfetcher.cpp:205
+#: streams/streamfetcher.cpp:209
 msgid "Fetching %1"
 msgstr ""
 
@@ -5120,89 +5520,89 @@ msgstr "Export Favourite Streams"
 msgid "Add New Stream To Favorites"
 msgstr "Add New Stream To Favourites"
 
-#: streams/streamspage.cpp:124
+#: streams/streamspage.cpp:125
 msgctxt "Service name"
 msgid "Digitally Imported"
 msgstr ""
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:243
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
+#: streams/streamspage.cpp:243 streams/streamspage.cpp:245
 msgid "Import Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:245
+#: streams/streamspage.cpp:246
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr ""
 
-#: streams/streamspage.cpp:253
+#: streams/streamspage.cpp:254
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr ""
 
-#: streams/streamspage.cpp:265
+#: streams/streamspage.cpp:266
 msgid "*.xml|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
+#: streams/streamspage.cpp:266 streams/streamspage.cpp:268
 msgid "Export Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:267
+#: streams/streamspage.cpp:268
 msgid "XML Streams (*.xml)"
 msgstr ""
 
-#: streams/streamspage.cpp:279
+#: streams/streamspage.cpp:280
 msgid "Failed to create <b>%1</b>!"
 msgstr ""
 
-#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
+#: streams/streamspage.cpp:297 streams/streamspage.cpp:493
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr ""
 
-#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
+#: streams/streamspage.cpp:299 streams/streamspage.cpp:495
 msgid "A stream named <b>%1</b> already exists!"
 msgstr ""
 
-#: streams/streamspage.cpp:318
+#: streams/streamspage.cpp:319
 msgid "Bookmark added"
 msgstr ""
 
-#: streams/streamspage.cpp:320
+#: streams/streamspage.cpp:321
 msgid "Already bookmarked"
 msgstr ""
 
-#: streams/streamspage.cpp:366
+#: streams/streamspage.cpp:367
 msgid "Added to favorites"
 msgstr "Added to favourites"
 
-#: streams/streamspage.cpp:368
+#: streams/streamspage.cpp:369
 msgid "Already in favorites"
 msgstr "Already in favourites"
 
-#: streams/streamspage.cpp:393
+#: streams/streamspage.cpp:394
 msgid "Reload <b>%1</b> streams?"
 msgstr ""
 
-#: streams/streamspage.cpp:411
+#: streams/streamspage.cpp:412
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr ""
 
-#: streams/streamspage.cpp:417
+#: streams/streamspage.cpp:418
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr ""
 
-#: streams/streamspage.cpp:445
+#: streams/streamspage.cpp:446
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr ""
 
-#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
+#: streams/streamspage.cpp:450 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr ""
 
-#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+#: streams/streamspage.cpp:561 streams/streamspage.cpp:577
 msgid "Search %1:"
 msgstr ""
 
@@ -5242,139 +5642,90 @@ msgstr ""
 msgid "Failed to remove streams folder!"
 msgstr ""
 
-#: support/dialog.cpp:89
+#: support/dialog.cpp:73
 msgid "&OK"
 msgstr ""
 
-#: support/dialog.cpp:90
+#: support/dialog.cpp:74
 msgid "&Cancel"
 msgstr ""
 
-#: support/dialog.cpp:91
+#: support/dialog.cpp:75
 msgid "&Yes"
 msgstr ""
 
-#: support/dialog.cpp:92
+#: support/dialog.cpp:76
 msgid "&No"
 msgstr ""
 
-#: support/dialog.cpp:93
+#: support/dialog.cpp:77
 msgid "&Discard"
 msgstr ""
 
-#: support/dialog.cpp:94
+#: support/dialog.cpp:78
 msgid "&Save"
 msgstr ""
 
-#: support/dialog.cpp:95
+#: support/dialog.cpp:79
 msgid "&Apply"
 msgstr ""
 
-#: support/dialog.cpp:96
+#: support/dialog.cpp:80
 msgid "&Close"
 msgstr ""
 
-#: support/dialog.cpp:98
+#: support/dialog.cpp:82
 msgid "&Overwrite"
 msgstr ""
 
-#: support/dialog.cpp:99
+#: support/dialog.cpp:83
 msgid "&Reset"
 msgstr ""
 
-#: support/dialog.cpp:100
+#: support/dialog.cpp:84
 msgid "&Continue"
 msgstr ""
 
-#: support/dialog.cpp:101
+#: support/dialog.cpp:85
 msgid "&Delete"
 msgstr ""
 
-#: support/dialog.cpp:102
+#: support/dialog.cpp:86
 msgid "&Stop"
 msgstr ""
 
-#: support/dialog.cpp:103
+#: support/dialog.cpp:87
 msgid "&Remove"
 msgstr ""
 
-#: support/dialog.cpp:104
+#: support/dialog.cpp:88
 msgid "&Previous"
 msgstr ""
 
-#: support/dialog.cpp:105
+#: support/dialog.cpp:89
 msgid "&Next"
 msgstr ""
 
-#: support/fancytabwidget.cpp:957
-msgid "Icons Only"
-msgstr ""
-
-#: support/fancytabwidget.cpp:958
-msgid "Style"
-msgstr ""
-
-#: support/fancytabwidget.cpp:959
-msgid "Large Sidebar"
-msgstr ""
-
-#: support/fancytabwidget.cpp:960
-msgid "Small Sidebar"
-msgstr ""
-
-#: support/fancytabwidget.cpp:961
-msgid "Top Bar"
-msgstr ""
-
-#: support/fancytabwidget.cpp:962
-msgid "Bottom Bar"
-msgstr ""
-
-#: support/fancytabwidget.cpp:963
-msgid "Tabs On Side"
-msgstr ""
-
-#: support/fancytabwidget.cpp:964
-msgid "Tabs On Top"
-msgstr ""
-
-#: support/fancytabwidget.cpp:965
-msgid "Tabs On Bottom"
-msgstr ""
-
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Password"
 msgstr ""
 
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Please enter password:"
 msgstr ""
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:123
+#: support/messagebox.cpp:50 support/messagebox.cpp:124
 msgid "Warning"
 msgstr ""
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:118
+#: support/messagebox.cpp:50 support/messagebox.cpp:119
 msgid "Question"
 msgstr ""
 
-#: support/messagebox.cpp:107 support/messagebox.cpp:113
-#: support/messagebox.h:62
-msgid "Error"
-msgstr ""
-
 #: support/messagebox.h:65
 msgid "Information"
 msgstr ""
 
-#: support/onoffbutton.cpp:47
-msgid "ON"
-msgstr ""
-
-#: support/onoffbutton.cpp:48
-msgid "OFF"
-msgstr ""
-
 #: support/pathrequester.cpp:50
 msgid "Select Folder"
 msgstr ""
@@ -5417,45 +5768,45 @@ msgid_plural "%1 days %2"
 msgstr[0] ""
 msgstr[1] ""
 
-#: tags/tageditor.cpp:134
+#: tags/tageditor.cpp:147
 msgid "Tags"
 msgstr ""
 
-#: tags/tageditor.cpp:147
+#: tags/tageditor.cpp:160
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr ""
 
-#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
+#: tags/tageditor.cpp:261 tags/tageditor.cpp:592
 msgid "All tracks"
 msgstr ""
 
-#: tags/tageditor.cpp:295
+#: tags/tageditor.cpp:323
 msgid "(Various)"
 msgstr ""
 
-#: tags/tageditor.cpp:336
+#: tags/tageditor.cpp:368
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:378
+#: tags/tageditor.cpp:410
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:428
+#: tags/tageditor.cpp:460
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:429
+#: tags/tageditor.cpp:461
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr ""
 
-#: tags/tageditor.cpp:430
+#: tags/tageditor.cpp:462
 msgid "Album Artist from Artist"
 msgstr ""
 
-#: tags/tageditor.cpp:463
+#: tags/tageditor.cpp:495
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5463,89 +5814,93 @@ msgstr ""
 "Capitalise the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
 
-#: tags/tageditor.cpp:496
+#: tags/tageditor.cpp:528
 msgid "Adjust the value of each track number by:"
 msgstr ""
 
-#: tags/tageditor.cpp:554
+#: tags/tageditor.cpp:586
 msgid "All tracks [modified]"
 msgstr ""
 
-#: tags/tageditor.cpp:556
+#: tags/tageditor.cpp:588
 msgid "%1 [modified]"
 msgstr ""
 
-#: tags/tageditor.cpp:783
+#: tags/tageditor.cpp:827
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr ""
 
-#: tags/tageditor.cpp:784
+#: tags/tageditor.cpp:828
 msgid "Rename Files"
 msgstr ""
 
-#: tags/trackorganiser.cpp:150
+#: tags/trackorganiser.cpp:164
 msgid "Abort renaming of files?"
 msgstr ""
 
-#: tags/trackorganiser.cpp:263
+#: tags/trackorganiser.cpp:279
 msgid "Source file does not exist!<br/>%1"
 msgstr ""
 
-#: tags/trackorganiser.cpp:282
+#: tags/trackorganiser.cpp:298
 msgid "Destination file already exists!<br/>%1"
 msgstr ""
 
-#: tags/trackorganiser.cpp:304
+#: tags/trackorganiser.cpp:320
 msgid "Failed to create destination folder!<br/>%1"
 msgstr ""
 
-#: tags/trackorganiser.cpp:325
+#: tags/trackorganiser.cpp:341
 msgid "Failed to rename %1 to %2"
 msgstr ""
 
-#: widgets/coverwidget.cpp:267
+#: widgets/coverwidget.cpp:280
 msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
 msgstr ""
 
-#: widgets/coverwidget.cpp:269
+#: widgets/coverwidget.cpp:282
 msgid ""
 "<tr><td align=\"right\"><b>Artist:</b></td><td>%1</td></tr><tr><td align="
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Year:"
 "</b></td><td>%3</td></tr>"
 msgstr ""
 
-#: widgets/genrecombo.cpp:54
+#: widgets/genrecombo.cpp:44
+msgid "Filter On Genre"
+msgstr ""
+
+#: widgets/genrecombo.cpp:66
 msgid "All Genres"
 msgstr ""
 
-#: widgets/groupedview.cpp:267
+#: widgets/groupedview.cpp:265
 msgctxt "album (albumYear)"
 msgid "%1 (%2)"
 msgstr ""
 
-#: widgets/groupedview.cpp:269
+#: widgets/groupedview.cpp:267
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr ""
 
-#: widgets/itemview.cpp:480
+#: widgets/itemview.cpp:561
 msgid "Go Back"
 msgstr ""
 
-#: widgets/itemview.cpp:485
+#: widgets/itemview.cpp:566
 msgid "Go Home"
 msgstr ""
 
-#: widgets/menubutton.cpp:36
+#: widgets/menubutton.cpp:39
 msgid "Menu"
 msgstr ""
 
-#: widgets/searchwidget.cpp:62
+#: widgets/searchwidget.cpp:63
 msgid "Search..."
 msgstr ""
 
-#: widgets/searchwidget.cpp:66
+#: widgets/searchwidget.cpp:67
 msgid "Close Search Bar"
 msgstr ""
 
@@ -5557,40 +5912,36 @@ msgstr ""
 msgid "<b>NOT</b> logged into %1"
 msgstr ""
 
-#: widgets/songdialog.cpp:48
+#: widgets/songdialog.cpp:49
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
 "\" setting, and MPD's \"music_directory\" setting.</p>"
 msgstr ""
 
-#: widgets/songdialog.cpp:51
+#: widgets/songdialog.cpp:52
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check that the device is still "
 "attached.</p>"
 msgstr ""
 
-#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:115 widgets/volumeslider.cpp:230
+#: widgets/volumeslider.cpp:237
 msgid "Mute"
 msgstr ""
 
-#: widgets/volumeslider.cpp:199
+#: widgets/volumeslider.cpp:198
 msgid "Muted"
 msgstr ""
 
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:237
 msgid "Unmute"
 msgstr ""
 
-#: widgets/volumeslider.cpp:276
-msgid "Volume Disabled"
-msgstr ""
-
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1% (Muted)"
 msgstr ""
 
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1%"
 msgstr ""
 
diff --git a/po/es.po b/po/es.po
index 4e6193f..4bb10e1 100644
--- a/po/es.po
+++ b/po/es.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-14 20:26+0000\n"
+"POT-Creation-Date: 2014-02-02 20:02+0000\n"
 "PO-Revision-Date: 2013-09-22 12:13+0200\n"
 "Last-Translator: Omar Campagne <ocampagne at gmail.com>\n"
 "Language-Team: Debian l10n Spanish <debian-l10n-spanish at lists.debian.org>\n"
@@ -21,14 +21,13 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "Actualizar información de álbum"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:307
-#: gui/cachesettings.cpp:262
+#: context/albumview.cpp:71 gui/cachesettings.cpp:269
 msgid "Album Information"
 msgstr "Información de albúm"
 
-#. i18n: file: devices/albumdetails.ui:143
+#. i18n: file: devices/albumdetails.ui:136
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
+#: context/albumview.cpp:175 po/rc.cpp:107 rc.cpp:107
 msgid "Tracks"
 msgstr "Pistas"
 
@@ -36,22 +35,22 @@ msgstr "Pistas"
 msgid "Refresh Artist Information"
 msgstr "Actualizar información de artista"
 
-#: context/artistview.cpp:92 context/contextwidget.cpp:306
-#: gui/cachesettings.cpp:260
+#: context/artistview.cpp:92 gui/cachesettings.cpp:267
 msgid "Artist Information"
 msgstr "Información de artista"
 
-#. i18n: file: gui/interfacesettings.ui:137
+#. i18n: file: gui/interfacesettings.ui:272
 #. i18n: ectx: attribute (title), widget (QWidget, tab_2)
-#: context/artistview.cpp:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
+#: context/artistview.cpp:314 gui/interfacesettings.cpp:106
+#: gui/mainwindow.cpp:308 po/rc.cpp:588 rc.cpp:588
 msgid "Albums"
 msgstr "Álbumes"
 
-#: context/artistview.cpp:333
+#: context/artistview.cpp:337
 msgid "Web Links"
 msgstr "Enlaces web"
 
-#: context/artistview.cpp:419
+#: context/artistview.cpp:424
 msgid "Similar Artists"
 msgstr "Artistas similares"
 
@@ -59,22 +58,31 @@ msgstr "Artistas similares"
 msgid "Lyrics Providers"
 msgstr "Proveedores de letras"
 
-#: context/contextsettings.cpp:37
+#: context/contextsettings.cpp:37 gui/cachesettings.cpp:278
 msgid "Wikipedia Languages"
 msgstr "Idiomas de Wikipedia"
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
-#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1388
+#: models/streamsmodel.cpp:1434 models/streamsmodel.cpp:1642
 msgid "Other"
 msgstr "Otro"
 
-#: context/contextwidget.cpp:98
+#: context/contextwidget.cpp:293
 msgid "Reset Spacing"
 msgstr "Restablecer espaciado"
 
-#: context/contextwidget.cpp:308 context/songview.cpp:105
-#: gui/cachesettings.cpp:259
-msgid "Lyrics"
+#: context/contextwidget.cpp:506
+#, fuzzy
+msgid "&Artist"
+msgstr "Artista"
+
+#: context/contextwidget.cpp:507
+msgid "Al&bum"
+msgstr ""
+
+#: context/contextwidget.cpp:508
+#, fuzzy
+msgid "&Lyrics"
 msgstr "Letras"
 
 #: context/lastfmengine.cpp:63
@@ -99,37 +107,38 @@ msgstr ""
 "Si está búsqueda ofrece letras nuevas, seguirán asociadas al título de la "
 "canción y artista original que Cantata muestra."
 
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#: context/lyricsdialog.cpp:64 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
-#: rc.cpp:61 rc.cpp:304 rc.cpp:789
+#: context/lyricsdialog.cpp:64 gui/searchpage.cpp:204 po/rc.cpp:92
+#: po/rc.cpp:377 po/rc.cpp:941 rc.cpp:92 rc.cpp:377 rc.cpp:941
 msgid "Title:"
 msgstr "Título:"
 
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#: context/lyricsdialog.cpp:66 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
-#: rc.cpp:55 rc.cpp:292 rc.cpp:792
+#: context/lyricsdialog.cpp:66 devices/actiondialog.cpp:800
+#: gui/searchpage.cpp:197 po/rc.cpp:86 po/rc.cpp:362 po/rc.cpp:944 rc.cpp:86
+#: rc.cpp:362 rc.cpp:944
 msgid "Artist:"
 msgstr "Artista:"
 
@@ -141,95 +150,125 @@ msgstr "Búsqueda de letras"
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "Seleccione los sitios web que utilizar para la búsqueda de letras."
 
-#: context/lyricsettings.cpp:66
-msgid "(Polish Translations)"
-msgstr "(Traducción al polaco)"
+#: context/othersettings.cpp:45 gui/coverdialog.cpp:877
+#: gui/interfacesettings.cpp:174
+msgid "Images (*.png *.jpg)"
+msgstr "Imágenes (*.png *.jpg)"
 
-#: context/lyricsettings.cpp:67
-msgid "(Portuguese Translations)"
-msgstr "(Traducción al portugués)"
+#: context/othersettings.cpp:47 gui/interfacesettings.cpp:176
+msgctxt "pixels"
+msgid "10px"
+msgstr ""
+
+#: context/othersettings.cpp:102 gui/interfacesettings.cpp:524
+#, fuzzy
+msgctxt "value%"
+msgid "%1%"
+msgstr "%1 %2%"
+
+#: context/othersettings.cpp:107 gui/interfacesettings.cpp:529
+#, c-format
+msgctxt "pixels"
+msgid "%1px"
+msgstr ""
 
-#: context/songview.cpp:89
+#: context/songview.cpp:90
 msgid "Refresh Lyrics"
 msgstr "Actualizar letras"
 
-#: context/songview.cpp:90
+#: context/songview.cpp:91
 msgid "Edit Lyrics"
 msgstr "Editar letras"
 
-#: context/songview.cpp:91
+#: context/songview.cpp:92
 msgid "Save Lyrics"
 msgstr "Guardar letras"
 
-#: context/songview.cpp:92
+#: context/songview.cpp:93
 msgid "Cancel Editing Lyrics"
 msgstr "Cancelar edición de letras"
 
-#: context/songview.cpp:93
+#: context/songview.cpp:94
 msgid "Delete Lyrics File"
 msgstr "Eliminar fichero de letras"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:106 gui/cachesettings.cpp:266
+msgid "Lyrics"
+msgstr "Letras"
+
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort editing of lyrics?"
 msgstr "¿Desea cancelar la edición de letras?"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort Editing"
 msgstr "Cancelar edición"
 
-#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
-#: replaygain/rgdialog.cpp:252 replaygain/rgdialog.cpp:253
-#: replaygain/rgdialog.cpp:261 replaygain/rgdialog.cpp:262
-#: tags/trackorganiser.cpp:150
+#: context/songview.cpp:120 context/songview.cpp:139 context/songview.cpp:198
+#: replaygain/rgdialog.cpp:247 replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:256 replaygain/rgdialog.cpp:257
+#: tags/trackorganiser.cpp:164
 msgid "Abort"
 msgstr "Cancelar"
 
-#: context/songview.cpp:121
+#: context/songview.cpp:122
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr "¿Desea eliminar y descargar otra vez la copia de las letras?"
 
-#: context/songview.cpp:121 context/songview.cpp:122
-#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
+#: context/songview.cpp:122 context/songview.cpp:123
+#: online/onlineservicespage.cpp:458 online/onlineservicespage.cpp:459
 msgid "Re-download"
 msgstr "Volver a descargar"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Current playing song has changed, still perform search?"
 msgstr "La canción en reproducción ha cambiado, ¿quiere realizar la búsqueda?"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Song Changed"
 msgstr "Canción modificada"
 
-#: context/songview.cpp:148
+#: context/songview.cpp:149
 msgid "Perform Search"
 msgstr "Realizar búsqueda"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save updated lyrics?"
 msgstr "¿Desea guardar las letras actualizadas?"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save"
 msgstr "Guardar"
 
-#: context/songview.cpp:185
+#: context/songview.cpp:186
 msgid "Failed to save lyrics."
 msgstr "Fallo al guardar las letras"
 
-#: context/songview.cpp:207
+#: context/songview.cpp:208
 msgid "Delete lyrics file?"
 msgstr "¿Desea eliminar el fichero de letras?"
 
-#: context/songview.cpp:207 gui/mainwindow.cpp:292
-#: widgets/messageoverlay.cpp:43
-msgid "Cancel"
-msgstr "Cancelar"
+#: context/songview.cpp:208
+#, fuzzy
+msgid "Delete File"
+msgstr "Seleccione el fichero"
 
-#: context/songview.cpp:431
+#: context/songview.cpp:462
 msgid "Fetching lyrics via %1"
 msgstr "Obteniendo letras mediante %1"
 
+#: context/ultimatelyricsprovider.cpp:200
+msgid "(Polish Translations)"
+msgstr "(Traducción al polaco)"
+
+#: context/ultimatelyricsprovider.cpp:201
+msgid "(Portuguese Translations)"
+msgstr "(Traducción al portugués)"
+
+#: context/view.cpp:91 gui/mainwindow.cpp:328 widgets/messageoverlay.cpp:44
+msgid "Cancel"
+msgstr "Cancelar"
+
 #: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "Lista de pistas"
@@ -252,7 +291,7 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "albúm|pista|banda sonora"
 
-#: context/wikipediasettings.cpp:99
+#: context/wikipediasettings.cpp:114
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
@@ -260,8 +299,8 @@ msgstr ""
 "Seleccione los idiomas de Wikipeda que utilizar para la búsqueda de "
 "información de artista y álbum."
 
-#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
-#: online/podcastsearchdialog.cpp:393
+#: context/wikipediasettings.cpp:115 models/streamsmodel.cpp:598
+#: online/podcastsearchdialog.cpp:404
 msgid "Reload"
 msgstr "Actualizar"
 
@@ -269,37 +308,47 @@ msgstr "Actualizar"
 msgid "Cantata is playing a track"
 msgstr ""
 
-#: devices/actiondialog.cpp:76
+#: devices/actiondialog.cpp:83
 msgid "Songs To Be Copied"
 msgstr "Canciones que copiar"
 
-#: devices/actiondialog.cpp:146
+#: devices/actiondialog.cpp:153
 msgid "<b>INVALID</b>"
 msgstr "<b>NO VÁLIDO</b>"
 
-#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
+#: devices/actiondialog.cpp:167 devices/actiondialog.cpp:170
 msgid "<i>(When different)</i>"
 msgstr "<i>(Cuando hay diferencias)</i>"
 
-#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:185 tags/tageditor.cpp:713
+#: tags/trackorganiser.cpp:444
+msgid ""
+"Cantata has detected that you are connected to a Mopidy server.\n"
+"\n"
+"Currently it is not possible for Cantata to force Mopidy to refresh its "
+"local music listing. Therefore, you will need to stop Cantata, manually "
+"refresh Mopidy's database, and restart Cantata for any changes to be active."
+msgstr ""
+
+#: devices/actiondialog.cpp:211 devices/synccollectionwidget.cpp:274
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "Artistas:%1, Álbumes:%2, Canciones:%3"
 
-#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
-#: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
+#: devices/actiondialog.cpp:271 devices/mtpdevice.cpp:1622
+#: devices/remotefsdevice.cpp:571 devices/umsdevice.cpp:103
 msgid "%1 free"
 msgstr "%1 libre"
 
-#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
+#: devices/actiondialog.cpp:284 devices/actiondialog.cpp:288
 msgid "Local Music Library"
 msgstr "Biblioteca de música local"
 
-#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
+#: devices/actiondialog.cpp:286 devices/albumdetailsdialog.cpp:104
+#: gui/preferencesdialog.cpp:115 widgets/groupedview.cpp:251
 msgid "Audio CD"
 msgstr "CD de audio"
 
-#: devices/actiondialog.cpp:293
+#: devices/actiondialog.cpp:309
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -311,7 +360,7 @@ msgstr ""
 "Las canciones se tendrán que transcodificar a un tamaño de fichero menor "
 "para la copia."
 
-#: devices/actiondialog.cpp:300
+#: devices/actiondialog.cpp:316
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -319,17 +368,17 @@ msgstr ""
 "No hay suficiente espacio en el destino.\n"
 "Las canciones seleccionadas ocupan %1, pero sólo hay %2 libre."
 
-#: devices/actiondialog.cpp:349
+#: devices/actiondialog.cpp:365
 msgid "Copy Songs"
 msgstr "Copiar canciones"
 
-#: devices/actiondialog.cpp:349 devices/devicespage.cpp:503
-#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: devices/actiondialog.cpp:365 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:214 gui/folderpage.cpp:270 gui/librarypage.cpp:257
 #: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "Eliminar canciones"
 
-#: devices/actiondialog.cpp:380
+#: devices/actiondialog.cpp:402
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
@@ -337,15 +386,15 @@ msgstr ""
 "<p>El dispositivo de destino no está configurado.<br/>¿Desea continuar con "
 "las opciones predefinidas?</p>"
 
-#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
+#: devices/actiondialog.cpp:403 devices/actiondialog.cpp:407
 msgid "Not Configured"
 msgstr "Sin configuración"
 
-#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
+#: devices/actiondialog.cpp:404 devices/actiondialog.cpp:408
 msgid "Use Defaults"
 msgstr "Utilizar valores predefinidos"
 
-#: devices/actiondialog.cpp:384
+#: devices/actiondialog.cpp:406
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
@@ -353,225 +402,250 @@ msgstr ""
 "<p>El dispositivo de origen no está configurado.<br/>¿Desea continuar con "
 "las opciones predefinidas?</p>"
 
-#: devices/actiondialog.cpp:446
+#: devices/actiondialog.cpp:468
 msgid "Are you sure you wish to stop?"
 msgstr "¿Está seguro de que desea detener?"
 
-#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
+#: devices/actiondialog.cpp:468 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "Detener"
 
-#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
-#: tags/trackorganiser.cpp:446
+#: devices/actiondialog.cpp:513 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:468 tags/tageditor.cpp:880
+#: tags/trackorganiser.cpp:478
 msgid "Device has been removed!"
 msgstr "El dispositivo se ha extraído."
 
-#: devices/actiondialog.cpp:491
+#: devices/actiondialog.cpp:515
 msgid "Device is not connected!"
 msgstr "El dispositivo no está conectado."
 
-#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
-#: tags/trackorganiser.cpp:456
+#: devices/actiondialog.cpp:517 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:478 tags/tageditor.cpp:890
+#: tags/trackorganiser.cpp:488
 msgid "Device is busy?"
 msgstr "¿Está el dispositivo en uso?"
 
-#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:519 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "¿Ha cambiado el dispositivo?"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:586
 msgid "Clearing unused folders"
 msgstr "Eliminando directorios no utilizados"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "¿Desea calcular la ganancia de reproducción para pistas extraídas?"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "ReplyGain"
 msgstr "Ganancia de reproducción"
 
-#: devices/actiondialog.cpp:578
+#: devices/actiondialog.cpp:602
 msgid "Calculate"
 msgstr "Calcular"
 
-#: devices/actiondialog.cpp:634
-msgid "The destination filename already exists!<hr/>%1"
+#: devices/actiondialog.cpp:661
+#, fuzzy
+msgid "The destination filename already exists!"
 msgstr "El nombre de fichero de destino ya existe.<hr/>%1"
 
-#: devices/actiondialog.cpp:637
-msgid "Song already exists!<hr/>%1"
+#: devices/actiondialog.cpp:664
+#, fuzzy
+msgid "Song already exists!"
 msgstr "La canción ya existe.<hr/>%1"
 
-#: devices/actiondialog.cpp:640
-msgid "Song does not exist!<hr/>%1"
+#: devices/actiondialog.cpp:667
+#, fuzzy
+msgid "Song does not exist!"
 msgstr "La canción no existe.<hr/>%1"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:670
+#, fuzzy
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
-"permissions.<hr/>%1"
+"permissions."
 msgstr ""
 "No se ha podido crear el directorio de destino.<br/>Compruebe que tiene "
 "permisos necesarios.<hr/>%1"
 
-#: devices/actiondialog.cpp:646
-msgid "Source file no longer exists?<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:673
+#, fuzzy
+msgid "Source file no longer exists?"
 msgstr "¿Ha desaparecido el fichero de origen?<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:649
-msgid "Failed to copy.<hr/>%1"
+#: devices/actiondialog.cpp:676
+#, fuzzy
+msgid "Failed to copy."
 msgstr "Fallo al copiar.<hr/>%1"
 
-#: devices/actiondialog.cpp:650
-msgid "Failed to delete.<hr/>%1"
+#: devices/actiondialog.cpp:676
+#, fuzzy
+msgid "Failed to delete."
 msgstr "Fallo al eliminar.<hr/>%1"
 
-#: devices/actiondialog.cpp:653
-msgid "Not connected to device.<hr/>%1"
+#: devices/actiondialog.cpp:679
+#, fuzzy
+msgid "Not connected to device."
 msgstr "El dispositivo no está conectado.<hr/>%1"
 
-#: devices/actiondialog.cpp:656
-msgid "Selected codec is not available.<hr/>%1"
+#: devices/actiondialog.cpp:682
+#, fuzzy
+msgid "Selected codec is not available."
 msgstr "El códec seleccionado no está disponible.<hr/>%1"
 
-#: devices/actiondialog.cpp:659
-msgid "Transcoding failed.<br/><br/<hr/>%1"
-msgstr "Fallo durante la transcodificación.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:685
+#, fuzzy
+msgid "Transcoding failed."
+msgstr "Transcodificación"
 
-#: devices/actiondialog.cpp:662
+#: devices/actiondialog.cpp:688
+#, fuzzy
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
-"devices.)<hr/>%1"
+"devices.)"
 msgstr ""
 "Fallo al crear el fichero temporal.<br/>(Necesario para la transcodificación "
 "a dispositivos MTP.)<hr/>%1"
 
-#: devices/actiondialog.cpp:665
-msgid "Failed to read source file.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:691
+#, fuzzy
+msgid "Failed to read source file."
 msgstr "Fallo de lectura del fichero fuente.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:668
-msgid "Failed to write to destination file.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:694
+#, fuzzy
+msgid "Failed to write to destination file."
 msgstr "Fallo de escritura en el fichero de destino.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:671
-msgid "No space left on device.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:697
+#, fuzzy
+msgid "No space left on device."
 msgstr "No hay espacio libre en el dispositivo.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:674
-msgid "Failed to update metadata.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:700
+#, fuzzy
+msgid "Failed to update metadata."
 msgstr "Fallo de actualización de metadatos.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:677
-msgid "Failed to download track.<br/><br/<hr/>%1"
-msgstr "Fallo de descarga de pista.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:703
+#, fuzzy
+msgid "Failed to download track."
+msgstr "Fallo de descarga"
 
-#: devices/actiondialog.cpp:680
-msgid "Failed to lock device.<hr/>%1"
+#: devices/actiondialog.cpp:706
+#, fuzzy
+msgid "Failed to lock device."
 msgstr "Fallo de bloqueo de dispositivo.<hr/>%1"
 
-#: devices/actiondialog.cpp:709
+#: devices/actiondialog.cpp:735
 msgid "Local Music Library Properties"
 msgstr "Propiedades de la biblioteca de música local"
 
-#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
-msgid "<b>Error</b><br/>"
-msgstr "<b>Error</b><br/>"
+#: devices/actiondialog.cpp:776 devices/actiondialog.cpp:790
+#: support/messagebox.cpp:108 support/messagebox.cpp:114
+#: support/messagebox.h:62
+msgid "Error"
+msgstr "Fallo"
 
-#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:780 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Skip"
 msgstr "Omitir"
 
-#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:781 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Auto Skip"
 msgstr "Omitir automáticamente"
 
-#: devices/actiondialog.cpp:759
+#: devices/actiondialog.cpp:785
 msgid "Retry"
 msgstr "Reintentar"
 
-#: devices/actiondialog.cpp:774
-msgid ""
-"<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
-"td></tr>"
-msgstr ""
-"<tr><td align=\"right\">Artista:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Álbum:</td><td>%2</td></tr><tr><td align=\"right\">Pista:</td><td>%3</"
-"td></tr>"
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#: devices/actiondialog.cpp:801 gui/searchpage.cpp:203 po/rc.cpp:374
+#: po/rc.cpp:953 rc.cpp:374 rc.cpp:953
+msgid "Album:"
+msgstr "Álbum:"
 
-#: devices/actiondialog.cpp:781
-msgid ""
-"<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
-"\"right\">Destination file:</td><td>%2</td></tr>"
+#. i18n: file: tags/tageditor.ui:25
+#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
+#: devices/actiondialog.cpp:802 po/rc.cpp:938 rc.cpp:938
+msgid "Track:"
+msgstr "Pista:"
+
+#: devices/actiondialog.cpp:806
+msgid "Source file:"
 msgstr ""
-"<tr><td align=\"right\">Artista:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Álbum:</td><td>%2</td></tr><tr><td align=\"right\">Pista:</td><td>%3</"
-"td></tr>"
 
-#: devices/actiondialog.cpp:786
-msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
-msgstr "<tr><td align=\"right\">Fichero:</td><td>%1</td></tr>"
+#: devices/actiondialog.cpp:807
+#, fuzzy
+msgid "Destination file:"
+msgstr "Formato destino:"
+
+#: devices/actiondialog.cpp:809 gui/searchpage.cpp:207
+#, fuzzy
+msgid "File:"
+msgstr "&Fichero"
 
-#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
-#: gui/cachesettings.cpp:230
+#: devices/actiondialog.cpp:815 gui/cachesettings.cpp:179
+#: gui/cachesettings.cpp:235
 msgid "Calculating..."
 msgstr "Calculando..."
 
-#: devices/actiondialog.cpp:799
+#: devices/actiondialog.cpp:822
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (Estimación)"
 
-#: devices/actiondialog.cpp:802
-msgid ""
-"<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
-"i></tr>"
+#: devices/actiondialog.cpp:824
+msgid "Time remaining:"
 msgstr ""
-"<tr><i><td align=\"right\"><i>Tiempo restante:</i></td><td><i>%5</i></td></"
-"i></tr>"
 
-#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: devices/actiondialog.cpp:847 devices/fsdevice.cpp:762
 #: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "Guardando almacén"
 
-#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
+#: devices/albumdetailsdialog.cpp:139 devices/albumdetailsdialog.cpp:236
+#: tags/tageditor.cpp:158 tags/tageditor.cpp:373
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "Arreglo para «Varios Artistas»"
 
-#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
+#: devices/albumdetailsdialog.cpp:140 devices/albumdetailsdialog.cpp:260
+#: tags/tageditor.cpp:159 tags/tageditor.cpp:418
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "Deshacer arreglo para «Varios Artistas»"
 
-#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
-#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
+#: devices/albumdetailsdialog.cpp:141 devices/albumdetailsdialog.cpp:278
+#: tags/tageditor.cpp:161 tags/tageditor.cpp:499
 msgid "Capitalize"
 msgstr "Aplicar mayúsculas"
 
-#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
-#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
+#: devices/albumdetailsdialog.cpp:142 devices/albumdetailsdialog.cpp:295
+#: tags/tageditor.cpp:162 tags/tageditor.cpp:528
 msgid "Adjust Track Numbers"
 msgstr "Ajustar números de pista"
 
-#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
+#: devices/albumdetailsdialog.cpp:144 tags/tageditor.cpp:156
 msgid "Tools"
 msgstr "Herramientas"
 
-#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:369
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "¿Desea aplicar el arreglo para «Various Artists»?"
 
-#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
+#: devices/albumdetailsdialog.cpp:234 tags/tageditor.cpp:371
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -579,11 +653,11 @@ msgstr ""
 "<i>Esto define «Artista del álbum» y «Artista» con el valor de «Varios "
 "Artistas», y «Título» con el de «Artista de pista - Título de pista»</i>"
 
-#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:411
 msgid "Revert \"Various Artists\" workaround"
 msgstr "Deshacer arreglo para «Varios Artistas»"
 
-#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
+#: devices/albumdetailsdialog.cpp:255 tags/tageditor.cpp:413
 msgid ""
 "<i>Where the 'Album artist' is the same as 'Artist' and the 'Title' is of "
 "the format \"TrackArtist - TrackTitle\", 'Artist' will be taken from 'Title' "
@@ -597,38 +671,28 @@ msgstr ""
 "<br/><br/>si «Título» es «Wibble - Wobble», entonces «Artista» se define "
 "como «Wibble», y «Título» se define como «Wobble»</i>"
 
-#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
+#: devices/albumdetailsdialog.cpp:261 tags/tageditor.cpp:419
 msgid "Revert"
 msgstr "Revertir"
 
-#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
+#: devices/albumdetailsdialog.cpp:277 tags/tageditor.cpp:497
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr ""
 "Poner en mayúscula la primera letra de «Título», «Artista», «Artista del "
 "álbum», y «Álbum»"
 
-#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
+#: devices/albumdetailsdialog.cpp:295 tags/tageditor.cpp:529
 msgid "Adjust track number by:"
 msgstr "Ajustar números de pista según:"
 
-#: devices/albumdetailsdialog.cpp:335 devices/cddbinterface.cpp:143
-#: devices/deviceoptions.cpp:358 devices/musicbrainz.cpp:202
-#: devices/musicbrainz.cpp:324 gui/mainwindow.cpp:1771 gui/mainwindow.cpp:1784
-#: models/musiclibraryitemroot.cpp:362 models/musiclibraryitemroot.cpp:520
-#: models/playqueuemodel.cpp:325 mpd/mpdparseutils.cpp:249
-#: mpd/mpdparseutils.cpp:409 mpd/song.cpp:228 mpd/song.cpp:233
-#: mpd/song.cpp:272 mpd/song.cpp:299 widgets/groupedview.cpp:260
-msgid "Unknown"
-msgstr "Desconocido"
-
 #: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "Leyendo disco"
 
-#: devices/audiocddevice.cpp:353 gui/mainwindow.cpp:2199
-#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
-#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
+#: devices/audiocddevice.cpp:358 gui/mainwindow.cpp:2345
+#: gui/searchpage.cpp:220 models/albumsmodel.cpp:245 models/musicmodel.cpp:217
+#: models/playlistsmodel.cpp:309 models/playlistsmodel.cpp:324
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "1 pista (%2)"
@@ -651,7 +715,7 @@ msgid "Failed to open CD device"
 msgstr "Fallo al abrir el dispositivo de CD"
 
 #: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
-#: devices/musicbrainz.cpp:217
+#: devices/musicbrainz.cpp:216
 msgid "Track %1"
 msgstr "Pista %1"
 
@@ -673,19 +737,19 @@ msgstr ""
 "Se han encontrado varias coincidencias. Seleccione la coincidencia "
 "pertinente de la lista a continuación:"
 
-#. i18n: file: devices/albumdetails.ui:170
+#. i18n: file: devices/albumdetails.ui:163
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:66
-#: models/playqueuemodel.cpp:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
-#: rc.cpp:82
+#: models/playqueuemodel.cpp:106 po/rc.cpp:113 replaygain/rgdialog.cpp:128
+#: rc.cpp:113
 msgid "Artist"
 msgstr "Artista"
 
-#. i18n: file: devices/albumdetails.ui:175
+#. i18n: file: devices/albumdetails.ui:168
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:76
-#: models/playqueuemodel.cpp:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
-#: rc.cpp:85
+#: models/playqueuemodel.cpp:105 po/rc.cpp:116 replaygain/rgdialog.cpp:130
+#: rc.cpp:116
 msgid "Title"
 msgstr "Título"
 
@@ -762,7 +826,7 @@ msgstr ""
 "extraer el artista real de la etiqueta «Título», y eliminará el nombre de "
 "artista de la etiqueta «Título».</p>"
 
-#: devices/devicepropertieswidget.cpp:99
+#: devices/devicepropertieswidget.cpp:98
 msgid ""
 "<p>If you enable this, then Cantata will create a cache of the device's "
 "music library. This will help to speed up subsequent library scans (as the "
@@ -781,19 +845,19 @@ msgstr ""
 "dispositivos. Esto elimina el fichero de almacén e inicia un nuevo análisis "
 "del contenido del dispositivo.</p>"
 
-#: devices/devicepropertieswidget.cpp:204
+#: devices/devicepropertieswidget.cpp:209
 msgid "Do not transcode"
 msgstr "No transcodificar"
 
-#: devices/devicepropertieswidget.cpp:212
+#: devices/devicepropertieswidget.cpp:216
 msgid "Encoder"
 msgstr "Codificador"
 
-#: devices/devicepropertieswidget.cpp:228
+#: devices/devicepropertieswidget.cpp:231
 msgid "Transcode to %1"
 msgstr "Transcodificar a %1"
 
-#: devices/devicepropertieswidget.cpp:259
+#: devices/devicepropertieswidget.cpp:262
 msgctxt "name (size free)"
 msgid "%1 (%2 free)"
 msgstr "%1 (%2 libre)"
@@ -806,11 +870,11 @@ msgstr "Copiar a biblioteca"
 msgid "Sync"
 msgstr "Sincronizar"
 
-#: devices/devicespage.cpp:71
+#: devices/devicespage.cpp:70
 msgid "Forget Device"
 msgstr "Olvidar dispositivo"
 
-#: devices/devicespage.cpp:114 devices/remotedevicepropertiesdialog.cpp:60
+#: devices/devicespage.cpp:113 devices/remotedevicepropertiesdialog.cpp:60
 msgid "Add Device"
 msgstr "Añadir dispositivo"
 
@@ -819,7 +883,7 @@ msgid "Lookup album and track details?"
 msgstr "¿Desea consultar los detalles de álbum y pista?"
 
 #: devices/devicespage.cpp:433 devices/devicespage.cpp:445
-#: devices/devicespage.cpp:455
+#: devices/devicespage.cpp:455 gui/mainwindow.cpp:589
 msgid "Refresh"
 msgstr "Actualizar"
 
@@ -849,8 +913,8 @@ msgstr "Parcial"
 msgid "Full"
 msgstr "Completa"
 
-#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
-#: gui/librarypage.cpp:257
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:213 gui/folderpage.cpp:269
+#: gui/librarypage.cpp:256
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -878,11 +942,11 @@ msgstr "¿Está seguro de que quiere desconectar <b>%1</b>?"
 msgid "Disconnect"
 msgstr "Desconectar"
 
-#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1220
 msgid "Please close other dialogs first."
 msgstr "Primero cierre otras ventanas de diálogo."
 
-#: devices/encoders.cpp:77
+#: devices/encoders.cpp:78
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -898,7 +962,7 @@ msgstr ""
 "con una tasa de bits similar. Es un elección razonable para los dispositivos "
 "iPod y otros reproductores de música portátiles."
 
-#: devices/encoders.cpp:82
+#: devices/encoders.cpp:83
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>AAC</b> encoder used by Cantata supports a <a "
@@ -931,22 +995,22 @@ msgstr ""
 "insatisfactorio para la música y algo superior a <b>200kb/s</b> es "
 "posiblemente demasiado."
 
-#: devices/encoders.cpp:100 devices/encoders.cpp:140
+#: devices/encoders.cpp:101 devices/encoders.cpp:141
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr ""
 "Tasa de bits media esperada para la codificación con tasa de bits variable"
 
-#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
-#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:293 devices/encoders.cpp:329
 msgid "Smaller file"
 msgstr "Fichero más pequeño"
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:233 devices/encoders.cpp:329
+#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
+#: devices/encoders.cpp:234 devices/encoders.cpp:330
 msgid "Better sound quality"
 msgstr "Mayor calidad de audio"
 
-#: devices/encoders.cpp:119
+#: devices/encoders.cpp:120
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -962,7 +1026,7 @@ msgstr ""
 "el almacenamiento de audio, y generalmente compatible con todos los "
 "reproductores de música portátiles."
 
-#: devices/encoders.cpp:123
+#: devices/encoders.cpp:124
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>MP3</b> encoder used by Cantata supports a <a "
@@ -992,11 +1056,11 @@ msgstr ""
 "insatisfactorio para la música y algo superior a <b>205kb/s</b> es "
 "posiblemente demasiado."
 
-#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
+#: devices/encoders.cpp:156 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:158
+#: devices/encoders.cpp:159
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1011,7 +1075,7 @@ msgstr ""
 "con una calidad similar o superior. Ogg Vorbis es una excelente elección, en "
 "particular con reproductores de música portátiles compatibles."
 
-#: devices/encoders.cpp:163
+#: devices/encoders.cpp:164
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Vorbis</b> encoder used by Cantata supports a "
@@ -1047,15 +1111,15 @@ msgstr ""
 "dispositivo portátil.<br/>Un valor menor a <b>3</b> puede ser "
 "insatisfactorio y un valor superior a <b>8</b> es posiblemente demasiado."
 
-#: devices/encoders.cpp:183
+#: devices/encoders.cpp:184
 msgid "Quality rating"
 msgstr "Clasificación de calidad"
 
-#: devices/encoders.cpp:200
+#: devices/encoders.cpp:201
 msgid "Opus"
 msgstr ""
 
-#: devices/encoders.cpp:203
+#: devices/encoders.cpp:204
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1064,7 +1128,7 @@ msgid ""
 "patent-free digital audio codec using a form of lossy data compression."
 msgstr ""
 
-#: devices/encoders.cpp:205
+#: devices/encoders.cpp:206
 #, fuzzy
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
@@ -1095,15 +1159,15 @@ msgstr ""
 "insatisfactorio para la música y algo superior a <b>205kb/s</b> es "
 "posiblemente demasiado."
 
-#: devices/encoders.cpp:222 devices/encoders.cpp:319
+#: devices/encoders.cpp:223 devices/encoders.cpp:320
 msgid "Bitrate"
 msgstr "Tasa de bits"
 
-#: devices/encoders.cpp:241
+#: devices/encoders.cpp:242
 msgid "Apple Lossless"
 msgstr "Apple Lossless"
 
-#: devices/encoders.cpp:244
+#: devices/encoders.cpp:245
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1118,11 +1182,11 @@ msgstr ""
 "de datos.<br>Solo se recomienda para reproductores de música Apple y "
 "reproductores no compatibles con FLAC."
 
-#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:260 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:262
+#: devices/encoders.cpp:263
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1137,7 +1201,7 @@ msgstr ""
 "compresión de audio digital sin pérdida de datos.<br>Si desea almacenar la "
 "música sin perder calidad de audio, FLAC es una elección excelente."
 
-#: devices/encoders.cpp:266
+#: devices/encoders.cpp:267
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1164,19 +1228,19 @@ msgstr ""
 "sustancialmente el tiempo de compresión pero generan un fichero "
 "superficialmente menor, y no se recomiendan."
 
-#: devices/encoders.cpp:281
+#: devices/encoders.cpp:282
 msgid "Compression level"
 msgstr "Nivel de compresión"
 
-#: devices/encoders.cpp:291
+#: devices/encoders.cpp:292
 msgid "Faster compression"
 msgstr "Compresión más rápida"
 
-#: devices/encoders.cpp:298
+#: devices/encoders.cpp:299
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:301
+#: devices/encoders.cpp:302
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1191,7 +1255,7 @@ msgstr ""
 "compresión de audio sin pérdida de datos.<br>Solo se recomienda para "
 "dispositivos de reproducción de audio no compatibles con Ogg Vorbis."
 
-#: devices/encoders.cpp:305
+#: devices/encoders.cpp:306
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>Due to the limitations of the proprietary <b>WMA</b> "
@@ -1216,163 +1280,107 @@ msgstr ""
 "valor inferior a <b>112kb/s</b> puede ser insatisfactorio, y un valor "
 "superior a <b>182kb/s</b> es posiblemente demasiado."
 
-#: devices/filenameschemedialog.cpp:33
+#: devices/filenameschemedialog.cpp:34
 msgid "Filename Scheme"
 msgstr "Esquema de nombre de fichero"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:62
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "Varios artistas"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:63
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Wibble"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:64
 msgctxt "Example composer"
 msgid "Vivaldi"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:65
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "Now 5001"
 
-#: devices/filenameschemedialog.cpp:56
+#: devices/filenameschemedialog.cpp:66
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "Wobble"
 
-#: devices/filenameschemedialog.cpp:57
+#: devices/filenameschemedialog.cpp:67
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Dance"
 
-#: devices/filenameschemedialog.cpp:101
+#: devices/filenameschemedialog.cpp:121
 msgid ""
 "<p>The following variables will be replaced with their corresponding meaning "
 "for each track name.</p>"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:103
+#: devices/filenameschemedialog.cpp:123
 msgid ""
-"<tr><th><em>Button</em></th><th><em>Variable</em></th><th><em>Description</"
+"<tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</"
 "em></th></tr>"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:104
-msgid ""
-"<tr><td>%albumartist%</td><td>%1</td><td>The artist of the album. For most "
-"albums, this will be the same as the <i>Track Artist.</i> For compilations, "
-"this will often be <i>Various Artists.</i> </td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:106
-msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:107
-msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:108
-msgid "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:109
-msgid ""
-"<tr><td>%title%</td><td>%1</td><td>The track title (without <i>Track Artist</"
-"i>).</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:110
-msgid ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>The track title (with <i>Track "
-"Artist</i>, if different to <i>Album Artist</i>).</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:111
-msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:112
-msgid ""
-"<tr><td>%discnumber%</td><td>%1</td><td>The album number of a multi-album "
-"album. Often compilations consist of several albums.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:113
-msgid ""
-"<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:114
-msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
-msgstr ""
-
-#: devices/fsdevice.cpp:668
+#: devices/fsdevice.cpp:675 gui/albumspage.cpp:287 gui/folderpage.cpp:304
+#: gui/librarypage.cpp:414
 msgid "Updating..."
 msgstr "Actualizando..."
 
-#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: devices/fsdevice.cpp:757 online/onlineservice.cpp:94
 #: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "Leyendo caché"
 
-#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
+#: devices/fsdevice.cpp:769 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
 
-#: devices/mtpdevice.cpp:137
+#: devices/mtpdevice.cpp:153
 msgid "Connecting to device..."
 msgstr "Conectando al dispositivo..."
 
-#: devices/mtpdevice.cpp:139 devices/mtpdevice.cpp:161
+#: devices/mtpdevice.cpp:155 devices/mtpdevice.cpp:202
 msgid "No devices found"
 msgstr "No se han encontrado dispositivos"
 
-#: devices/mtpdevice.cpp:173
+#: devices/mtpdevice.cpp:217
 msgid "Connected to device"
 msgstr "Conectado al dispositivo"
 
-#: devices/mtpdevice.cpp:183
+#: devices/mtpdevice.cpp:230
 msgid "Disconnected from device"
 msgstr "Desconectado del dispositivo"
 
-#: devices/mtpdevice.cpp:250
+#: devices/mtpdevice.cpp:304
 msgid "Updating folders..."
 msgstr "Actualizando directorios..."
 
-#: devices/mtpdevice.cpp:257
+#: devices/mtpdevice.cpp:320
 msgid "Updating files..."
 msgstr "Actualizando ficheros..."
 
-#: devices/mtpdevice.cpp:262 devices/remotefsdevice.cpp:465
-#: devices/remotefsdevice.cpp:485
+#: devices/mtpdevice.cpp:334 devices/remotefsdevice.cpp:461
+#: devices/remotefsdevice.cpp:481
 msgid "Updating tracks..."
 msgstr "Actualizando pistas..."
 
-#: devices/mtpdevice.cpp:281 devices/mtpdevice.cpp:383
-#: models/musiclibraryitemroot.cpp:78 models/musiclibraryitemroot.cpp:117
-#: models/musiclibraryitemroot.cpp:171 models/musiclibraryitemroot.cpp:833
-#: models/musiclibraryitemroot.cpp:1012 mpd/song.cpp:371
-msgid "Various Artists"
-msgstr "Varios artistas"
-
-#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
-#: models/devicesmodel.cpp:140
+#: devices/mtpdevice.cpp:1619 devices/remotefsdevice.cpp:564
+#: devices/umsdevice.cpp:100 gui/initialsettingswizard.cpp:57
+#: models/devicesmodel.cpp:157
 msgid "Not Connected"
 msgstr "Sin conexión"
 
-#: devices/musicbrainz.cpp:320
+#: devices/musicbrainz.cpp:319
 msgid "%1 (Disc %2)"
 msgstr "%1 (Disco %2)"
 
-#: devices/musicbrainz.cpp:408
+#: devices/musicbrainz.cpp:407
 msgid "No matches found in MusicBrainz"
 msgstr "No se han encontrado coincidencias en MusicBrainz"
 
@@ -1380,7 +1388,7 @@ msgstr "No se han encontrado coincidencias en MusicBrainz"
 msgid "Connection"
 msgstr "Conexión"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:261
 msgid "Music Library"
 msgstr "Biblioteca de música"
 
@@ -1408,24 +1416,24 @@ msgstr "Secure Shell (sshfs)"
 msgid "Locally Mounted Folder"
 msgstr "Directorio montado localmente"
 
-#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:612
+#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:608
 msgid "Available"
 msgstr "Disponible"
 
-#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:610
+#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:606
 msgid "Not Available"
 msgstr "No disponible"
 
-#: devices/remotefsdevice.cpp:315
+#: devices/remotefsdevice.cpp:313
 msgid "Failed to resolve connection details for %1"
 msgstr "Fallo al determinar los detalles de conexión para %1"
 
-#: devices/remotefsdevice.cpp:330 devices/remotefsdevice.cpp:345
-#: devices/remotefsdevice.cpp:403
+#: devices/remotefsdevice.cpp:328 devices/remotefsdevice.cpp:343
+#: devices/remotefsdevice.cpp:399
 msgid "Connecting..."
 msgstr "Conectando..."
 
-#: devices/remotefsdevice.cpp:358
+#: devices/remotefsdevice.cpp:356
 msgid ""
 "Password prompting does not work when cantata is started from the "
 "commandline."
@@ -1433,7 +1441,7 @@ msgstr ""
 "La petición de contraseña no funciona cuando cantata se ejecuta desde la "
 "línea de órdenes."
 
-#: devices/remotefsdevice.cpp:379
+#: devices/remotefsdevice.cpp:375
 msgid ""
 "No suitable ssh-askpass application installed! This is required for entering "
 "passwords."
@@ -1441,50 +1449,50 @@ msgstr ""
 "No se ha detectado ninguna aplicación «ssh-askpass» adecuada. Se requiere "
 "para introducir contraseñas."
 
-#: devices/remotefsdevice.cpp:386
+#: devices/remotefsdevice.cpp:382
 msgid "Mount point (\"%1\") is not empty!"
 msgstr "El punto de montaje («%1») no está vacío."
 
-#: devices/remotefsdevice.cpp:398
+#: devices/remotefsdevice.cpp:394
 msgid "\"sshfs\" is not installed!"
 msgstr "sshfs no está instalado."
 
-#: devices/remotefsdevice.cpp:426 devices/remotefsdevice.cpp:446
+#: devices/remotefsdevice.cpp:422 devices/remotefsdevice.cpp:442
 msgid "Disconnecting..."
 msgstr "Desconectando..."
 
-#: devices/remotefsdevice.cpp:440
+#: devices/remotefsdevice.cpp:436
 msgid "\"fusermount\" is not installed!"
 msgstr "fusermount no está instalado."
 
-#: devices/remotefsdevice.cpp:461 devices/remotefsdevice.cpp:482
+#: devices/remotefsdevice.cpp:457 devices/remotefsdevice.cpp:478
 msgid "Failed to connect to \"%1\""
 msgstr "Fallo de conexión con «%1»"
 
-#: devices/remotefsdevice.cpp:462 devices/remotefsdevice.cpp:497
+#: devices/remotefsdevice.cpp:458 devices/remotefsdevice.cpp:493
 msgid "Failed to disconnect from \"%1\""
 msgstr "Fallo de conexión con «%1»"
 
-#: devices/remotefsdevice.cpp:573
+#: devices/remotefsdevice.cpp:569
 msgid "Capacity Unknown"
 msgstr "Capacidad desconocida"
 
-#. i18n: file: gui/coverdialog.ui:30
+#. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (text), widget (QPushButton, search)
-#: devices/synccollectionwidget.cpp:53 gui/stdactions.cpp:92
-#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
+#: devices/synccollectionwidget.cpp:54 gui/mainwindow.cpp:323
+#: online/podcastsearchdialog.cpp:334 po/rc.cpp:404 rc.cpp:404
 msgid "Search"
 msgstr "Buscar"
 
-#: devices/synccollectionwidget.cpp:62
+#: devices/synccollectionwidget.cpp:63
 msgid "Check Items"
 msgstr "Seleccionar elementos"
 
-#: devices/synccollectionwidget.cpp:64
+#: devices/synccollectionwidget.cpp:65
 msgid "Uncheck Items"
 msgstr "Deseleecionar elementos"
 
-#: devices/synccollectionwidget.cpp:266
+#: devices/synccollectionwidget.cpp:272
 msgid "Nothing selected"
 msgstr "Nada seleccionado"
 
@@ -1508,7 +1516,7 @@ msgstr "Sincronizar"
 msgid "Device and library are in sync."
 msgstr "El dispositivo y la biblioteca están sincronizados."
 
-#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:190
+#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:188
 msgid "Not Scanned"
 msgstr "No se ha analizado"
 
@@ -1516,21 +1524,21 @@ msgstr "No se ha analizado"
 msgid " (recommended)"
 msgstr " (recomendado)"
 
-#: dynamic/dynamic.cpp:208
+#: dynamic/dynamic.cpp:215
 msgid "Start Dynamic Playlist"
 msgstr "Iniciar lista de reproducción dinámica"
 
-#: dynamic/dynamic.cpp:209
+#: dynamic/dynamic.cpp:216
 msgid "Stop Dynamic Mode"
 msgstr "Detener modo dinámico"
 
-#: dynamic/dynamic.cpp:257
+#: dynamic/dynamic.cpp:264
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "1 norma"
 msgstr[1] "%1 normas"
 
-#: dynamic/dynamic.cpp:396
+#: dynamic/dynamic.cpp:403
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
@@ -1538,71 +1546,71 @@ msgstr ""
 "Es necesario instalar Perl en su sistema para el funcionamiento del modo "
 "dinámico de Cantata."
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:410
 msgid "Failed to locate rules file - %1"
 msgstr "No se ha podido detectar el fichero de normas - %1"
 
-#: dynamic/dynamic.cpp:411
+#: dynamic/dynamic.cpp:418
 msgid "Failed to remove previous rules file - %1"
 msgstr "No se ha podido eliminar el fichero anterior de normas - %1"
 
-#: dynamic/dynamic.cpp:416
+#: dynamic/dynamic.cpp:423
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "No se ha podido instalar el fichero de normas - %1 -> %2"
 
-#: dynamic/dynamic.cpp:729
+#: dynamic/dynamic.cpp:736
 msgid "Dynamizer has been terminated."
 msgstr "El dinamizador se ha interrumpido."
 
-#: dynamic/dynamic.cpp:816
+#: dynamic/dynamic.cpp:823 mpd/mpdconnection.cpp:150
 msgid "Uknown"
 msgstr "Desconocido"
 
-#: dynamic/dynamic.cpp:818
+#: dynamic/dynamic.cpp:825
 msgid "Loading list of rules"
 msgstr "Cargando lista de normas"
 
-#: dynamic/dynamic.cpp:819
+#: dynamic/dynamic.cpp:826
 msgid "Saving rule"
 msgstr "Guardando norma"
 
-#: dynamic/dynamic.cpp:820
+#: dynamic/dynamic.cpp:827
 msgid "Deleting rule"
 msgstr "Eliminando norma"
 
-#: dynamic/dynamic.cpp:821
+#: dynamic/dynamic.cpp:828
 msgid "Setting active rule"
 msgstr "Definiendo norma activa"
 
-#: dynamic/dynamic.cpp:822
+#: dynamic/dynamic.cpp:829
 msgid "Stopping dynamizer"
 msgstr "Deteniendo dinamizador"
 
-#: dynamic/dynamic.cpp:823
+#: dynamic/dynamic.cpp:830
 msgid "Requesting ID details"
 msgstr "Solicitando detalles de identificación"
 
-#: dynamic/dynamic.cpp:826
+#: dynamic/dynamic.cpp:833
 msgid "Awaiting response for previous command. (%1)"
 msgstr "Esperando la respuesta de la orden anterior. (%1)"
 
-#: dynamic/dynamic.cpp:981
+#: dynamic/dynamic.cpp:988
 msgid "Dynamizer is not active"
 msgstr "El dinamizador no está activo"
 
-#: dynamic/dynamic.cpp:989
+#: dynamic/dynamic.cpp:996
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "Fallo al obtener la lista de normas dinámicas. (%1)"
 
-#: dynamic/dynamic.cpp:1020
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to delete rules file. (%1)"
 msgstr "Fallo al eliminar el fichero de normas. (%1)"
 
-#: dynamic/dynamic.cpp:1027
+#: dynamic/dynamic.cpp:1034
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Fallo de control del estado del dinamizador. (%1)"
 
-#: dynamic/dynamic.cpp:1036
+#: dynamic/dynamic.cpp:1043
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "Fallo al definir la lista de normas dinámicas. (%1)"
 
@@ -1618,11 +1626,11 @@ msgstr "Añadir normas dinámicas"
 msgid "Edit Dynamic Rules"
 msgstr "Editar normas dinámicas"
 
-#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:151
+#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:150
 msgid "Remove Dynamic Rules"
 msgstr "Eliminar normas dinámicas"
 
-#: dynamic/dynamicpage.cpp:150
+#: dynamic/dynamicpage.cpp:149
 msgid ""
 "Are you sure you wish to remove the selected rules?\n"
 "This cannot be undone."
@@ -1636,15 +1644,15 @@ msgstr "Norma dinámica"
 
 #. i18n: file: dynamic/dynamicrules.ui:53
 #. i18n: ectx: property (text), widget (QPushButton, addBtn)
-#: dynamic/dynamicruledialog.cpp:136 po/rc.cpp:280 rc.cpp:280
+#: dynamic/dynamicruledialog.cpp:145 po/rc.cpp:341 rc.cpp:341
 msgid "Add"
 msgstr "Añadir"
 
-#: dynamic/dynamicruledialog.cpp:202
+#: dynamic/dynamicruledialog.cpp:211
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr "<i><b>ERROR</b>: 'Desde el año' debe ser menor que 'Al año'</i>"
 
-#: dynamic/dynamicruledialog.cpp:205
+#: dynamic/dynamicruledialog.cpp:214
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1660,27 +1668,27 @@ msgstr "Artistas similares"
 msgid "AlbumArtist"
 msgstr "Artista del álbum"
 
-#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: file: devices/filenameschemedialog.ui:102
 #. i18n: ectx: property (text), widget (QPushButton, composer)
-#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:212 rc.cpp:212
 msgid "Composer"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:48
+#: models/playqueuemodel.cpp:107 replaygain/rgdialog.cpp:129
 msgid "Album"
 msgstr "Álbum"
 
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:106
-#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:112
+#: po/rc.cpp:254 po/rc.cpp:380 rc.cpp:254 rc.cpp:380
 msgid "Genre"
 msgstr "Género"
 
@@ -1754,33 +1762,35 @@ msgstr "Sobreescribir normas"
 msgid "Saving %1"
 msgstr "Guardando %1"
 
-#: gui/cachesettings.cpp:168
+#: gui/cachesettings.cpp:173
 msgid "Deleting..."
 msgstr "Eliminando…"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Name"
 msgstr "Nombre"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Item Count"
 msgstr "Recuento de elementos"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Space Used"
 msgstr "Espacio utilizado"
 
-#: gui/cachesettings.cpp:234
+#: gui/cachesettings.cpp:239
 msgid "Total space used: %1"
 msgstr ""
 
-#: gui/cachesettings.cpp:245
+#: gui/cachesettings.cpp:250
+#, fuzzy
 msgid ""
-"To speed up loading of the music library, Cantata caches a local copy of the "
-"MPD listing. Cantata might also have cached covers, or lyrics, if these have "
-"been downloaded and could not be saved into the MPD folder (because Cantata "
-"cannot access it, or you have configured Cantata to not save these items "
-"there). Below is a summary of Cantata's cache usage."
+"Cantata caches a local copy of the MPD listing to speed up loading of the "
+"music library. Cantata might also have cached covers, lyrics, or artist "
+"images, if these have been downloaded and could not be saved into the MPD "
+"folder (because Cantata cannot access it, or you have configured Cantata to "
+"not save these items there). Below is a summary of Cantata's current cache "
+"usage."
 msgstr ""
 "Para agilizar la carga de la biblioteca de música, Cantata almacena una "
 "copia local del listado MPD. Puede que Cantata también almacene carátulas o "
@@ -1789,53 +1799,53 @@ msgstr ""
 "que no almacene ahí estos elementos). A continuación tiene un listado del "
 "uso del almacén de Cantata."
 
-#: gui/cachesettings.cpp:257
+#: gui/cachesettings.cpp:263
 msgid "Covers"
 msgstr "Carátulas"
 
-#: gui/cachesettings.cpp:258
+#: gui/cachesettings.cpp:264
+#, fuzzy
+msgid "Scaled Covers"
+msgstr "Carátulas"
+
+#: gui/cachesettings.cpp:265
 msgid "Backdrops"
 msgstr "Fondos"
 
-#: gui/cachesettings.cpp:263 gui/interfacesettings.cpp:167
-#: gui/mainwindow.cpp:283 gui/preferencesdialog.cpp:85
-#: widgets/groupedview.cpp:256
-msgid "Streams"
-msgstr "Flujos"
+#: gui/cachesettings.cpp:271
+#, fuzzy
+msgid "Stream Listings"
+msgstr "Emisión de flujo"
 
-#: gui/cachesettings.cpp:264
+#: gui/cachesettings.cpp:274
 msgid "Jamendo"
 msgstr "Jamendo"
 
-#: gui/cachesettings.cpp:265
+#: gui/cachesettings.cpp:275
 msgid "Magnatune"
 msgstr "Magnatune"
 
-#: gui/cachesettings.cpp:266
+#: gui/cachesettings.cpp:276
 msgid "Podcast Directories"
 msgstr ""
 
-#: gui/cachesettings.cpp:273
+#: gui/cachesettings.cpp:285
 msgid "Delete All"
 msgstr "Eliminar todo"
 
-#: gui/cachesettings.cpp:312
+#: gui/cachesettings.cpp:324
 msgid "Delete all '%1' items?"
 msgstr "¿Desea eliminar los '%1' elementos?"
 
-#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
+#: gui/cachesettings.cpp:325 gui/cachesettings.cpp:335
 msgid "Delete Cache Items"
 msgstr "Eliminar los elementos de la caché"
 
-#: gui/cachesettings.cpp:322
+#: gui/cachesettings.cpp:334
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr "<p>¿Desea eliminar todos los elementos a continuación?<ul>%1</ul></p>"
 
-#: gui/coverdialog.cpp:151 gui/main.cpp:231
-msgid "Last.fm"
-msgstr "Last.fm"
-
-#: gui/coverdialog.cpp:165
+#: gui/coverdialog.cpp:124
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1846,53 +1856,43 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:184
-msgctxt ""
-"Google\n"
-"width x height (file size)"
-msgid ""
-"Google\n"
-"%1 x %2 (%3)"
-msgstr ""
-"Google\n"
-"%1 x %2 (%3)"
-
-#: gui/coverdialog.cpp:204
+#: gui/coverdialog.cpp:126
+#, fuzzy
 msgctxt ""
-"Discogs\n"
+"name\n"
 "width x height"
 msgid ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 msgstr ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:238
-msgctxt ""
-"Current Cover\n"
-"width x height"
-msgid ""
-"Current Cover\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:162
+#, fuzzy
+msgid "Current Cover"
 msgstr ""
 "Carátula actual\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:256
+#: gui/coverdialog.cpp:211 gui/coverdialog.cpp:411
+msgid "CoverArt Archive"
+msgstr ""
+
+#: gui/coverdialog.cpp:242
 msgid "Image"
 msgstr "Imagen"
 
-#: gui/coverdialog.cpp:259
+#: gui/coverdialog.cpp:245
 msgid "Downloading..."
 msgstr "Descargando..."
 
-#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
+#: gui/coverdialog.cpp:290 gui/coverdialog.cpp:325
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "Imagen (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:446
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
@@ -1900,7 +1900,7 @@ msgstr ""
 "<p>Ya existe una imagen para este artista, y el fichero no permite la "
 "escritura.<p></p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:433
+#: gui/coverdialog.cpp:447
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
@@ -1908,13 +1908,17 @@ msgstr ""
 "<p>Ya existe una carátula para este álbum, y el fichero no permite la "
 "escritura.<p></p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:440 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:234
-msgctxt "Album by Artist"
-msgid "%1 by %2"
-msgstr "%1 por %2"
+#: gui/coverdialog.cpp:452
+#, fuzzy
+msgid "'%1' Artist Image"
+msgstr "%1 artistas"
+
+#: gui/coverdialog.cpp:454
+msgctxt "'Artist - Album' Album Cover"
+msgid "'%1 - %2' Album Cover"
+msgstr ""
 
-#: gui/coverdialog.cpp:579
+#: gui/coverdialog.cpp:582
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1922,27 +1926,23 @@ msgstr ""
 "Fallo al definir al carátula.\n"
 "No se pudo descargar a un fichero temporal."
 
-#: gui/coverdialog.cpp:607
+#: gui/coverdialog.cpp:616
 msgid "Failed to download image!"
 msgstr "Fallo al descargar la imagen."
 
-#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
+#: gui/coverdialog.cpp:875 gui/coverdialog.cpp:877
 msgid "Load Local Cover"
 msgstr "Cargar carátula local"
 
-#: gui/coverdialog.cpp:795
-msgid "Images (*.png *.jpg)"
-msgstr "Imágenes (*.png *.jpg)"
-
-#: gui/coverdialog.cpp:800
+#: gui/coverdialog.cpp:882
 msgid "File is already in list!"
 msgstr "El fichero ya está listado."
 
-#: gui/coverdialog.cpp:804
+#: gui/coverdialog.cpp:886
 msgid "Failed to read image!"
 msgstr "Fallo al leer la imagen"
 
-#: gui/coverdialog.cpp:817
+#: gui/coverdialog.cpp:899
 msgid "Display"
 msgstr "Mostrar"
 
@@ -1954,12 +1954,12 @@ msgstr "Mostrar"
 #. i18n: ectx: property (text), widget (QPushButton, removeBtn)
 #. i18n: file: streams/streamssettings.ui:73
 #. i18n: ectx: property (text), widget (QPushButton, removeButton)
-#: gui/coverdialog.cpp:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
-#: rc.cpp:286 rc.cpp:765
+#: gui/coverdialog.cpp:900 gui/stdactions.cpp:90 po/rc.cpp:347 po/rc.cpp:917
+#: rc.cpp:347 rc.cpp:917
 msgid "Remove"
 msgstr "Eliminar"
 
-#: gui/coverdialog.cpp:1181
+#: gui/coverdialog.cpp:1333
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1967,7 +1967,7 @@ msgstr ""
 "Fallo al definir la carátula.\n"
 "No se ha podido realizar una copia."
 
-#: gui/coverdialog.cpp:1190
+#: gui/coverdialog.cpp:1342
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1975,7 +1975,7 @@ msgstr ""
 "Fallo al definir la carátula.\n"
 "No ha podido realizar una copia de seguridad del original."
 
-#: gui/coverdialog.cpp:1239
+#: gui/coverdialog.cpp:1391
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1983,164 +1983,256 @@ msgstr ""
 "Fallo al definir la carátula.\n"
 "No se pudo copiar el fichero a «%1».!"
 
-#: gui/folderpage.cpp:45
+#: gui/coverdialog.cpp:1449 models/onlineservicesmodel.cpp:157
+msgid "Searching..."
+msgstr "Buscando..."
+
+#: gui/folderpage.cpp:44
 msgid "Open In File Manager"
 msgstr "Abrir en el explorador de ficheros"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Established"
 msgstr "Conexión realizada"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Failed"
 msgstr "Fallo de conexión"
 
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
 #. i18n: file: support/shortcutssettingswidget.ui:78
 #. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
-#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
-#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
+#. i18n: file: support/shortcutssettingswidget.ui:78
+#. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
+#: gui/interfacesettings.cpp:48 gui/playbacksettings.cpp:46
+#: online/magnatuneservice.cpp:159 po/rc.cpp:6 po/rc.cpp:660 po/rc.cpp:751
+#: po/rc.cpp:778 po/rc.cpp:932 rc.cpp:6 rc.cpp:660 rc.cpp:751 rc.cpp:778
+#: rc.cpp:932
 msgid "None"
 msgstr "Ninguno"
 
-#: gui/interfacesettings.cpp:40
+#: gui/interfacesettings.cpp:49 gui/interfacesettings.cpp:160
 msgid "Small"
 msgstr "Pequeña"
 
-#: gui/interfacesettings.cpp:41
+#: gui/interfacesettings.cpp:50
 msgid "Medium"
 msgstr "Mediana"
 
-#: gui/interfacesettings.cpp:42
+#: gui/interfacesettings.cpp:51 gui/interfacesettings.cpp:159
 msgid "Large"
 msgstr "Grande"
 
-#: gui/interfacesettings.cpp:43
+#: gui/interfacesettings.cpp:52
 msgid "Extra Large"
 msgstr "Extra grande"
 
-#: gui/interfacesettings.cpp:48
+#: gui/interfacesettings.cpp:57
+msgid "Basic Tree (No Icons)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:58
 msgid "Simple Tree"
 msgstr "Árbol sencillo"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:59
 msgid "Detailed Tree"
 msgstr "Árbol con detalles"
 
-#. i18n: file: gui/interfacesettings.ui:329
+#. i18n: file: gui/interfacesettings.ui:449
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
+#: gui/interfacesettings.cpp:61 po/rc.cpp:639 rc.cpp:639
 msgid "Grouped Albums"
 msgstr "Álbumes agrupados"
 
-#: gui/interfacesettings.cpp:53
+#: gui/interfacesettings.cpp:63
 msgid "List"
 msgstr "Lista"
 
-#: gui/interfacesettings.cpp:55
+#: gui/interfacesettings.cpp:65
 msgid "Icon/List"
 msgstr "Icono/Lista"
 
-#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+#. i18n: file: gui/interfacesettings.ui:454
+#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
+#: gui/interfacesettings.cpp:68 po/rc.cpp:642 rc.cpp:642
+msgid "Table"
+msgstr "Tabla"
+
+#: gui/interfacesettings.cpp:104
+#, fuzzy
+msgid "Play queue"
+msgstr "Reproducir lista de reproducción"
+
+#. i18n: file: gui/interfacesettings.ui:182
+#. i18n: ectx: attribute (title), widget (QWidget, tab)
+#: gui/interfacesettings.cpp:105 gui/mainwindow.cpp:307 po/rc.cpp:569
+#: rc.cpp:569
+msgid "Artists"
+msgstr "Artistas"
+
+#: gui/interfacesettings.cpp:107 gui/interfacesettings.cpp:138
+#: gui/mainwindow.cpp:309
 msgid "Folders"
 msgstr "Directorios"
 
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:337
+#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
+#: gui/interfacesettings.cpp:108 gui/mainwindow.cpp:310 po/rc.cpp:609
+#: rc.cpp:609
+msgid "Playlists"
+msgstr "Listas de reproducción"
+
+#: gui/interfacesettings.cpp:110
+#, fuzzy
+msgid "Dynamic Playlists"
+msgstr "Iniciar lista de reproducción dinámica"
+
+#: gui/interfacesettings.cpp:114
+#, fuzzy
+msgid "Streams (e.g. Radio Stations)"
+msgstr "Emisión de flujo"
+
+#: gui/interfacesettings.cpp:121
+msgid "Online Services - Jamendo, Maganatune, SoundCloud, and Podcasts"
+msgstr ""
+
+#: gui/interfacesettings.cpp:128
+msgid "Devices - UMS, MTP (e.g. Android), and AudioCDs"
+msgstr ""
+
+#: gui/interfacesettings.cpp:134
+msgid "Search (via MPD)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:135
+msgid "Info - Current song information (artist, album, and lyrics)"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#: gui/interfacesettings.cpp:165 gui/interfacesettings.cpp:168
-#: gui/interfacesettings.cpp:171 gui/interfacesettings.cpp:174 po/rc.cpp:472
-#: po/rc.cpp:491 po/rc.cpp:512 po/rc.cpp:536 rc.cpp:472 rc.cpp:491 rc.cpp:512
-#: rc.cpp:536
+#: gui/interfacesettings.cpp:139 po/rc.cpp:554 po/rc.cpp:572 po/rc.cpp:591
+#: po/rc.cpp:612 po/rc.cpp:636 rc.cpp:554 rc.cpp:572 rc.cpp:591 rc.cpp:612
+#: rc.cpp:636
 msgid "Style:"
 msgstr "Estilo:"
 
-#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
-#: gui/preferencesdialog.cpp:89
-msgid "Online"
-msgstr "Conectado"
+#: gui/interfacesettings.cpp:161
+msgid "Tab-bar"
+msgstr ""
 
-#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
-msgid "Devices"
-msgstr "Dispositivos"
+#: gui/interfacesettings.cpp:162
+msgid "Left"
+msgstr ""
 
-#: gui/interfacesettings.cpp:178
-msgid "Grouped by 'Album Artist'"
-msgstr "Agrupado por «Artista del álbum»"
+#: gui/interfacesettings.cpp:162
+msgid "Right"
+msgstr ""
 
-#: gui/interfacesettings.cpp:179
-msgid "Grouped under 'Various Artists'"
-msgstr "Agrupado bajo «Varios artistas»"
+#: gui/interfacesettings.cpp:163
+#, fuzzy
+msgid "Top"
+msgstr "Barra superior"
+
+#: gui/interfacesettings.cpp:164
+#, fuzzy
+msgid "Bottom"
+msgstr "Barra inferior"
+
+#: gui/interfacesettings.cpp:391
+#, fuzzy
+msgid "System default"
+msgstr "Utilizar valores predefinidos"
 
-#: gui/main.cpp:213 gui/mainwindow.cpp:1941 gui/trayitem.cpp:98
-#: gui/trayitem.cpp:100 gui/trayitem.cpp:135 gui/trayitem.cpp:199
-#: gui/trayitem.cpp:209 gui/trayitem.cpp:212 gui/trayitem.cpp:215
-#: gui/trayitem.cpp:228 gui/trayitem.cpp:230
+#: gui/main.cpp:224 gui/mainwindow.cpp:2075 gui/trayitem.cpp:112
+#: gui/trayitem.cpp:118 gui/trayitem.cpp:153 gui/trayitem.cpp:217
+#: gui/trayitem.cpp:227 gui/trayitem.cpp:230 gui/trayitem.cpp:233
+#: gui/trayitem.cpp:246 gui/trayitem.cpp:248
 msgid "Cantata"
 msgstr "Cantata"
 
-#: gui/main.cpp:214
+#: gui/main.cpp:225
 msgid "A KDE client for MPD"
 msgstr "Un cliente de MPD para KDE"
 
-#: gui/main.cpp:216
-#, fuzzy
-msgid "Copyright (c) 2011–2013 Craig Drummond"
-msgstr "Derechos de autor (c) 2011-2013 Craig Drummond"
+#: gui/main.cpp:227
+msgid "© 2011-2014 Craig Drummond"
+msgstr ""
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Maintainer"
 msgstr "Desarrollador"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "UI Improvements"
 msgstr "Mejora de la interfaz"
 
-#: gui/main.cpp:222
+#: gui/main.cpp:233
 msgid "Sander Knopper"
 msgstr "Sander Knopper"
 
-#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
+#: gui/main.cpp:233 gui/main.cpp:234 gui/main.cpp:235 gui/main.cpp:236
 msgid "QtMPC author"
 msgstr "Autor de QtMPC"
 
-#: gui/main.cpp:223
+#: gui/main.cpp:234
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:224
+#: gui/main.cpp:235
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:225
+#: gui/main.cpp:236
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
@@ -2148,103 +2240,107 @@ msgstr ""
 "Fondos de vista contextual (considere enviar su fan-art de música a fanart."
 "tv)"
 
-#: gui/main.cpp:230
+#: gui/main.cpp:238
 msgid "Wikipedia"
 msgstr "Wikipedia"
 
-#: gui/main.cpp:230 gui/main.cpp:231
+#: gui/main.cpp:238 gui/main.cpp:239
 msgid "Context view metadata"
 msgstr "Metadatos de vista contextual"
 
-#: gui/main.cpp:235
+#: gui/main.cpp:239
+msgid "Last.fm"
+msgstr "Last.fm"
+
+#: gui/main.cpp:243
 msgid "URL to open"
 msgstr "URL a abrir"
 
-#: gui/mainwindow.cpp:238
+#: gui/mainwindow.cpp:269
 msgid "Quit"
 msgstr "Cerrar"
 
-#: gui/mainwindow.cpp:242
+#: gui/mainwindow.cpp:273
 msgid "Show Window"
 msgstr "Mostrar ventana"
 
 #. i18n: file: gui/initialsettingswizard.ui:469
 #. i18n: ectx: property (text), widget (QPushButton, connectButton)
-#: gui/mainwindow.cpp:245 po/rc.cpp:418 rc.cpp:418
+#: gui/mainwindow.cpp:276 po/rc.cpp:482 rc.cpp:482
 msgid "Connect"
 msgstr "Conectar"
 
-#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
+#: gui/mainwindow.cpp:277 gui/preferencesdialog.cpp:83
 msgid "Collection"
 msgstr "Colección"
 
-#: gui/mainwindow.cpp:247
+#: gui/mainwindow.cpp:278
 msgid "Outputs"
 msgstr "Salidas"
 
-#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
+#: gui/mainwindow.cpp:279 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "Detener después de la pista"
 
-#: gui/mainwindow.cpp:249
+#: gui/mainwindow.cpp:280
 msgid "Add To Stored Playlist"
 msgstr "Añadir a lista de reproducción guardada"
 
-#: gui/mainwindow.cpp:250
+#: gui/mainwindow.cpp:281
 msgid "Remove From Play Queue"
 msgstr "Eliminar de la cola de reproducción"
 
-#: gui/mainwindow.cpp:251
+#: gui/mainwindow.cpp:282
 msgid "Copy Track Info"
 msgstr "Copiar información de pista"
 
-#: gui/mainwindow.cpp:252
+#: gui/mainwindow.cpp:283
 msgid "Crop"
 msgstr "Recortar"
 
-#: gui/mainwindow.cpp:253
+#: gui/mainwindow.cpp:284
 #, fuzzy
 msgid "Shuffle Tracks"
 msgstr "Pistas únicas"
 
-#: gui/mainwindow.cpp:254
+#: gui/mainwindow.cpp:285
 #, fuzzy
 msgid "Shuffle Albums"
 msgstr "Modificar orden"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:286
 msgid "Add Stream URL"
 msgstr "Añadir URL de flujo"
 
-#: gui/mainwindow.cpp:256
+#: gui/mainwindow.cpp:287
 msgid "Clear"
 msgstr "Vaciar"
 
-#: gui/mainwindow.cpp:257
+#: gui/mainwindow.cpp:288
 msgid "Expanded Interface"
 msgstr "Interfaz expandida"
 
-#: gui/mainwindow.cpp:258
+#: gui/mainwindow.cpp:289
 msgid "Show Current Song Information"
 msgstr "Mostrar información de la canción actual"
 
-#: gui/mainwindow.cpp:261
+#: gui/mainwindow.cpp:292
 msgid "Full Screen"
 msgstr "Pantalla completa"
 
-#: gui/mainwindow.cpp:263
+#: gui/mainwindow.cpp:294
 msgid "Random"
 msgstr "Aleatorio"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:295
 msgid "Repeat"
 msgstr "Repetir"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid "Single"
 msgstr "Pistas únicas"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
@@ -2252,11 +2348,11 @@ msgstr ""
 "Cuando se activa «Pistas únicas», la reproducción se detiene tras la canción "
 "actual, o se repite si se activa el modo de repetición."
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid "Consume"
 msgstr "Eliminar tras reproducir"
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
@@ -2264,144 +2360,147 @@ msgstr ""
 "Cuando se activa esta opción, se elimina la canción de la cola de "
 "reproducción tras su reproducción"
 
-#: gui/mainwindow.cpp:267
-msgid "Search Play Queue"
-msgstr "Buscar en lista de reproducción"
-
-#: gui/mainwindow.cpp:269
+#: gui/mainwindow.cpp:298
 msgid "Set Priority"
 msgstr "Definir prioridad"
 
-#: gui/mainwindow.cpp:271
+#: gui/mainwindow.cpp:300
 msgid "Play Stream"
 msgstr "Reproducir flujo"
 
-#: gui/mainwindow.cpp:273
+#: gui/mainwindow.cpp:302
 msgid "Locate In Library"
 msgstr "Ubicar en biblioteca"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:304
 msgid "Edit Song Tags"
 msgstr "Editar etiquetas de canciones"
 
-#. i18n: file: gui/interfacesettings.ui:304
+#. i18n: file: gui/interfacesettings.ui:429
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
+#: gui/mainwindow.cpp:306 po/rc.cpp:633 rc.cpp:633
 msgid "Play Queue"
 msgstr "Reproducir lista de reproducción"
 
-#. i18n: file: gui/interfacesettings.ui:27
-#. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
-msgid "Artists"
-msgstr "Artistas"
-
-#. i18n: file: gui/interfacesettings.ui:202
-#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
-#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
-msgid "Playlists"
-msgstr "Listas de reproducción"
-
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:312
 msgid "Dynamic"
 msgstr "Dinámico"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:315 gui/preferencesdialog.cpp:89
+#: widgets/groupedview.cpp:251
+msgid "Streams"
+msgstr "Flujos"
+
+#: gui/mainwindow.cpp:318 gui/preferencesdialog.cpp:94
+msgid "Online"
+msgstr "Conectado"
+
+#: gui/mainwindow.cpp:321
+msgid "Devices"
+msgstr "Dispositivos"
+
+#: gui/mainwindow.cpp:324
 msgid "Expand All"
 msgstr "Expandir todo"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:325
 msgid "Collapse All"
 msgstr "Contraer todo"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:326
 #, fuzzy
 msgid "Remove All Songs"
 msgstr "Eliminar listas de reproducción"
 
-#: gui/mainwindow.cpp:398
+#: gui/mainwindow.cpp:456
 msgid "Info"
 msgstr "Información"
 
-#: gui/mainwindow.cpp:405
-msgid "Auto Hide"
-msgstr "Ocultar automáticamente"
-
-#: gui/mainwindow.cpp:411
-msgid "Monochrome Icons"
-msgstr "Iconos monocromos"
-
-#: gui/mainwindow.cpp:541
+#: gui/mainwindow.cpp:585
 msgid "Server information..."
 msgstr "Información del servidor..."
 
-#: gui/mainwindow.cpp:552
+#: gui/mainwindow.cpp:588
+msgid "Refresh Database"
+msgstr "Actualizar base de datos"
+
+#: gui/mainwindow.cpp:602
 msgid "Configure Cantata..."
 msgstr "Configurar Cantata..."
 
-#: gui/mainwindow.cpp:559
+#: gui/mainwindow.cpp:612
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "Acerca de Cantata..."
 
-#: gui/mainwindow.cpp:571
+#: gui/mainwindow.cpp:624
 msgid "&File"
 msgstr "&Fichero"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:628
+#, fuzzy
+msgid "&Edit"
+msgstr "Editar"
+
+#: gui/mainwindow.cpp:631
 msgid "&Settings"
 msgstr "&Ajustes"
 
-#: gui/mainwindow.cpp:589 support/dialog.cpp:97
+#: gui/mainwindow.cpp:646 support/dialog.cpp:81
 msgid "&Help"
 msgstr "A&yuda"
 
-#: gui/mainwindow.cpp:948
+#: gui/mainwindow.cpp:1035
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
 "No se ha detectado ninguna canción que coincida con las normas de lista "
 "dinámica de reproducción."
 
-#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
+#: gui/mainwindow.cpp:1157 mpd/mpdconnection.cpp:401
 msgid "Connecting to %1"
 msgstr "Conectando a %1"
 
-#: gui/mainwindow.cpp:1151
+#: gui/mainwindow.cpp:1189
+#, fuzzy
+msgid "Refresh MPD Database?"
+msgstr "Actualizar base de datos"
+
+#: gui/mainwindow.cpp:1257
 msgid ""
 "Podcasts are currently being downloaded\n"
 "\n"
 "Quiting now will abort all downloads."
 msgstr ""
 
-#: gui/mainwindow.cpp:1152
+#: gui/mainwindow.cpp:1258
 msgid "Abort downloads and quit"
 msgstr ""
 
-#: gui/mainwindow.cpp:1447
+#: gui/mainwindow.cpp:1577
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "Acerca de Cantata"
 
-#: gui/mainwindow.cpp:1448
+#: gui/mainwindow.cpp:1578
 msgctxt "Qt-only"
 msgid ""
-"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html"
-"\">GPLv3</a>"
-msgstr ""
-"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Publicado bajo la licencia <a href=\"http://www.gnu.org/licenses/gpl."
+"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl."
 "html\">GPLv3</a>"
+msgstr ""
+"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Publicado bajo la licencia <a href=\"http://www.gnu.org/"
+"licenses/gpl.html\">GPLv3</a>"
 
-#: gui/mainwindow.cpp:1450
+#: gui/mainwindow.cpp:1580
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
-"QtMPC Authors<br/>"
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"The QtMPC Authors<br/>"
 msgstr ""
-"Basado en <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 Los "
-"autores de QtMPC<br/>"
+"Basado en <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"Los autores de QtMPC<br/>"
 
-#: gui/mainwindow.cpp:1451
+#: gui/mainwindow.cpp:1581
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
@@ -2410,7 +2509,7 @@ msgstr ""
 "Fondos de vista contextual gracias a <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 
-#: gui/mainwindow.cpp:1452
+#: gui/mainwindow.cpp:1582
 msgctxt "Qt-only"
 msgid ""
 "Context view metadata courtesy of <a href=\"http://www.wikipedia.org"
@@ -2419,7 +2518,7 @@ msgstr ""
 "Metadatos de vista contextual gracias a <a href=\"http://www.wikipedia.org"
 "\">Wikipedia</a> y <a href=\"http://www.last.fm\">Last.fm</a>"
 
-#: gui/mainwindow.cpp:1453
+#: gui/mainwindow.cpp:1583
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
@@ -2427,25 +2526,29 @@ msgstr ""
 "Considere enviar su propio fan-art de música a <a href=\"http://www.fanart.tv"
 "\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1594
+#, fuzzy
 msgid ""
-"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Uptime:</td><td>%4</td></"
-"tr><tr><td align=\"right\">Time playing:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right"
+"\">Protocol version: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Uptime: </td><td>%4</td></tr><tr><td align=\"right"
+"\">Time playing: </td><td>%5</td></tr>"
 msgstr ""
 "<tr><td colspan=\"2\"><b>Servidor</b></td></tr><tr><td align=\"right"
 "\">Versión:</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Tiempo de "
 "ejecución:</td><td>%4</td></tr><tr><td align=\"right\">Tiempo de "
 "reproducción:</td><td>%5</td></tr>"
 
-#: gui/mainwindow.cpp:1472
+#: gui/mainwindow.cpp:1602
+#, fuzzy
 msgid ""
 "<tr><td colspan=\"2\"><b>Database</b></td></tr><tr><td align=\"right"
-"\">Artists:</td><td>%1</td></tr><tr><td align=\"right\">Albums:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Songs:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL handlers:</td><td>%4</td></tr><tr><td align=\"right\">Total "
-"duration:</td><td>%5</td></tr><tr><td align=\"right\">Last update:</td><td>"
-"%6</td></tr></table></p>"
+"\">Artists: </td><td>%1</td></tr><tr><td align=\"right\">Albums: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Songs: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Total duration: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Last update: </td><td>%6</td></tr></"
+"table></p>"
 msgstr ""
 "<tr><td colspan=\"2\"><b>Base de datos</b></td></tr><tr><td align=\"right"
 "\">Artistas:</td><td>%1</td></tr><tr><td align=\"right\">Álbumes:</td><td>"
@@ -2454,103 +2557,112 @@ msgstr ""
 "\"right\">Duración total:</td><td>%5</td></tr><tr><td align=\"right\">Last "
 "update:</td><td>%6</td></tr></table></p>"
 
-#: gui/mainwindow.cpp:1481
+#: gui/mainwindow.cpp:1611
 msgid "Server Information"
 msgstr "Información del servidor"
 
-#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
+#: gui/mainwindow.cpp:1859 gui/mainwindow.cpp:1866
 msgid "Cantata (%1)"
 msgstr "Cantata (%1)"
 
-#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
+#: gui/mainwindow.cpp:1862 gui/mainwindow.cpp:1869
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: Cantata (%2)"
 
-#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
+#: gui/mainwindow.cpp:1863 gui/mainwindow.cpp:1870
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: Cantata"
 
-#: gui/mainwindow.cpp:1728
+#: gui/mainwindow.cpp:1874
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: Cantata (%3)"
 
-#: gui/mainwindow.cpp:1730
+#: gui/mainwindow.cpp:1876
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: Cantata"
 
-#: gui/mainwindow.cpp:1773
+#: gui/mainwindow.cpp:1919
 msgid "(Stream)"
 msgstr "(Flujo)"
 
-#: gui/mainwindow.cpp:1775
+#: gui/mainwindow.cpp:1921
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
+#: gui/mainwindow.cpp:1939 widgets/groupedview.cpp:278
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1843
+#: gui/mainwindow.cpp:1989 mpd/mpdconnection.cpp:543 mpd/mpdconnection.cpp:550
 msgid "MPD reported the following error: %1"
 msgstr ""
 
-#: gui/mainwindow.cpp:1990
+#: gui/mainwindow.cpp:2119
 #, fuzzy
 msgid "Remove all songs from play queue?"
 msgstr "Eliminar de la cola de reproducción"
 
-#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
+#: gui/mainwindow.cpp:2210 models/playqueuemodel.cpp:113
 msgid "Priority"
 msgstr "Prioridad"
 
-#: gui/mainwindow.cpp:2080
+#: gui/mainwindow.cpp:2210
 msgid "Enter priority (0..255):"
 msgstr "Introduzca la prioridad (0...255):"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Playlist Name"
 msgstr "Nombre de lista de reproducción"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Enter a name for the playlist:"
 msgstr "Introduzca un nombre para la lista de reproducción:"
 
-#: gui/mainwindow.cpp:2106
+#: gui/mainwindow.cpp:2236
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr ""
 "Se ha detectado una lista de reproducción llamada <b>%1</b>.<br/> ¿Añadir a "
 "esa lista de reproducción?"
 
-#: gui/mainwindow.cpp:2107
+#: gui/mainwindow.cpp:2237
 msgid "Existing Playlist"
 msgstr "Lista de reproducción existente"
 
-#: gui/playbacksettings.cpp:42
-msgid "Do not fadeout"
-msgstr "Sin disminución progresiva de volumen"
+#: gui/mainwindow.cpp:2303
+#, fuzzy
+msgid "Stream URL"
+msgstr "Añadir URL de flujo"
 
-#: gui/playbacksettings.cpp:43
-msgid " ms"
-msgstr " ms"
+#: gui/mainwindow.cpp:2303
+msgid "Enter URL of stream:"
+msgstr ""
+
+#: gui/mainwindow.cpp:2306
+msgid "Invalid, or unsupported, URL!"
+msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:165
+#: gui/mainwindow.cpp:2889
+msgid "Can only edit tags of songs within MPD's music collection."
+msgstr ""
+
+#. i18n: file: devices/albumdetails.ui:158
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
-#: gui/playbacksettings.cpp:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
-#: rc.cpp:79
+#: gui/playbacksettings.cpp:47 models/playqueuemodel.cpp:108 po/rc.cpp:110
+#: rc.cpp:110
 msgid "Track"
 msgstr "Pista"
 
-#: gui/playbacksettings.cpp:51
+#: gui/playbacksettings.cpp:49
 msgid "Auto"
 msgstr "Automático"
 
-#: gui/playbacksettings.cpp:164
+#: gui/playbacksettings.cpp:161
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
@@ -2558,9 +2670,9 @@ msgstr ""
 "<i>Conectando a %1.</b>Las entradas a continuación afectan a la colección de "
 "MPD conectada actualmente.</i>"
 
-#. i18n: file: gui/playbacksettings.ui:26
+#. i18n: file: gui/playbacksettings.ui:114
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
+#: gui/playbacksettings.cpp:164 po/rc.cpp:769 rc.cpp:769
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
@@ -2568,7 +2680,7 @@ msgstr ""
 "<i>No conectado.</b>Las entradas a continuación no se pueden modificar, ya "
 "que Cantata no está conectado a MPD.</i>"
 
-#: gui/playbacksettings.cpp:174
+#: gui/playbacksettings.cpp:171
 msgid ""
 "<p>Replay Gain is a proposed standard published in 2001 to normalize the "
 "perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It "
@@ -2592,11 +2704,20 @@ msgstr ""
 "si se selecciona reproducción aleatoria; de no ser así, se utilizarán las "
 "etiquetas del álbum.</li></ul></p>"
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:95 widgets/playqueueview.cpp:160
+msgid "Stretch Columns To Fit Window"
+msgstr ""
+
+#: gui/playlistspage.cpp:146 tags/tageditor.cpp:828 tags/trackorganiser.cpp:72
 msgid "Rename"
 msgstr "Renombrar"
 
-#: gui/playlistspage.cpp:190
+#: gui/playlistspage.cpp:147 models/playqueuemodel.cpp:156
+#, fuzzy
+msgid "Remove Duplicates"
+msgstr "Eliminar listas de reproducción"
+
+#: gui/playlistspage.cpp:309
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2604,119 +2725,179 @@ msgstr ""
 "¿Desea eliminar las listas de reproducción seleccionadas?\n"
 "No se puede deshacer esta acción."
 
-#: gui/playlistspage.cpp:191
+#: gui/playlistspage.cpp:310
 msgid "Remove Playlists"
 msgstr "Eliminar listas de reproducción"
 
-#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
+#: gui/playlistspage.cpp:330 gui/playlistspage.cpp:357
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr ""
 "Se ha detectado una lista de reproducción llamada <b>%1</b><br/>. "
 "¿Sobrescribir?"
 
-#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
+#: gui/playlistspage.cpp:331 gui/playlistspage.cpp:358
 msgid "Overwrite Playlist"
 msgstr "Sobrescribir la lista de reproducción"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Rename Playlist"
 msgstr "Renombrar lista de reproducción"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Enter new name for playlist:"
 msgstr "Introduzca un nombre nuevo para la lista de reproducción:"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/playlistspage.cpp:446
+msgid "Cannot add songs from '%1' to '%2'"
+msgstr ""
+
+#: gui/preferencesdialog.cpp:83
 msgid "Collection Settings"
 msgstr "Ajustes de collección"
 
-#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: file: gui/playbacksettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
+#: gui/preferencesdialog.cpp:84 po/rc.cpp:742 rc.cpp:742
 msgid "Playback"
 msgstr "Reproducción"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:84
 msgid "Playback Settings"
 msgstr "Opciones de reproducción"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "Files"
 msgstr "Ficheros"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "File Settings"
 msgstr "Configuración de fichero"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface"
 msgstr "Interfaz"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface Settings"
 msgstr "Configuración de la interfaz"
 
-#: gui/preferencesdialog.cpp:85
+#: gui/preferencesdialog.cpp:89
 #, fuzzy
 msgid "Streams Settings"
 msgstr "Emisión de flujo"
 
-#: gui/preferencesdialog.cpp:89
+#: gui/preferencesdialog.cpp:94
 #, fuzzy
 msgid "Online Providers"
 msgstr "Proveedores de letras"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context"
 msgstr "Contexto"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context View Settings"
 msgstr "Configuración de visualización de contexto"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server"
 msgstr "Servidor HTTP"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server Settings"
 msgstr "Configuración del servidor HTTP"
 
-#: gui/preferencesdialog.cpp:103
+#: gui/preferencesdialog.cpp:115
 msgid "Audio CD Settings"
 msgstr "Configuración de CD de audio"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgid "Proxy"
 msgstr "Proxy"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "Ajustes de proxy"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "Atajos de teclado"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "Configuración de atajos de teclado"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cache"
 msgstr "Almacén"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cached Items"
 msgstr "Elementos almacenados"
 
-#: gui/preferencesdialog.cpp:116
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#: gui/preferencesdialog.cpp:128 po/rc.cpp:53 po/rc.cpp:65 po/rc.cpp:410
+#: rc.cpp:53 rc.cpp:65 rc.cpp:410
 msgid "Configure"
 msgstr "Configuración"
 
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#: gui/searchpage.cpp:200 po/rc.cpp:89 po/rc.cpp:371 po/rc.cpp:950 rc.cpp:89
+#: rc.cpp:371 rc.cpp:950
+msgid "Composer:"
+msgstr ""
+
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#: gui/searchpage.cpp:205 po/rc.cpp:95 po/rc.cpp:962 rc.cpp:95 rc.cpp:962
+msgid "Genre:"
+msgstr "Género:"
+
+#: gui/searchpage.cpp:206
+#, fuzzy
+msgid "Date:"
+msgstr "Fecha"
+
+#: gui/searchpage.cpp:208
+msgid "Any:"
+msgstr ""
+
+#: gui/searchpage.cpp:215
+#, fuzzy
+msgid "No tracks found."
+msgstr "No se han encontrado dispositivos"
+
 #: gui/serversettings.cpp:87
 msgid ""
 "<i> This folder will also be used to locate music files for transferring to "
@@ -2741,8 +2922,8 @@ msgstr "No está en uso"
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
-#: gui/serversettings.cpp:103 po/rc.cpp:208 po/rc.cpp:247 po/rc.cpp:705
-#: rc.cpp:208 rc.cpp:247 rc.cpp:705
+#: gui/serversettings.cpp:103 po/rc.cpp:269 po/rc.cpp:308 po/rc.cpp:857
+#: rc.cpp:269 rc.cpp:308 rc.cpp:857
 msgid "Host:"
 msgstr "Host:"
 
@@ -2790,7 +2971,7 @@ msgstr ""
 "por el artista de álbum de la canción actual, y %album% se sustituirá por el "
 "nombre del álbum.</i></p>"
 
-#: gui/serversettings.cpp:252
+#: gui/serversettings.cpp:257
 msgid ""
 "Which type of collection do you wish to connect to?<br/><ul><li>Standard - "
 "music collection may be shared, is on another machine, or is already setup</"
@@ -2802,74 +2983,62 @@ msgstr ""
 "configurada.</li><li>Básica: la colección de música no es compartida, y "
 "Cantata configurará y controlará la instancia de MPD.</li></ul>"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Add Collection"
 msgstr "Añadir colección"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Standard"
 msgstr "Estándar"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Basic"
 msgstr "Básico"
 
-#: gui/serversettings.cpp:297
+#: gui/serversettings.cpp:302
 msgid "Delete <b>%1</b>?"
 msgstr "¿Eliminar <b>%1</b>?"
 
-#: gui/serversettings.cpp:298
+#: gui/serversettings.cpp:303
 msgid "Delete"
 msgstr "Eliminar"
 
-#: gui/serversettings.cpp:336
+#: gui/serversettings.cpp:341
 msgid "New Collection %1"
 msgstr "Colección nueva %1"
 
-#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
+#: gui/serversettings.cpp:357 mpd/mpdconnection.cpp:173
 msgid "Default"
 msgstr "Predefinido"
 
-#: gui/shortcutssettingspage.cpp:74
+#: gui/shortcutssettingspage.cpp:76
 msgid "Multi-Media Keys"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:80
+#: gui/shortcutssettingspage.cpp:82
 msgid "Do not use media keys to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:81
+#: gui/shortcutssettingspage.cpp:83 gui/shortcutssettingspage.cpp:97
 msgid "Use media keys to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:84
+#: gui/shortcutssettingspage.cpp:86 gui/shortcutssettingspage.cpp:104
 msgid "Use media keys, as configured in desktop settings, to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:85
+#: gui/shortcutssettingspage.cpp:87 gui/shortcutssettingspage.cpp:105
 msgid ""
 "Use media keys, as configured in GNOME/Unity settings, to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
-#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+#: gui/shortcutssettingspage.cpp:90 gui/shortcutssettingspage.cpp:107
+#: online/onlineservicespage.cpp:99 streams/streamspage.cpp:99
+#: support/fancytabwidget.cpp:825
 #, fuzzy
 msgid "Configure..."
 msgstr "Configuración"
 
-#: gui/shortcutssettingspage.cpp:95
-msgid "Use media keys to control Cantata:"
-msgstr ""
-
-#: gui/shortcutssettingspage.cpp:106
-msgid "Use media keys, as configured in desktop settings, to control Cantata:"
-msgstr ""
-
-#: gui/shortcutssettingspage.cpp:107
-msgid ""
-"Use media keys, as configured in GNOME/Unity settings, to control Cantata:"
-msgstr ""
-
 #: gui/stdactions.cpp:55
 msgid "Previous Track"
 msgstr "Pista anterior"
@@ -2942,7 +3111,7 @@ msgstr "Prioridad personalizada..."
 msgid "Add To Playlist"
 msgstr "Añadir a lista de reproducción"
 
-#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:66
 msgid "Organize Files"
 msgstr "Organizar ficheros"
 
@@ -2950,7 +3119,7 @@ msgstr "Organizar ficheros"
 msgid "Edit Tags"
 msgstr "Editar etiquetas"
 
-#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:106
 msgid "ReplayGain"
 msgstr "Ganancia de reproducción"
 
@@ -2963,88 +3132,89 @@ msgid "Set Image"
 msgstr "Establecer imagen"
 
 #: gui/stdactions.cpp:88
-msgid "Refresh Database"
-msgstr "Actualizar base de datos"
-
-#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "Retroceder"
 
-#: gui/trayitem.cpp:192
+#: gui/stdactions.cpp:91
+msgid "Find"
+msgstr ""
+
+#: gui/trayitem.cpp:210
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%1 en %2"
 
-#: gui/trayitem.cpp:193
+#: gui/trayitem.cpp:211
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: gui/trayitem.cpp:195
+#: gui/trayitem.cpp:213
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%1 por %2 en %3"
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:214
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr "%1 por %2 en %3 (%4)"
 
-#: gui/trayitem.cpp:223
+#: gui/trayitem.cpp:241
 msgid "Now playing"
 msgstr "En reproducción"
 
-#: http/httpserversettings.cpp:40
+#: http/httpserversettings.cpp:39
 msgid "Local loopback (%1)"
 msgstr "Loopback local (%1)"
 
-#: http/httpserversettings.cpp:43
+#: http/httpserversettings.cpp:42
 msgid "Wired (%1)"
 msgstr "Cableado (%1)"
 
-#: http/httpserversettings.cpp:46
+#: http/httpserversettings.cpp:45
 msgid "Wireless (%1)"
 msgstr "Inalámbrico (%1)"
 
-#: http/httpserversettings.cpp:53
+#: http/httpserversettings.cpp:52
 msgid "First active interface"
 msgstr "Primera interfaz activa"
 
-#: http/httpserversettings.cpp:98
-msgid "Inactive"
-msgstr "Inactivo"
+#: models/albumsmodel.cpp:260 models/musicmodel.cpp:254
+msgctxt "Album by Artist"
+msgid "%1 by %2"
+msgstr "%1 por %2"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:221
+#: models/musicmodel.cpp:133
 msgid "Cue Sheet"
 msgstr "Hoja cue"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:220
+#: models/musicmodel.cpp:133
 msgid "Playlist"
 msgstr "Lista de reproducción"
 
-#: models/devicesmodel.cpp:108
+#: models/devicesmodel.cpp:116
 msgid "Configure Device"
 msgstr "Configurar dispositivo"
 
-#: models/devicesmodel.cpp:109
+#: models/devicesmodel.cpp:117
 msgid "Refresh Device"
 msgstr "Actualizar dispositivo"
 
-#: models/devicesmodel.cpp:110
+#: models/devicesmodel.cpp:118
 msgid "Connect Device"
 msgstr "Conecte el dispositivo"
 
-#: models/devicesmodel.cpp:111
+#: models/devicesmodel.cpp:119
 msgid "Disconnect Device"
 msgstr "Desconecte el dispositivo"
 
-#: models/devicesmodel.cpp:113
+#: models/devicesmodel.cpp:121
 msgid "Edit CD Details"
 msgstr "Editar detalles de CD"
 
-#: models/devicesmodel.cpp:690
+#: models/devicesmodel.cpp:730
 msgid "No Devices Attached"
 msgstr "No hay dispositivos conectados"
 
@@ -3076,42 +3246,42 @@ msgstr "Sesión iniciada (finalización:%1)"
 msgid "Session expired"
 msgstr "Sesión finalizada"
 
-#: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
+#: models/dirviewmodel.cpp:204 models/dirviewmodel.cpp:212
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:696
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "1 entrada"
 msgstr[1] "%1 entradas"
 
-#: models/dirviewmodel.cpp:190
+#: models/dirviewmodel.cpp:219
 msgid "Audio File"
 msgstr "Fichero de audio"
 
-#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
-#: models/musiclibraryitemroot.cpp:844
+#: models/musiclibraryitemartist.cpp:248 models/musiclibraryitemartist.cpp:261
+#: models/musiclibraryitemroot.cpp:840
 msgid "Single Tracks"
 msgstr "Pistas únicas"
 
-#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
-#: widgets/groupedview.cpp:366
+#: models/musicmodel.cpp:190 models/onlineservicesmodel.cpp:167
+#: widgets/groupedview.cpp:364
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "1 pista"
 msgstr[1] "%1 pistas"
 
-#: models/musicmodel.cpp:185
+#: models/musicmodel.cpp:196
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "1 artista"
 msgstr[1] "%1 artistas"
 
-#: models/musicmodel.cpp:192
+#: models/musicmodel.cpp:203
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "1 álbum"
 msgstr[1] "%1 álbumes"
 
-#: models/musicmodel.cpp:198
+#: models/musicmodel.cpp:209
 msgid "1 Episode"
 msgid_plural "%1 Episodes"
 msgstr[0] ""
@@ -3119,196 +3289,204 @@ msgstr[1] ""
 
 #. i18n: file: online/onlinesettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: models/onlineservicesmodel.cpp:83 po/rc.cpp:720 rc.cpp:720
+#: models/onlineservicesmodel.cpp:91 po/rc.cpp:872 rc.cpp:872
 #, fuzzy
 msgid "Configure Service"
 msgstr "Configurar dispositivo"
 
-#: models/onlineservicesmodel.cpp:84
+#: models/onlineservicesmodel.cpp:92
 #, fuzzy
 msgid "Refresh Service"
 msgstr "Actualizar dispositivo"
 
-#: models/onlineservicesmodel.cpp:85
+#: models/onlineservicesmodel.cpp:93
 #, fuzzy
 msgid "Add Subscription"
 msgstr "Ninguna suscripción"
 
-#: models/onlineservicesmodel.cpp:86
+#: models/onlineservicesmodel.cpp:94
 #, fuzzy
 msgid "Remove Subscription"
 msgstr "Ninguna suscripción"
 
-#: models/onlineservicesmodel.cpp:87
+#: models/onlineservicesmodel.cpp:95
 #, fuzzy
 msgid "Refresh Subscription"
 msgstr "Ninguna suscripción"
 
-#: models/onlineservicesmodel.cpp:137
+#: models/onlineservicesmodel.cpp:145
 msgid "Last Search:%1"
 msgstr "Última búsqueda:%1"
 
-#: models/onlineservicesmodel.cpp:149
-msgid "Searching..."
-msgstr "Buscando..."
-
-#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
-#: models/streamsmodel.cpp:670
+#: models/onlineservicesmodel.cpp:160 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:691
 msgid "Not Loaded"
 msgstr "No se ha cargado"
 
-#: models/onlineservicesmodel.cpp:155
+#: models/onlineservicesmodel.cpp:163
 msgid "Use search to locate tracks"
 msgstr "Utilizar búsqueda para ubicar pistas"
 
-#: models/onlineservicesmodel.cpp:166
+#: models/onlineservicesmodel.cpp:174
 msgid "1 Podcast"
 msgid_plural "%1 Podcasts"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/onlineservicesmodel.cpp:177
+#: models/onlineservicesmodel.cpp:185
 #, fuzzy
 msgid "(Downloading: %1%)"
 msgstr "Descargando"
 
-#: models/onlineservicesmodel.cpp:235
+#: models/onlineservicesmodel.cpp:243
 #, fuzzy
 msgctxt "podcast name (num unplayed episodes)"
 msgid "%1 (%2)"
 msgstr "%1 (Disco %2)"
 
-#: models/playlistsmodel.cpp:77
+#: models/playlistsmodel.cpp:105
 msgid "New Playlist..."
 msgstr "Nueva lista de reproducción…"
 
-#: models/playqueuemodel.cpp:102
-msgctxt "Track Number (#)"
-msgid "#"
-msgstr "Núm."
+#: models/playlistsmodel.cpp:321
+#, fuzzy
+msgid "Smart Playlist"
+msgstr "Lista de reproducción"
 
-#: models/playqueuemodel.cpp:103
+#: models/playqueuemodel.cpp:109
 msgid "Length"
 msgstr "Duración"
 
-#: models/playqueuemodel.cpp:104
+#: models/playqueuemodel.cpp:110
 msgid "Disc"
 msgstr "Disco"
 
-#. i18n: file: devices/filenameschemedialog.ui:138
+#. i18n: file: devices/filenameschemedialog.ui:174
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
+#: models/playqueuemodel.cpp:111 po/rc.cpp:248 rc.cpp:248
 msgid "Year"
 msgstr "Año"
 
-#: models/playqueuemodel.cpp:360
+#: models/playqueuemodel.cpp:158
+msgid "Undo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:160
+msgid "Redo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:404
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(Prioridad: %1)</b>"
 
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:693
 msgid "Loading..."
 msgstr "Cargando…"
 
-#: models/streamsmodel.cpp:286
+#: models/streamsmodel.cpp:302
 msgid "Bookmarks"
 msgstr "Favoritos"
 
-#: models/streamsmodel.cpp:560
+#: models/streamsmodel.cpp:576
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:563
+#: models/streamsmodel.cpp:579
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:564
+#: models/streamsmodel.cpp:580
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:567
+#: models/streamsmodel.cpp:583
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:568
+#: models/streamsmodel.cpp:584
+msgid "Radio GFM"
+msgstr ""
+
+#: models/streamsmodel.cpp:585
 msgid "Digitally Imported"
 msgstr "Importe digitalmente"
 
-#: models/streamsmodel.cpp:569
+#: models/streamsmodel.cpp:586
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:570
+#: models/streamsmodel.cpp:587
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:571
+#: models/streamsmodel.cpp:588
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:572
+#: models/streamsmodel.cpp:589
 msgid "Favorites"
 msgstr "Favoritos"
 
-#: models/streamsmodel.cpp:573
+#: models/streamsmodel.cpp:590
 msgid "Listen Live"
 msgstr "Listen Live"
 
-#: models/streamsmodel.cpp:578
+#: models/streamsmodel.cpp:595
 msgid "Bookmark Category"
 msgstr "Categoría de favorito"
 
-#: models/streamsmodel.cpp:579
+#: models/streamsmodel.cpp:596
 msgid "Add Stream To Favorites"
 msgstr "Añadir flujo a favoritos"
 
-#: models/streamsmodel.cpp:580
+#: models/streamsmodel.cpp:597
 msgid "Configure Streams"
 msgstr "Configuración de flujos"
 
-#: models/streamsmodel.cpp:660
+#: models/streamsmodel.cpp:681
 msgid "%1 (Read-Only)"
 msgstr "%1 (Solo lectura)"
 
-#: models/streamsmodel.cpp:1241
+#: models/streamsmodel.cpp:1261
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr ""
 "Fallo al guardar la lista de flujo. Compruebe si %1 tiene permisos de "
 "escritura."
 
-#: models/streamsmodel.cpp:1639
+#: models/streamsmodel.cpp:1659
 msgid "All"
 msgstr "Todo"
 
-#: mpd/mpdconnection.cpp:154
+#: mpd/mpdconnection.cpp:179
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "\"%1\""
 
-#: mpd/mpdconnection.cpp:156
+#: mpd/mpdconnection.cpp:181
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr "\"%1\" (%2:%3)"
 
-#: mpd/mpdconnection.cpp:372 mpd/mpdconnection.cpp:415
-#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
-#: mpd/mpdconnection.cpp:1036
+#: mpd/mpdconnection.cpp:406 mpd/mpdconnection.cpp:451
+#: mpd/mpdconnection.cpp:501 mpd/mpdconnection.cpp:1137
+#: mpd/mpdconnection.cpp:1164
 msgid "Connection to %1 failed"
 msgstr "Fallo de conexión a %1"
 
-#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
+#: mpd/mpdconnection.cpp:412 mpd/mpdconnection.cpp:455
 msgid "Connection to %1 failed - incorrect password"
 msgstr "Fallo de conexión a %1 - contraseña incorrecta"
 
-#: mpd/mpdconnection.cpp:455
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to send command to %1 - not connected"
 msgstr "Fallo al enviar la orden a %1: no conectado"
 
-#: mpd/mpdconnection.cpp:491
+#: mpd/mpdconnection.cpp:539
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr ""
 "Fallo al cargar. Compruebe que el usuario «mpd» tiene permisos de lectura."
 
-#: mpd/mpdconnection.cpp:493
+#: mpd/mpdconnection.cpp:541
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
@@ -3316,23 +3494,23 @@ msgstr ""
 "Fallo al cargar. MPD solo puede reproducir ficheros locales si se conecta a "
 "través de un fichero socket local."
 
-#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
+#: mpd/mpdconnection.cpp:547 mpd/mpdconnection.cpp:558
 msgid "Failed to send command. Disconnected from %1"
 msgstr "Fallo al enviar la orden. Desconectado de %1"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1306
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr "Fallo al renombrar <b>%1</b> to <b>%2</b>"
 
-#: mpd/mpdconnection.cpp:1183
+#: mpd/mpdconnection.cpp:1318
 msgid "Failed to save <b>%1</b>"
 msgstr "Fallo al crear <b>%1</b>"
 
-#: mpd/mpdconnection.cpp:1196
+#: mpd/mpdconnection.cpp:1331
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr "No puede añadir secciones de una hoja CUE a una lista de reproducción."
 
-#: mpd/mpdconnection.cpp:1199
+#: mpd/mpdconnection.cpp:1334
 msgid "You cannot add a playlist to another playlist!"
 msgstr "No puede añadir una lista de reproducción a otra."
 
@@ -3340,7 +3518,15 @@ msgstr "No puede añadir una lista de reproducción a otra."
 msgid "Personal"
 msgstr "Personal"
 
-#: mpd/song.cpp:343
+#: mpd/song.cpp:62
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: mpd/song.cpp:63
+msgid "Various Artists"
+msgstr "Varios artistas"
+
+#: mpd/song.cpp:427
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3410,8 +3596,8 @@ msgstr "Configuración de Magnatune"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
-#: rc.cpp:711 rc.cpp:729
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:863 po/rc.cpp:881
+#: rc.cpp:863 rc.cpp:881
 msgid "Username:"
 msgstr "Nombre de usuario:"
 
@@ -3439,9 +3625,9 @@ msgstr "Nombre de usuario:"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPasswordLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:220 po/rc.cpp:238
-#: po/rc.cpp:412 po/rc.cpp:647 po/rc.cpp:714 po/rc.cpp:732 rc.cpp:220
-#: rc.cpp:238 rc.cpp:412 rc.cpp:647 rc.cpp:714 rc.cpp:732
+#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:281 po/rc.cpp:299
+#: po/rc.cpp:476 po/rc.cpp:802 po/rc.cpp:866 po/rc.cpp:884 rc.cpp:281
+#: rc.cpp:299 rc.cpp:476 rc.cpp:802 rc.cpp:866 rc.cpp:884
 msgid "Password:"
 msgstr "Contraseña:"
 
@@ -3481,163 +3667,188 @@ msgstr "Fallo de descarga"
 msgid "Download To Library"
 msgstr "Descargar a biblioteca"
 
-#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
-#, fuzzy
-msgid "Search For Podcasts"
-msgstr "Búsqueda de letras"
-
-#: online/onlineservicespage.cpp:63
+#: online/onlineservicespage.cpp:62
 msgid "Download Podcast Episodes"
 msgstr ""
 
-#: online/onlineservicespage.cpp:64
+#: online/onlineservicespage.cpp:63
 msgid "Delete Downloaded Podcast Episodes"
 msgstr ""
 
-#: online/onlineservicespage.cpp:329
+#: online/onlineservicespage.cpp:320
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "Buscar %1:"
 
-#: online/onlineservicespage.cpp:464
+#: online/onlineservicespage.cpp:458
 msgid "Re-download music listing for %1?"
 msgstr "¿Desea descargar otra vez el listado de música de %1?"
 
-#: online/onlineservicespage.cpp:532
-msgid "Subscribe to Podcast"
-msgstr ""
-
-#: online/onlineservicespage.cpp:532
-msgid "Enter podcast URL:"
-msgstr ""
-
-#: online/onlineservicespage.cpp:541
-msgid "Invalid URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:546
-msgid "You are already subscribed to this URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:550
-msgid "Already downloading this URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:579
+#: online/onlineservicespage.cpp:544
 msgid "Unsubscribe from <b>%1</b>?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:600
+#: online/onlineservicespage.cpp:565
 msgid "Refresh all podcast listings?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:621
+#: online/onlineservicespage.cpp:586
 msgid "Refresh episode listing from <b>%1</b>?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:695
+#: online/onlineservicespage.cpp:652
 msgid "All selected podcasts have already been downloaded!"
 msgstr ""
 
-#: online/onlineservicespage.cpp:699
+#: online/onlineservicespage.cpp:656
 msgid "Do you wish to download the following podcast episode?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:702
+#: online/onlineservicespage.cpp:659
 msgid "Do you wish to download the following podcast episodes?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:705
+#: online/onlineservicespage.cpp:662
 #, fuzzy
 msgid "Do you wish to download the selected podcast episodes?"
 msgstr "¿Desea eliminar los %1 flujos seleccionados?"
 
-#: online/onlineservicespage.cpp:753
+#: online/onlineservicespage.cpp:710
 msgid "All selected downloaded podcast episodes have already been deleted!"
 msgstr ""
 
-#: online/onlineservicespage.cpp:757
+#: online/onlineservicespage.cpp:714
 msgid ""
 "Do you wish to delete the downloaded file of the following podcast episode?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:760
+#: online/onlineservicespage.cpp:717
 msgid ""
 "Do you wish to the delete downloaded files of the following podcast episodes?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:763
+#: online/onlineservicespage.cpp:720
 msgid ""
 "Do you wish to the delete downloaded files of the selected podcast episodes?"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:243
+#: online/podcastsearchdialog.cpp:253
 msgid "RSS:"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:245
+#: online/podcastsearchdialog.cpp:255
 msgid "Website:"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 #, fuzzy
 msgid "Podcast details"
 msgstr "Detalles de conexión"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Select a podcast to display its details"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:322
+#: online/podcastsearchdialog.cpp:333
 msgid "Enter search term..."
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:372
+#: online/podcastsearchdialog.cpp:383
 #, fuzzy
 msgid "Failed to fetch podcasts from %1"
 msgstr "Fallo de conexión con «%1»"
 
-#: online/podcastsearchdialog.cpp:378
+#: online/podcastsearchdialog.cpp:389
 msgid "There was a problem parsing the response from %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:439
+#: online/podcastsearchdialog.cpp:450
 #, fuzzy
 msgid "Failed to download directory listing"
 msgstr "Fallo al descargar la imagen."
 
-#: online/podcastsearchdialog.cpp:447
+#: online/podcastsearchdialog.cpp:458
 #, fuzzy
 msgid "Failed to parse directory listing"
 msgstr "Fallo de análisis"
 
 #: online/podcastsearchdialog.cpp:508
+#, fuzzy
+msgid "URL"
+msgstr "URL:"
+
+#: online/podcastsearchdialog.cpp:517
+msgid "Enter podcast URL..."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:518
+msgid "Load"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:525
+msgid "Enter podcast URL below, and press 'Load'"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:552
+msgid "Invalid URL!"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:562
+#, fuzzy
+msgid "Failed to fetch podcast!"
+msgstr "Fallo de conexión con «%1»"
+
+#: online/podcastsearchdialog.cpp:567
+#, fuzzy
+msgid "Failed to parse podcast."
+msgstr "Fallo de análisis"
+
+#: online/podcastsearchdialog.cpp:571
+msgid ""
+"Cantata only supports audio podcasts! The URL entered contains only video "
+"podcasts."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:589
 msgid "Subscribe"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:607
+msgid "Enter URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:607
+msgid "Manual podcast URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 #, fuzzy
 msgid "Search %1"
 msgstr "Buscar %1:"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search for podcasts on %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1 podcasts"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:602
+#: online/podcastsearchdialog.cpp:639
+#, fuzzy
+msgid "Add Podcast Subscription"
+msgstr "Ninguna suscripción"
+
+#: online/podcastsearchdialog.cpp:695
 #, fuzzy
 msgid "Subscription added"
 msgstr "Ninguna suscripción"
 
-#: online/podcastsearchdialog.cpp:604
+#: online/podcastsearchdialog.cpp:697
 msgid "You are already subscribed to this podcast!"
 msgstr ""
 
@@ -3645,96 +3856,177 @@ msgstr ""
 msgid "Podcasts"
 msgstr ""
 
-#: online/podcastservice.cpp:284
+#: online/podcastservice.cpp:288
 msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
 msgstr ""
 
-#: online/podcastservice.cpp:286
+#: online/podcastservice.cpp:290
 #, fuzzy
 msgid "Failed to parse %1"
 msgstr "Fallo de análisis"
 
-#: online/podcastservice.cpp:290
+#: online/podcastservice.cpp:294
 #, fuzzy
 msgid "Failed to download %1"
 msgstr "Fallo de descarga"
 
-#: online/podcastsettingsdialog.cpp:58
+#: online/podcastsettingsdialog.cpp:59
 msgid "Check for new episodes:"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:59
+#: online/podcastsettingsdialog.cpp:60
 #, fuzzy
 msgid "Download episodes to:"
 msgstr "Descargas:"
 
-#: online/podcastsettingsdialog.cpp:60
+#: online/podcastsettingsdialog.cpp:67
 #, fuzzy
-msgid "Automatically download new episodes:"
-msgstr "Consulta automática:"
+msgid "Automatically download new episodes"
+msgstr "Consulta automática"
 
-#: online/podcastsettingsdialog.cpp:82
+#: online/podcastsettingsdialog.cpp:80
 #, fuzzy
 msgid "Podcast Settings"
 msgstr "Ajustes de proxy"
 
-#: online/podcastsettingsdialog.cpp:84
+#: online/podcastsettingsdialog.cpp:82
 msgid "Manually"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:85
+#: online/podcastsettingsdialog.cpp:83
 msgid "Every 15 minutes"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:86
+#: online/podcastsettingsdialog.cpp:84
 msgid "Every 30 minutes"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:87
+#: online/podcastsettingsdialog.cpp:85
 msgid "Every hour"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:88
+#: online/podcastsettingsdialog.cpp:86
 msgid "Every 2 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:89
+#: online/podcastsettingsdialog.cpp:87
 msgid "Every 6 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:90
+#: online/podcastsettingsdialog.cpp:88
 msgid "Every 12 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:91
+#: online/podcastsettingsdialog.cpp:89
 msgid "Every day"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:92
+#: online/podcastsettingsdialog.cpp:90
 msgid "Every week"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:19
-#. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
-#: po/rc.cpp:3 rc.cpp:3
-msgid "Use backdrop:"
-msgstr "Utilizar fondo:"
-
-#. i18n: file: context/othersettings.ui:32
-#. i18n: ectx: property (text), widget (BuddyLabel, contextDarkBackgroundLabel)
-#: po/rc.cpp:6 rc.cpp:6
-msgid "Dark background:"
-msgstr "Fondo oscuro:"
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:3 po/rc.cpp:657 rc.cpp:3 rc.cpp:657
+msgid "Background Image"
+msgstr ""
 
-#. i18n: file: context/othersettings.ui:45
-#. i18n: ectx: property (text), widget (BuddyLabel, wikipediaIntroOnlyLabel)
+#. i18n: file: context/othersettings.ui:36
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_artist)
 #: po/rc.cpp:9 rc.cpp:9
-msgid "Only show basic wikipedia text:"
-msgstr "Mostrar solo el texto básico de Wikipedia:"
+#, fuzzy
+msgid "Artist image"
+msgstr "Mostrar imágenes de artista:"
+
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#: po/rc.cpp:12 po/rc.cpp:666 rc.cpp:12 rc.cpp:666
+#, fuzzy
+msgid "Custom image:"
+msgstr "Personalizado:"
+
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#: po/rc.cpp:15 po/rc.cpp:669 rc.cpp:15 rc.cpp:669
+msgid "Blur:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#: po/rc.cpp:18 po/rc.cpp:672 rc.cpp:18 rc.cpp:672
+msgid "10px"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: po/rc.cpp:21 po/rc.cpp:675 rc.cpp:21 rc.cpp:675
+msgid "Opacity:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#: po/rc.cpp:25 po/rc.cpp:679 rc.cpp:25 rc.cpp:679
+#, no-c-format
+msgid "40%"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, contextDarkBackground)
+#: po/rc.cpp:28 rc.cpp:28
+msgid "Dark background"
+msgstr "Fondo oscuro"
 
-#. i18n: file: context/othersettings.ui:86
+#. i18n: file: context/othersettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, wikipediaIntroOnly)
+#: po/rc.cpp:31 rc.cpp:31
+msgid "Only show basic wikipedia text"
+msgstr "Mostrar solo el texto básico de Wikipedia"
+
+#. i18n: file: context/othersettings.ui:178
+#. i18n: ectx: property (text), widget (QCheckBox, contextAlwaysCollapsed)
+#: po/rc.cpp:34 rc.cpp:34
+msgid "Always collapse into a single pane"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:207
 #. i18n: ectx: property (text), widget (StateLabel, wikipediaIntroOnlyNote)
-#: po/rc.cpp:13 rc.cpp:13
+#: po/rc.cpp:38 rc.cpp:38
 #, no-c-format
 msgid ""
 "<i><b>NOTE:</b> Cantata does not show the full wikipedia pages (with images, "
@@ -3754,188 +4046,174 @@ msgstr ""
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:16 rc.cpp:16
+#: po/rc.cpp:41 rc.cpp:41
 msgid "Available:"
 msgstr "Disponible:"
 
 #. i18n: file: context/togglelist.ui:24
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:19 rc.cpp:19
+#: po/rc.cpp:44 rc.cpp:44
 msgid "Selected:"
 msgstr "Seleccionado:"
 
-#. i18n: file: devices/actiondialog.ui:30
+#. i18n: file: devices/actiondialog.ui:33
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:22 rc.cpp:22
+#: po/rc.cpp:47 rc.cpp:47
 msgid "Copy songs from:"
 msgstr "Copiar canciones desde:"
 
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#: po/rc.cpp:25 po/rc.cpp:31 po/rc.cpp:49 po/rc.cpp:744 rc.cpp:25 rc.cpp:31
-#: rc.cpp:49 rc.cpp:744
+#: po/rc.cpp:50 po/rc.cpp:62 po/rc.cpp:896 rc.cpp:50 rc.cpp:62 rc.cpp:896
 msgid "TextLabel"
 msgstr "TextLabel"
 
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#: po/rc.cpp:28 po/rc.cpp:34 rc.cpp:28 rc.cpp:34
+#: po/rc.cpp:56 po/rc.cpp:68 rc.cpp:56 rc.cpp:68
 msgid "(Needs configuring)"
 msgstr "(Requiere configuración)"
 
-#. i18n: file: devices/actiondialog.ui:123
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:37 rc.cpp:37
-msgid "Overwrite songs:"
-msgstr "Sobrescribir canciones:"
-
-#. i18n: file: devices/actiondialog.ui:150
+#. i18n: file: devices/actiondialog.ui:86
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:40 rc.cpp:40
+#: po/rc.cpp:59 rc.cpp:59
 msgid "Copy songs to:"
 msgstr "Copiar canciones a:"
 
-#. i18n: file: devices/actiondialog.ui:157
+#. i18n: file: devices/actiondialog.ui:149
 #. i18n: ectx: property (text), widget (QLabel, codecLabel)
-#: po/rc.cpp:43 rc.cpp:43
+#: po/rc.cpp:71 rc.cpp:71
 msgid "Destination format:"
 msgstr "Formato destino:"
 
-#. i18n: file: devices/actiondialog.ui:171
+#. i18n: file: devices/actiondialog.ui:163
+#. i18n: ectx: property (text), widget (QCheckBox, overwrite)
+#: po/rc.cpp:74 rc.cpp:74
+#, fuzzy
+msgid "Overwrite songs"
+msgstr "Sobrescribir canciones:"
+
+#. i18n: file: devices/actiondialog.ui:170
 #. i18n: ectx: property (text), widget (QLabel, songCountLabel)
-#: po/rc.cpp:46 rc.cpp:46
+#: po/rc.cpp:77 rc.cpp:77
 msgid "To copy:"
 msgstr "Para copiar:"
 
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#: po/rc.cpp:80 po/rc.cpp:968 po/rc.cpp:995 rc.cpp:80 rc.cpp:968 rc.cpp:995
+msgid ""
+"<i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i>"
+msgstr ""
+
 #. i18n: file: devices/albumdetails.ui:26
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:52 rc.cpp:52
+#: po/rc.cpp:83 rc.cpp:83
 msgid "Album Details"
 msgstr "Detalles del álbum"
 
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#: po/rc.cpp:58 po/rc.cpp:298 po/rc.cpp:798 rc.cpp:58 rc.cpp:298 rc.cpp:798
-msgid "Composer:"
-msgstr ""
-
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
-msgid "Genre:"
-msgstr "Género:"
-
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#: po/rc.cpp:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
+#: po/rc.cpp:98 po/rc.cpp:965 rc.cpp:98 rc.cpp:965
 msgid "Year:"
 msgstr "Año:"
 
-#. i18n: file: devices/albumdetails.ui:99
+#. i18n: file: devices/albumdetails.ui:102
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:70 rc.cpp:70
+#: po/rc.cpp:101 rc.cpp:101
 msgid "Disc:"
 msgstr "Disco:"
 
-#. i18n: file: devices/albumdetails.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:73 rc.cpp:73
-msgid "Single artist:"
+#. i18n: file: devices/albumdetails.ui:115
+#. i18n: ectx: property (text), widget (QCheckBox, singleArtist)
+#: po/rc.cpp:104 rc.cpp:104
+#, fuzzy
+msgid "Single artist"
 msgstr "Único artista:"
 
-#. i18n: file: devices/audiocdsettings.ui:20
+#. i18n: file: devices/audiocdsettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:119 rc.cpp:119
 msgid "Album and Track Information Retrieval"
 msgstr "Obtención de información de álbum y pista"
 
-#. i18n: file: devices/audiocdsettings.ui:26
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:91 rc.cpp:91
-msgid "Automatically lookup:"
-msgstr "Consulta automática:"
-
-#. i18n: file: devices/audiocdsettings.ui:39
+#. i18n: file: devices/audiocdsettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:122 rc.cpp:122
 msgid "Initially look up via:"
 msgstr "Consulta inicial mediante:"
 
-#. i18n: file: devices/audiocdsettings.ui:52
+#. i18n: file: devices/audiocdsettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:125 rc.cpp:125
 msgid "CDDB Host:"
 msgstr "Host CDDB:"
 
-#. i18n: file: devices/audiocdsettings.ui:65
+#. i18n: file: devices/audiocdsettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:128 rc.cpp:128
 msgid "CDDB Port:"
 msgstr "Puerto CDDB:"
 
-#. i18n: file: devices/audiocdsettings.ui:88
+#. i18n: file: devices/audiocdsettings.ui:84
+#. i18n: ectx: property (text), widget (QCheckBox, cdAuto)
+#: po/rc.cpp:131 rc.cpp:131
+msgid "Lookup information as soon as CD is inserted"
+msgstr ""
+
+#. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:134 rc.cpp:134
 msgid "Audio Extraction"
 msgstr "Extracción de audio"
 
-#. i18n: file: devices/audiocdsettings.ui:94
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:106 rc.cpp:106
-msgid "Full paranoia mode (best quality):"
-msgstr "Modo «full» de paranoia (máxima calidad):"
+#. i18n: file: devices/audiocdsettings.ui:100
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaFull)
+#: po/rc.cpp:137 rc.cpp:137
+msgid "Full paranoia mode (best quality)"
+msgstr "Modo «full» de paranoia (máxima calidad)"
 
 #. i18n: file: devices/audiocdsettings.ui:107
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:109 rc.cpp:109
-msgid "Never skip on read error:"
-msgstr "No omitir por fallo de lectura:"
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaNeverSkip)
+#: po/rc.cpp:140 rc.cpp:140
+msgid "Never skip on read error"
+msgstr "No omitir por fallo de lectura"
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:112 rc.cpp:112
+#: po/rc.cpp:143 rc.cpp:143
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3963,190 +4241,266 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
 #. i18n: file: gui/serversettings.ui:325
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
-#: po/rc.cpp:115 po/rc.cpp:415 po/rc.cpp:433 po/rc.cpp:650 po/rc.cpp:671
-#: rc.cpp:115 rc.cpp:415 rc.cpp:433 rc.cpp:650 rc.cpp:671
+#: po/rc.cpp:146 po/rc.cpp:479 po/rc.cpp:497 po/rc.cpp:805 po/rc.cpp:826
+#: rc.cpp:146 rc.cpp:479 rc.cpp:497 rc.cpp:805 rc.cpp:826
 msgid "Music folder:"
 msgstr "Directorio de música:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:149 rc.cpp:149
 msgid "Copy album covers as:"
 msgstr "Copiar carátulas de álbum como:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: po/rc.cpp:152 rc.cpp:152
 msgid "Maximum cover size:"
 msgstr "Tamaño máximo de carátula:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:82
-#. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:124 rc.cpp:124
-msgid "'Various Artists' workaround:"
+#. i18n: file: devices/devicepropertieswidget.ui:85
+#. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
+#: po/rc.cpp:155 rc.cpp:155
+msgid "Default volume:"
+msgstr "Volumen predefinido:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, fixVariousArtists)
+#: po/rc.cpp:158 rc.cpp:158
+#, fuzzy
+msgid "'Various Artists' workaround"
 msgstr "Arreglo para «Varios Artistas»:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, autoScanLabel)
-#: po/rc.cpp:127 rc.cpp:127
-msgid "Automatically scan music when attached:"
+#. i18n: file: devices/devicepropertieswidget.ui:99
+#. i18n: ectx: property (text), widget (QCheckBox, autoScan)
+#: po/rc.cpp:161 rc.cpp:161
+#, fuzzy
+msgid "Automatically scan music when attached"
 msgstr "Analizar la música automáticamente al conectar:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:108
-#. i18n: ectx: property (text), widget (BuddyLabel, useCacheLabel)
-#: po/rc.cpp:130 rc.cpp:130
-msgid "Use cache:"
+#. i18n: file: devices/devicepropertieswidget.ui:106
+#. i18n: ectx: property (text), widget (QCheckBox, useCache)
+#: po/rc.cpp:164 rc.cpp:164
+#, fuzzy
+msgid "Use cache"
 msgstr "Utilizar caché:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:121
-#. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:133 rc.cpp:133
-msgid "Default volume:"
-msgstr "Volumen predefinido:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#: po/rc.cpp:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
+#: po/rc.cpp:167 po/rc.cpp:971 rc.cpp:167 rc.cpp:971
 msgid "Filenames"
 msgstr "Nombres de fichero"
 
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
-msgid "Use only ASCII characters:"
-msgstr "Utilizar sólo caracteres ASCII:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
-msgid "Replace spaces with underscores:"
-msgstr "Sustituir espacios por guiones bajos:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
-msgid "Ignore 'The' in artist names:"
-msgstr "Ignorar «The» en nombres de artista:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
+#: po/rc.cpp:170 po/rc.cpp:974 rc.cpp:170 rc.cpp:974
 msgid "Filename scheme:"
 msgstr "Esquema de nombre de fichero:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
-msgid "VFAT safe:"
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#: po/rc.cpp:173 po/rc.cpp:977 rc.cpp:173 rc.cpp:977
+#, fuzzy
+msgid "VFAT safe"
 msgstr "Compatibilidad con VFAT:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:250
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#: po/rc.cpp:176 po/rc.cpp:980 rc.cpp:176 rc.cpp:980
+#, fuzzy
+msgid "Use only ASCII characters"
+msgstr "Utilizar sólo caracteres ASCII:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#: po/rc.cpp:179 po/rc.cpp:983 rc.cpp:179 rc.cpp:983
+#, fuzzy
+msgid "Replace spaces with underscores"
+msgstr "Sustituir espacios por guiones bajos:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#: po/rc.cpp:182 po/rc.cpp:986 rc.cpp:182 rc.cpp:986
+#, fuzzy
+msgid "Ignore 'The' in artist names"
+msgstr "Ignorar «The» en nombres de artista:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:192
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:185 rc.cpp:185
 msgid "Transcoding"
 msgstr "Transcodificación"
 
-#. i18n: file: devices/devicepropertieswidget.ui:261
-#. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:157 rc.cpp:157
-msgid "Only transcode if source file is of a different format:"
+#. i18n: file: devices/devicepropertieswidget.ui:201
+#. i18n: ectx: property (text), widget (QCheckBox, transcoderWhenDifferent)
+#: po/rc.cpp:188 rc.cpp:188
+#, fuzzy
+msgid "Only transcode if source file is of a different format"
 msgstr ""
 "Realice la transcodificación solo si el fichero de origen tiene un formato "
 "distinto:"
 
-#. i18n: file: devices/filenameschemedialog.ui:29
+#. i18n: file: devices/filenameschemedialog.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:191 rc.cpp:191
 msgid "Example:"
 msgstr "Ejemplo:"
 
-#. i18n: file: devices/filenameschemedialog.ui:58
+#. i18n: file: devices/filenameschemedialog.ui:67
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:194 rc.cpp:194
 msgid "About filename schemes"
 msgstr "Acerca de esquemas de nombre de fichero"
 
-#. i18n: file: devices/filenameschemedialog.ui:70
+#. i18n: file: devices/filenameschemedialog.ui:79
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumArtist)
+#: po/rc.cpp:197 rc.cpp:197
+msgid ""
+"The artist of the album. For most albums, this will be the same as the "
+"<i>Track Artist.</i> For compilations, this will often be <i>Various Artists."
+"</i>"
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:82
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:200 rc.cpp:200
 msgid "Album Artist"
 msgstr "Artista del álbum"
 
-#. i18n: file: devices/filenameschemedialog.ui:77
+#. i18n: file: devices/filenameschemedialog.ui:89
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumTitle)
+#: po/rc.cpp:203 rc.cpp:203
+msgid "The name of the album."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:92
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:206 rc.cpp:206
 msgid "Album Title"
 msgstr "Nombre de álbum"
 
-#. i18n: file: devices/filenameschemedialog.ui:91
+#. i18n: file: devices/filenameschemedialog.ui:99
+#. i18n: ectx: property (toolTip), widget (QPushButton, composer)
+#: po/rc.cpp:209 rc.cpp:209
+msgid "The composer."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:109
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtist)
+#: po/rc.cpp:215 rc.cpp:215
+msgid "The artist of each track."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:112
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:218 rc.cpp:218
 msgid "Track Artist"
 msgstr "Artista de pista"
 
-#. i18n: file: devices/filenameschemedialog.ui:98
+#. i18n: file: devices/filenameschemedialog.ui:119
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackTitle)
+#: po/rc.cpp:221 rc.cpp:221
+msgid "The track title (without <i>Track Artist</i>)."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:122
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:224 rc.cpp:224
 msgid "Track Title"
 msgstr "Nombre de pista"
 
-#. i18n: file: devices/filenameschemedialog.ui:117
+#. i18n: file: devices/filenameschemedialog.ui:141
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtistAndTitle)
+#: po/rc.cpp:227 rc.cpp:227
+msgid ""
+"The track title (with <i>Track Artist</i>, if different to <i>Album Artist</"
+"i>)."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:144
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:230 rc.cpp:230
 msgid "Track Title (+Artist)"
 msgstr "Nombre de pista (+Artista)"
 
-#. i18n: file: devices/filenameschemedialog.ui:124
+#. i18n: file: devices/filenameschemedialog.ui:151
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackNo)
+#: po/rc.cpp:233 rc.cpp:233
+#, fuzzy
+msgid "The track number."
+msgstr "Número de pista:"
+
+#. i18n: file: devices/filenameschemedialog.ui:154
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:184 rc.cpp:184
+#: po/rc.cpp:236 rc.cpp:236
 msgid "Track #"
 msgstr "Núm. de pista"
 
-#. i18n: file: devices/filenameschemedialog.ui:131
+#. i18n: file: devices/filenameschemedialog.ui:161
+#. i18n: ectx: property (toolTip), widget (QPushButton, cdNo)
+#: po/rc.cpp:239 rc.cpp:239
+msgid ""
+"The album number of a multi-album album. Often compilations consist of "
+"several albums."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:164
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:187 rc.cpp:187
+#: po/rc.cpp:242 rc.cpp:242
 msgid "CD #"
 msgstr "Núm. de disco"
 
+#. i18n: file: devices/filenameschemedialog.ui:171
+#. i18n: ectx: property (toolTip), widget (QPushButton, year)
+#: po/rc.cpp:245 rc.cpp:245
+msgid "The year of the album's release."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:181
+#. i18n: ectx: property (toolTip), widget (QPushButton, genre)
+#: po/rc.cpp:251 rc.cpp:251
+msgid "The genre of the album."
+msgstr ""
+
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:196 rc.cpp:196
+#: po/rc.cpp:257 rc.cpp:257
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -4156,17 +4510,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
-#: po/rc.cpp:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
+#: po/rc.cpp:260 po/rc.cpp:353 po/rc.cpp:848 rc.cpp:260 rc.cpp:353 rc.cpp:848
 msgid "Type:"
 msgstr "Tipo:"
 
@@ -4178,14 +4532,16 @@ msgstr "Tipo:"
 #. i18n: ectx: property (text), widget (BuddyLabel, nameLabel)
 #. i18n: file: gui/serversettings.ui:63
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
-#: rc.cpp:638
+#: po/rc.cpp:263 po/rc.cpp:793 streams/streamdialog.cpp:71 rc.cpp:263
+#: rc.cpp:793
 msgid "Name:"
 msgstr "Nombre:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:205 rc.cpp:205
+#. i18n: file: gui/interfacesettings.ui:122
+#. i18n: ectx: property (title), widget (QGroupBox, optionsGroup)
+#: po/rc.cpp:266 rc.cpp:266 po/rc.cpp:551 rc.cpp:551
 msgid "Options"
 msgstr "Opciones"
 
@@ -4209,8 +4565,8 @@ msgstr "Opciones"
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: network/proxysettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPortLabel)
-#: po/rc.cpp:211 po/rc.cpp:250 po/rc.cpp:409 po/rc.cpp:644 po/rc.cpp:708
-#: rc.cpp:211 rc.cpp:250 rc.cpp:409 rc.cpp:644 rc.cpp:708
+#: po/rc.cpp:272 po/rc.cpp:311 po/rc.cpp:473 po/rc.cpp:799 po/rc.cpp:860
+#: rc.cpp:272 rc.cpp:311 rc.cpp:473 rc.cpp:799 rc.cpp:860
 msgid "Port:"
 msgstr "Puerto:"
 
@@ -4226,7 +4582,7 @@ msgstr "Puerto:"
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2x)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:322
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel)
-#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
+#: po/rc.cpp:275 po/rc.cpp:293 po/rc.cpp:314 rc.cpp:275 rc.cpp:293 rc.cpp:314
 msgid "User:"
 msgstr "Usuario:"
 
@@ -4238,7 +4594,7 @@ msgstr "Usuario:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:218
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2x)
-#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:278 po/rc.cpp:296 rc.cpp:278 rc.cpp:296
 msgid "Domain:"
 msgstr "Dominio:"
 
@@ -4250,7 +4606,7 @@ msgstr "Dominio:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:248
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2)
-#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
+#: po/rc.cpp:284 po/rc.cpp:302 rc.cpp:284 rc.cpp:302
 msgid "Share:"
 msgstr "Recurso compartido:"
 
@@ -4262,7 +4618,7 @@ msgstr "Recurso compartido:"
 #. i18n: ectx: property (text), widget (QLabel, label_4)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:263
 #. i18n: ectx: property (text), widget (QLabel, label_4x)
-#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
+#: po/rc.cpp:287 po/rc.cpp:305 rc.cpp:287 rc.cpp:305
 msgid ""
 "<i><b>NOTE:</b> If you enter a password here, it will be stored "
 "<b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the "
@@ -4275,7 +4631,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:229 rc.cpp:229
+#: po/rc.cpp:290 rc.cpp:290
 msgid "Service name:"
 msgstr "Nombre del servicio:"
 
@@ -4287,19 +4643,19 @@ msgstr "Nombre del servicio:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:390
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
+#: po/rc.cpp:317 po/rc.cpp:326 rc.cpp:317 rc.cpp:326
 msgid "Folder:"
 msgstr "Directorio:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:259 rc.cpp:259
+#: po/rc.cpp:320 rc.cpp:320
 msgid "Extra Options:"
 msgstr "Opciones adicionales:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:323 rc.cpp:323
 msgid ""
 "<i><b>NOTE:</b> Due to the way sshfs works, a suitable ssh-askpass "
 "application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter "
@@ -4311,7 +4667,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:329 rc.cpp:329
 msgid ""
 "<i><b>NOTE:</b> This dialog is only used to add remote devices (e.g. via "
 "Samba), or to access locally mounted folders. For normal media players, "
@@ -4325,113 +4681,101 @@ msgstr ""
 
 #. i18n: file: dynamic/dynamicpage.ui:26
 #. i18n: ectx: property (text), widget (StatusLabel, infoLabel)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:332 rc.cpp:332
 msgid "No dynamizer port defined in server settings."
 msgstr ""
 "No se ha definido un puerto de dinamizador en la configuración del servidor."
 
 #. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:274 rc.cpp:274
+#: po/rc.cpp:335 rc.cpp:335
 msgid "Remote dynamizer is not running."
 msgstr "El dinamizador remoto no está activo."
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:277 rc.cpp:277
+#: po/rc.cpp:338 rc.cpp:338
 msgid "Name of Dynamic Rules"
 msgstr "Nombre de las normas dinámicas"
 
 #. i18n: file: dynamic/dynamicrules.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, editBtn)
-#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
+#: po/rc.cpp:344 streams/streamspage.cpp:62 rc.cpp:344
 msgid "Edit"
 msgstr "Editar"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:350 rc.cpp:350
 msgid "About Rules"
 msgstr "Acerca de las normas"
 
-#. i18n: file: dynamic/dynamicrule.ui:38
+#. i18n: file: dynamic/dynamicrule.ui:37
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:356 rc.cpp:356
+msgid "Include songs that match the following:"
+msgstr "Incluir las canciones que coinciden con lo siguiente:"
+
+#. i18n: file: dynamic/dynamicrule.ui:42
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:359 rc.cpp:359
+msgid "Exclude songs that match the following:"
+msgstr "Excluir las canciones que coinciden con lo siguiente:"
+
+#. i18n: file: dynamic/dynamicrule.ui:63
+#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
+#: po/rc.cpp:365 rc.cpp:365
+msgid "Artists similar to:"
+msgstr "Artistas similares a:"
+
+#. i18n: file: dynamic/dynamicrule.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:295 rc.cpp:295
+#: po/rc.cpp:368 rc.cpp:368
 msgid "Album Artist:"
 msgstr "Artista del álbum:"
 
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
-msgid "Album:"
-msgstr "Álbum:"
-
-#. i18n: file: dynamic/dynamicrule.ui:103
+#. i18n: file: dynamic/dynamicrule.ui:141
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:310 rc.cpp:310
+#: po/rc.cpp:383 rc.cpp:383
 msgid "From Year:"
 msgstr "Del año:"
 
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#: po/rc.cpp:386 po/rc.cpp:392 rc.cpp:386 rc.cpp:392
 msgid "Any"
 msgstr "Todo"
 
-#. i18n: file: dynamic/dynamicrule.ui:126
+#. i18n: file: dynamic/dynamicrule.ui:164
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:316 rc.cpp:316
+#: po/rc.cpp:389 rc.cpp:389
 msgid "To Year:"
-msgstr "Al año:"
-
-#. i18n: file: dynamic/dynamicrule.ui:149
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:322 rc.cpp:322
-msgid "Exact match:"
-msgstr "Coincidencia exacta:"
-
-#. i18n: file: dynamic/dynamicrule.ui:173
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:328 rc.cpp:328
-msgid "Include songs that match the following:"
-msgstr "Incluir las canciones que coinciden con lo siguiente:"
-
-#. i18n: file: dynamic/dynamicrule.ui:178
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:331 rc.cpp:331
-msgid "Exclude songs that match the following:"
-msgstr "Excluir las canciones que coinciden con lo siguiente:"
+msgstr "Al año:"
 
-#. i18n: file: dynamic/dynamicrule.ui:186
-#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:334 rc.cpp:334
-msgid "Artists similar to:"
-msgstr "Artistas similares a:"
+#. i18n: file: dynamic/dynamicrule.ui:187
+#. i18n: ectx: property (text), widget (QCheckBox, exactCheck)
+#: po/rc.cpp:395 rc.cpp:395
+msgid "Exact match"
+msgstr "Coincidencia exacta"
 
-#. i18n: file: dynamic/dynamicrule.ui:236
+#. i18n: file: dynamic/dynamicrule.ui:231
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:337 rc.cpp:337
+#: po/rc.cpp:398 rc.cpp:398
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
 "<i><b>NOTA</b> Introduzca valores sólo para las etiquetas en las que desea "
 "buscar. </i>"
 
-#. i18n: file: dynamic/dynamicrule.ui:262
+#. i18n: file: dynamic/dynamicrule.ui:260
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:340 rc.cpp:340
+#: po/rc.cpp:401 rc.cpp:401
 msgid ""
 "<i><b>NOTE</b> For genre, end string with an asterisk to match various "
 "genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. </i>"
@@ -4440,70 +4784,63 @@ msgstr ""
 "que coincida con otros géneros. Por ejemplo, 'rock*' coincide con 'Hard "
 "Rock' y 'Rock and Roll'. </i>"
 
-#. i18n: file: gui/coverdialog.ui:23
-#. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:343 rc.cpp:343
-msgid "<html><head/><body><p>Cancel current query</p></body></html>"
-msgstr "<html><head/><body><p>Cancelar consulta actual</p></body></html>"
-
-#. i18n: file: gui/coverdialog.ui:37
+#. i18n: file: gui/coverdialog.ui:30
 #. i18n: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:349 rc.cpp:349
-msgid "<html><head/><body><p>Add a local file</p></body></html>"
-msgstr "<html><head/><body><p>Añadir un fichero local</p></body></html>"
-
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:352 po/rc.cpp:442 rc.cpp:352 rc.cpp:442
-msgid "Save downloaded covers in music folder:"
-msgstr "Guardar portadas descargadas en el directorio de música:"
-
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:355 po/rc.cpp:445 rc.cpp:355 rc.cpp:445
-msgid "Save downloaded lyrics in music folder:"
-msgstr "Guardar letras descargadas en el directorio de música:"
-
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#: po/rc.cpp:358 po/rc.cpp:448 rc.cpp:358 rc.cpp:448
-#, fuzzy
-msgid "Save downloaded backdrops in music folder:"
-msgstr "Guardar portadas descargadas en el directorio de música:"
-
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:361 po/rc.cpp:451 rc.cpp:361 rc.cpp:451
-msgid "Save list of favorite streams in music folder:"
-msgstr "Guardar la lista de flujos favoritos en el directorio de música:"
-
-#. i18n: file: gui/filesettings.ui:110
+#: po/rc.cpp:407 rc.cpp:407
+msgid "Add a local file"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#: po/rc.cpp:413 po/rc.cpp:506 rc.cpp:413 rc.cpp:506
+msgid "Save downloaded covers in music folder"
+msgstr "Guardar portadas descargadas en el directorio de música"
+
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#: po/rc.cpp:416 po/rc.cpp:509 rc.cpp:416 rc.cpp:509
+msgid "Save downloaded lyrics in music folder"
+msgstr "Guardar letras descargadas en el directorio de música"
+
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#: po/rc.cpp:419 po/rc.cpp:512 rc.cpp:419 rc.cpp:512
+msgid "Save downloaded backdrops in music folder"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#: po/rc.cpp:422 po/rc.cpp:515 rc.cpp:422 rc.cpp:515
+msgid "Save list of favorite streams in music folder"
+msgstr "Guardar la lista de flujos favoritos en el directorio de música"
+
+#. i18n: file: gui/filesettings.ui:79
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:425 rc.cpp:425
 #, fuzzy
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, lyrics, or "
@@ -4524,9 +4861,18 @@ msgstr ""
 "no almacenar los flujos en la carpeta de música, entonces se almacenan en la "
 "carpeta de configuración personal del personal, solo accesible por éste.</i>"
 
-#. i18n: file: gui/filesettings.ui:145
+#. i18n: file: gui/filesettings.ui:108
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:428 rc.cpp:428
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. (i.e. 'Artist/Album/Tracks')"
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:140
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:431 rc.cpp:431
 msgid ""
 "<i><b>NOTE:</b> If you change the location where streams are stored (i.e. "
 "you toggle the 'Save list of favorite streams in music folder' option), then "
@@ -4544,19 +4890,19 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:370 rc.cpp:370
+#: po/rc.cpp:434 rc.cpp:434
 msgid "Cantata First Run"
 msgstr "Primera ejecución de Cantata"
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:373 rc.cpp:373
+#: po/rc.cpp:437 rc.cpp:437
 msgid "Welcome to Cantata"
 msgstr "Bienvenido a Cantata"
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:440 rc.cpp:440
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4576,13 +4922,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:379 rc.cpp:379
+#: po/rc.cpp:443 rc.cpp:443
 msgid "<html><head/><body><p>Welcome to Cantata</p></body></html>"
 msgstr "<html><head/><body><p>Bienvenido a Cantata</p></body></html>"
 
 #. i18n: file: gui/initialsettingswizard.ui:128
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:382 rc.cpp:382
+#: po/rc.cpp:446 rc.cpp:446
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4598,13 +4944,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:166
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:385 rc.cpp:385
+#: po/rc.cpp:449 rc.cpp:449
 msgid "Standard multi-user/server setup"
 msgstr "Configuración estándar para varios usuarios/servidores"
 
 #. i18n: file: gui/initialsettingswizard.ui:179
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:388 rc.cpp:388
+#: po/rc.cpp:452 rc.cpp:452
 msgid ""
 "<i>Select this option if your music collection is shared between users, your "
 "MPD instance is running on another machine, or you already have a personal "
@@ -4620,13 +4966,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:211
 #. i18n: ectx: property (text), widget (QRadioButton, basic)
-#: po/rc.cpp:391 rc.cpp:391
+#: po/rc.cpp:455 rc.cpp:455
 msgid "Basic single user setup"
 msgstr "Configuración básica para un usuario"
 
 #. i18n: file: gui/initialsettingswizard.ui:224
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
-#: po/rc.cpp:394 rc.cpp:394
+#: po/rc.cpp:458 rc.cpp:458
 msgid ""
 "<i>Select this option if your music collection is not shared with others, "
 "and you wish Cantata to configure and control the MPD instance.</i>"
@@ -4636,7 +4982,7 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:397 rc.cpp:397
+#: po/rc.cpp:461 rc.cpp:461
 msgid ""
 "<html><head/><body><p>For more information on MPD itself, please refer to "
 "the MPD website <a href=\"http://www.musicpd.org\"><span style=\" text-"
@@ -4652,13 +4998,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:400 rc.cpp:400
+#: po/rc.cpp:464 rc.cpp:464
 msgid "Connection details"
 msgstr "Detalles de conexión"
 
 #. i18n: file: gui/initialsettingswizard.ui:341
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:403 rc.cpp:403
+#: po/rc.cpp:467 rc.cpp:467
 msgid ""
 "The settings below are the basic settings required by Cantata. Please enter "
 "the relevant details, and use the 'Connect' button to test the connection."
@@ -4675,16 +5021,18 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: gui/serversettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
-#: po/rc.cpp:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
+#: po/rc.cpp:470 po/rc.cpp:796 rc.cpp:470 rc.cpp:796
 msgid "Host (or local socket):"
 msgstr "Host (o socket local):"
 
 #. i18n: file: gui/initialsettingswizard.ui:494
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:421 rc.cpp:421
+#: po/rc.cpp:485 rc.cpp:485
+#, fuzzy
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
-"lyrics, etc.</i>"
+"lyrics, etc. If you're MPD instance is on a remote host, you may set this to "
+"a HTTP URL.</i>"
 msgstr ""
 "<i><b>NOTE:</b> El ajuste «Directorio de música» se utiliza para buscar "
 "portadas, letras y otros.</i>"
@@ -4697,7 +5045,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
 #. i18n: file: gui/serversettings.ui:225
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#: po/rc.cpp:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
+#: po/rc.cpp:488 po/rc.cpp:820 rc.cpp:488 rc.cpp:820
 msgid ""
 "<i><b>NOTE:</b> When using a local socket the full absolute path to the "
 "socket needs to be set. (Port number is not required.)</i>"
@@ -4707,25 +5055,25 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:553
 #. i18n: ectx: property (text), widget (QLabel, label_13)
-#: po/rc.cpp:427 rc.cpp:427
+#: po/rc.cpp:491 rc.cpp:491
 msgid "Music folder"
 msgstr "Directorio de música"
 
 #. i18n: file: gui/initialsettingswizard.ui:576
 #. i18n: ectx: property (text), widget (QLabel, label_12)
-#: po/rc.cpp:430 rc.cpp:430
+#: po/rc.cpp:494 rc.cpp:494
 msgid "Please choose the folder containing your music collection."
 msgstr "Seleccione la carpeta que contiene su colección de música."
 
 #. i18n: file: gui/initialsettingswizard.ui:662
 #. i18n: ectx: property (text), widget (QLabel, label_6f)
-#: po/rc.cpp:436 rc.cpp:436
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Covers, Lyrics, and Streams"
 msgstr "Portadas, letras y flujos"
 
 #. i18n: file: gui/initialsettingswizard.ui:685
 #. i18n: ectx: property (text), widget (QLabel, label_5f)
-#: po/rc.cpp:439 rc.cpp:439
+#: po/rc.cpp:503 rc.cpp:503
 msgid ""
 "<p>Cantata will download missing covers, and lyrics, from the internet. "
 "Cantata also allows you to save a list of internet streams (e.g. Radio "
@@ -4740,9 +5088,9 @@ msgstr ""
 "dentro del directorio de músico, o dentro de las carpetas de usuario «cache/"
 "config».</p>"
 
-#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: file: gui/initialsettingswizard.ui:758
 #. i18n: ectx: property (text), widget (QLabel, persNote)
-#: po/rc.cpp:454 rc.cpp:454
+#: po/rc.cpp:518 rc.cpp:518
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
 "the music folder, and you do not have write access to this folder, then "
@@ -4762,28 +5110,38 @@ msgstr ""
 "no almacenar los flujos en la carpeta de música, entonces se almacenan en la "
 "carpeta de configuración personal del personal, solo accesible por éste.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:824
-#. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:457 rc.cpp:457
+#. i18n: file: gui/initialsettingswizard.ui:784
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:521 rc.cpp:521
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. i.e. 'Artist/Album/Tracks'."
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/initialsettingswizard.ui:810
+#. i18n: ectx: property (text), widget (StateLabel, httpNote)
+#: po/rc.cpp:524 rc.cpp:524
+#, fuzzy
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata "
 "currently cannot upload files to external HTTP servers. Therefore, the above "
-"settings should be left disabled.</i>"
+"settings should be left un-checked.</i>"
 msgstr ""
 "<i><b>NOTA:</b> «Directorio de música» se ha definido como una dirección "
 "HTTP, y actualmente Cantata no puede enviar ficheros a servidores HTTP "
 "externos. Por ello, los ajustes en la parte superior se deben dejar "
 "desactivados.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:857
+#. i18n: file: gui/initialsettingswizard.ui:843
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:460 rc.cpp:460
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Finished!"
 msgstr "Finalizado"
 
-#. i18n: file: gui/initialsettingswizard.ui:880
+#. i18n: file: gui/initialsettingswizard.ui:866
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:463 rc.cpp:463
+#: po/rc.cpp:530 rc.cpp:530
 msgid ""
 "Cantata is now configured! If you wish to further configure Cantata (to add "
 "extra MPD hosts, etc) then Canta's configuration dialog may be accessed from "
@@ -4794,9 +5152,9 @@ msgstr ""
 "configuración de Cantata mediante el menú que muestra el botón en la parte "
 "superior derecha de la ventana principal de Cantata."
 
-#. i18n: file: gui/initialsettingswizard.ui:918
+#. i18n: file: gui/initialsettingswizard.ui:904
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:466 rc.cpp:466
+#: po/rc.cpp:533 rc.cpp:533
 msgid ""
 "<b>Warning:</b> You are not currently a member of the 'users' group. Cantata "
 "will function better (saving of album covers, lyrics, etc. with the correct "
@@ -4809,40 +5167,106 @@ msgstr ""
 "si Ud. o el administrador incluyen al usuario en el grupo. Si añade su "
 "propio usuario tendrá que reiniciar la sesión para que tenga efecto."
 
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:36
+#. i18n: ectx: attribute (title), widget (QWidget, sidebarTab)
+#: po/rc.cpp:536 rc.cpp:536
+#, fuzzy
+msgid "Sidebar"
+msgstr "Barra lateral grande"
+
+#. i18n: file: gui/interfacesettings.ui:42
+#. i18n: ectx: property (title), widget (QGroupBox, viewsGroup)
+#: po/rc.cpp:539 rc.cpp:539
+msgid "Views"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:48
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:542 rc.cpp:542
+msgid "Use the checkboxes below to configure the list of active views."
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, sbPlayQueueLabel)
+#: po/rc.cpp:545 rc.cpp:545
+msgid ""
+"<i><b>NOTE:</b> By default, the play queue appears to the side of the other "
+"views. If you enable the option above, then it will be merged into the "
+"sidebar as per other views.</i>"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:106
+#. i18n: ectx: property (text), widget (StateLabel, sbInfoLabel)
+#: po/rc.cpp:548 rc.cpp:548
+msgid ""
+"<i><b>NOTE:</b> By default, the 'Info' (current song information) view is "
+"accessible by pressing its icon in the main toolbar. If you enable the "
+"option above, then it will be merged into the sidebar as per other views.</i>"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:144
+#. i18n: ectx: property (text), widget (BuddyLabel, sbPositionLabel)
+#: po/rc.cpp:557 rc.cpp:557
+#, fuzzy
+msgid "Position:"
+msgstr "Colección:"
+
+#. i18n: file: gui/interfacesettings.ui:157
+#. i18n: ectx: property (text), widget (QCheckBox, sbIconsOnly)
+#: po/rc.cpp:560 rc.cpp:560
+#, fuzzy
+msgid "Only show icons, no text"
+msgstr "Mostrar solo el texto básico de Wikipedia"
+
+#. i18n: file: gui/interfacesettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, sbMonoIcons)
+#: po/rc.cpp:563 rc.cpp:563
+#, fuzzy
+msgid "Use monochrome icons"
+msgstr "Iconos monocromos"
+
+#. i18n: file: gui/interfacesettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, sbAutoHide)
+#: po/rc.cpp:566 rc.cpp:566
+#, fuzzy
+msgid "Auto-hide"
+msgstr "Ocultar automáticamente"
+
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#: po/rc.cpp:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
+#: po/rc.cpp:575 po/rc.cpp:594 rc.cpp:575 rc.cpp:594
 msgid "Covers:"
 msgstr "Carátulas:"
 
-#. i18n: file: gui/interfacesettings.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:478 rc.cpp:478
-msgid "Show artist images:"
+#. i18n: file: gui/interfacesettings.ui:219
+#. i18n: ectx: property (text), widget (QCheckBox, libraryArtistImage)
+#: po/rc.cpp:578 rc.cpp:578
+#, fuzzy
+msgid "Show artist images"
 msgstr "Mostrar imágenes de artista:"
 
-#. i18n: file: gui/interfacesettings.ui:81
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:481 rc.cpp:481
-msgid "Show album year:"
+#. i18n: file: gui/interfacesettings.ui:226
+#. i18n: ectx: property (text), widget (QCheckBox, libraryYear)
+#: po/rc.cpp:581 rc.cpp:581
+#, fuzzy
+msgid "Show album year"
 msgstr "Mostrar año de publicación:"
 
-#. i18n: file: gui/interfacesettings.ui:123
+#. i18n: file: gui/interfacesettings.ui:258
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:484 rc.cpp:484
+#: po/rc.cpp:584 rc.cpp:584
+#, fuzzy
 msgid ""
 "<i><b>NOTE:</b> When looking for artist images, Cantata will look for either "
 "artist.jpg, artist.png, 'Artist'.jpg, or 'Artist'.png,\n"
 "within the folder of the current track, or within its parent folder. If no "
-"image is found, Cantata will attempt to download one. When the image is "
-"displayed, it will be cropped (either top/bottom, or left/right) to provide "
-"a square image.</i>"
+"image is found, Cantata will attempt to download one.</i>"
 msgstr ""
 "<i><b>NOTA:</b> Durante la búsqueda de imágenes de artista, Cantata busca "
 "ficheros «artista.jpg», «artista.png», «Artista».jpg, o «Artista».png,\n"
@@ -4851,166 +5275,214 @@ msgstr ""
 "imagen, se recorta (bien la altura o el ancho) para proporcionar una imagen "
 "cuadrada.</i>"
 
-#. i18n: file: gui/interfacesettings.ui:172
+#. i18n: file: gui/interfacesettings.ui:307
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:497 rc.cpp:497
+#: po/rc.cpp:597 rc.cpp:597
 msgid "Sort albums:"
 msgstr "Organizar álbumes:"
 
-#. i18n: file: gui/interfacesettings.ui:183
+#. i18n: file: gui/interfacesettings.ui:318
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:500 rc.cpp:500
+#: po/rc.cpp:600 rc.cpp:600
 msgid "Album/Artist"
 msgstr "Álbum/Artista"
 
-#. i18n: file: gui/interfacesettings.ui:188
+#. i18n: file: gui/interfacesettings.ui:323
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:503 rc.cpp:503
+#: po/rc.cpp:603 rc.cpp:603
 msgid "Artist/Album"
 msgstr "Artista/Álbum"
 
-#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: file: gui/interfacesettings.ui:328
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:506 rc.cpp:506
+#: po/rc.cpp:606 rc.cpp:606
 msgid "Artist/Year/Album"
 msgstr "Artista/Año/Álbum"
 
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#: po/rc.cpp:515 po/rc.cpp:545 rc.cpp:515 rc.cpp:545
-msgid "Initially collapse albums:"
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#: po/rc.cpp:615 po/rc.cpp:645 rc.cpp:615 rc.cpp:645
+#, fuzzy
+msgid "Initially collapse albums"
 msgstr "Colapsar álbumes en el inicio:"
 
-#. i18n: file: gui/interfacesettings.ui:242
+#. i18n: file: gui/interfacesettings.ui:367
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:518 rc.cpp:518
+#: po/rc.cpp:618 rc.cpp:618
 msgid "Other Views"
 msgstr "Otras vistas"
 
-#. i18n: file: gui/interfacesettings.ui:251
+#. i18n: file: gui/interfacesettings.ui:376
 #. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
-#: po/rc.cpp:521 rc.cpp:521
+#: po/rc.cpp:621 rc.cpp:621
 msgid "Folder view style:"
 msgstr "Estilo de vista de directorios:"
 
-#. i18n: file: gui/interfacesettings.ui:264
+#. i18n: file: gui/interfacesettings.ui:389
 #. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
-#: po/rc.cpp:524 rc.cpp:524
+#: po/rc.cpp:624 rc.cpp:624
 msgid "Streams view style:"
 msgstr "Estilo de vista de flujos:"
 
-#. i18n: file: gui/interfacesettings.ui:277
+#. i18n: file: gui/interfacesettings.ui:402
 #. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
-#: po/rc.cpp:527 rc.cpp:527
+#: po/rc.cpp:627 rc.cpp:627
 msgid "Online view style:"
 msgstr "Estilo de vista online:"
 
-#. i18n: file: gui/interfacesettings.ui:290
+#. i18n: file: gui/interfacesettings.ui:415
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:530 rc.cpp:530
+#: po/rc.cpp:630 rc.cpp:630
 msgid "Devices view style:"
 msgstr "Estilo de vista de dispositivos:"
 
-#. i18n: file: gui/interfacesettings.ui:324
-#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:539 rc.cpp:539
-msgid "Table"
-msgstr "Tabla"
-
-#. i18n: file: gui/interfacesettings.ui:354
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueAutoExpandLabel)
-#: po/rc.cpp:548 rc.cpp:548
-msgid "Automatically expand current album:"
+#. i18n: file: gui/interfacesettings.ui:469
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueAutoExpand)
+#: po/rc.cpp:648 rc.cpp:648
+#, fuzzy
+msgid "Automatically expand current album"
 msgstr "Expandir automáticamente el álbum actual:"
 
-#. i18n: file: gui/interfacesettings.ui:371
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueScrollLabel)
-#: po/rc.cpp:551 rc.cpp:551
-msgid "Scroll to current track:"
+#. i18n: file: gui/interfacesettings.ui:476
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueScroll)
+#: po/rc.cpp:651 rc.cpp:651
+#, fuzzy
+msgid "Scroll to current track"
 msgstr "Desplazar a pista actual:"
 
-#. i18n: file: gui/interfacesettings.ui:384
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueBackgroundLabel)
-#: po/rc.cpp:554 rc.cpp:554
-msgid "Use current album cover as background:"
-msgstr "Utilizar la carátula de álbum actual como fondo:"
-
-#. i18n: file: gui/interfacesettings.ui:397
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueConfirmClearLabel)
-#: po/rc.cpp:557 rc.cpp:557
-msgid "Prompt before clearing:"
+#. i18n: file: gui/interfacesettings.ui:483
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueConfirmClear)
+#: po/rc.cpp:654 rc.cpp:654
+msgid "Prompt before clearing"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:411
+#. i18n: file: gui/interfacesettings.ui:509
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_cover)
+#: po/rc.cpp:663 rc.cpp:663
+#, fuzzy
+msgid "Current album cover"
+msgstr "Copiar carátulas de álbum como:"
+
+#. i18n: file: gui/interfacesettings.ui:638
 #. i18n: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:560 rc.cpp:560
+#: po/rc.cpp:682 rc.cpp:682
 msgid "External"
 msgstr "Externo"
 
-#. i18n: file: gui/interfacesettings.ui:417
-#. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:563 rc.cpp:563
-msgid "Show icon in notification area:"
+#. i18n: file: gui/interfacesettings.ui:644
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayPopup)
+#: po/rc.cpp:685 rc.cpp:685
+#, fuzzy
+msgid "Show popup messages when changing tracks"
+msgstr "Mostrar mensajes emergentes al cambiar de pista:"
+
+#. i18n: file: gui/interfacesettings.ui:654
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayCheckBox)
+#: po/rc.cpp:688 rc.cpp:688
+#, fuzzy
+msgid "Show icon in notification area"
 msgstr "Mostrar icono en el área de notificación:"
 
-#. i18n: file: gui/interfacesettings.ui:437
-#. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:566 rc.cpp:566
-msgid "Minimize to notification area when closed:"
+#. i18n: file: gui/interfacesettings.ui:664
+#. i18n: ectx: property (text), widget (QCheckBox, minimiseOnClose)
+#: po/rc.cpp:691 rc.cpp:691
+#, fuzzy
+msgid "Minimize to notification area when closed"
 msgstr "Minimizar al área de notificación cuando está cerrado:"
 
-#. i18n: file: gui/interfacesettings.ui:457
-#. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:569 rc.cpp:569
-msgid "Show popup messages when changing tracks:"
-msgstr "Mostrar mensajes emergentes al cambiar de pista:"
+#. i18n: file: gui/interfacesettings.ui:671
+#. i18n: ectx: property (title), widget (QGroupBox, startupState)
+#: po/rc.cpp:694 rc.cpp:694
+msgid "On Start-up"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:677
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateShow)
+#: po/rc.cpp:697 rc.cpp:697
+#, fuzzy
+msgid "Show main window"
+msgstr "Mostrar ventana"
+
+#. i18n: file: gui/interfacesettings.ui:684
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateHide)
+#: po/rc.cpp:700 rc.cpp:700
+msgid "Hide main window"
+msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:475
+#. i18n: file: gui/interfacesettings.ui:691
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateRestore)
+#: po/rc.cpp:703 rc.cpp:703
+msgid "Restore previous state"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:715
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:572 rc.cpp:572
+#: po/rc.cpp:706 rc.cpp:706
 msgid "General"
 msgstr "General"
 
-#. i18n: file: gui/interfacesettings.ui:486
-#. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:575 rc.cpp:575
-msgid "Group single track albums:"
+#. i18n: file: gui/interfacesettings.ui:726
+#. i18n: ectx: property (text), widget (QCheckBox, groupSingle)
+#: po/rc.cpp:709 rc.cpp:709
+#, fuzzy
+msgid "Group single track albums"
 msgstr "Agrupar álbumes de pista única:"
 
-#. i18n: file: gui/interfacesettings.ui:503
-#. i18n: ectx: property (text), widget (BuddyLabel, useComposerLabel)
-#: po/rc.cpp:578 rc.cpp:578
+#. i18n: file: gui/interfacesettings.ui:733
+#. i18n: ectx: property (text), widget (QCheckBox, useComposer)
+#: po/rc.cpp:712 rc.cpp:712
 #, fuzzy
-msgid "Group albums by composer:"
+msgid "Group albums by composer"
 msgstr "Copiar carátulas de álbum como:"
 
-#. i18n: file: gui/interfacesettings.ui:520
-#. i18n: ectx: property (text), widget (BuddyLabel, groupMultipleLabel)
-#: po/rc.cpp:581 rc.cpp:581
-msgid "Multiple artist albums:"
-msgstr "Álbumes de varios artistas:"
+#. i18n: file: gui/interfacesettings.ui:740
+#. i18n: ectx: property (text), widget (QCheckBox, groupMultiple)
+#: po/rc.cpp:715 rc.cpp:715
+#, fuzzy
+msgid "Group multiple artist albums under 'Various Artists'"
+msgstr "Agrupado bajo «Varios artistas»"
 
-#. i18n: file: gui/interfacesettings.ui:533
-#. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:584 rc.cpp:584
-msgid "Show delete action in context menus:"
+#. i18n: file: gui/interfacesettings.ui:747
+#. i18n: ectx: property (text), widget (QCheckBox, fetchCovers)
+#: po/rc.cpp:718 rc.cpp:718
+msgid "Fetch missing covers from Last.fm"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:754
+#. i18n: ectx: property (text), widget (QCheckBox, cacheScaledCovers)
+#: po/rc.cpp:721 rc.cpp:721
+msgid "Cache scaled covers"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:761
+#. i18n: ectx: property (text), widget (QCheckBox, showDeleteAction)
+#: po/rc.cpp:724 rc.cpp:724
+#, fuzzy
+msgid "Show delete action in context menus"
 msgstr "Mostrar la acción de eliminar en el menú contextual:"
 
-#. i18n: file: gui/interfacesettings.ui:550
-#. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:587 rc.cpp:587
-msgid "Enforce single-click activation of items:"
+#. i18n: file: gui/interfacesettings.ui:768
+#. i18n: ectx: property (text), widget (QCheckBox, forceSingleClick)
+#: po/rc.cpp:727 rc.cpp:727
+#, fuzzy
+msgid "Enforce single-click activation of items"
 msgstr "Forzar la activación de elementos con un solo clic:"
 
-#. i18n: file: gui/interfacesettings.ui:591
+#. i18n: file: gui/interfacesettings.ui:775
+#. i18n: ectx: property (text), widget (BuddyLabel, langLabel)
+#: po/rc.cpp:730 rc.cpp:730
+msgid "Language:"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:806
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:590 rc.cpp:590
+#: po/rc.cpp:733 rc.cpp:733
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
@@ -5018,75 +5490,56 @@ msgstr ""
 "<i><b>NOTA:</b> Cantata requiere reiniciar si se modifica la opción «Forzar "
 "la activación de elementos con un solo clic».</i>"
 
-#. i18n: file: gui/mainwindow.ui:287
+#. i18n: file: gui/interfacesettings.ui:835
+#. i18n: ectx: property (text), widget (StateLabel, langNoteLabel)
+#: po/rc.cpp:736 rc.cpp:736
+#, fuzzy
+msgid ""
+"<i><b>NOTE:</b> Changing the language setting will require a re-start of "
+"Cantata.</i>"
+msgstr ""
+"<i><b>NOTA:</b> Cantata requiere reiniciar si se modifica la opción «Forzar "
+"la activación de elementos con un solo clic».</i>"
+
+#. i18n: file: gui/mainwindow.ui:298
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:593 rc.cpp:593
+#: po/rc.cpp:739 rc.cpp:739
 msgid "[Dynamic]"
 msgstr "[Dinámico]"
 
-#. i18n: file: gui/playbacksettings.ui:20
-#. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:596 rc.cpp:596
-msgid "Output"
-msgstr "Salida"
-
-#. i18n: file: gui/playbacksettings.ui:41
-#. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:602 rc.cpp:602
-msgid "Crossfading:"
-msgstr "Atenuación cruzada:"
-
-#. i18n: file: gui/playbacksettings.ui:51
-#. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:605 rc.cpp:605
-msgid " seconds"
-msgstr " segundos"
-
-#. i18n: file: gui/playbacksettings.ui:61
-#. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:608 rc.cpp:608
-msgid "Replay gain:"
-msgstr "Ganancia de reproducción:"
-
-#. i18n: file: gui/playbacksettings.ui:95
-#. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:611 rc.cpp:611
-msgid "About replay gain"
-msgstr "Acerca de la ganancia de reproducción"
-
-#. i18n: file: gui/playbacksettings.ui:104
-#. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:614 rc.cpp:614
-msgid "Devices:"
-msgstr "Dispositivos:"
-
-#. i18n: file: gui/playbacksettings.ui:141
+#. i18n: file: gui/playbacksettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:620 rc.cpp:620
+#: po/rc.cpp:745 rc.cpp:745
 msgid "Fadeout on stop:"
 msgstr "Desvanecimiento progresivo de audio al detener:"
 
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:623 rc.cpp:623
-msgid "Stop playback on exit:"
-msgstr "Detener reproducción al cerrar:"
+#. i18n: file: gui/playbacksettings.ui:48
+#. i18n: ectx: property (suffix), widget (QSpinBox, stopFadeDuration)
+#: po/rc.cpp:748 rc.cpp:748
+msgid " ms"
+msgstr " ms"
+
+#. i18n: file: gui/playbacksettings.ui:58
+#. i18n: ectx: property (text), widget (QCheckBox, stopOnExit)
+#: po/rc.cpp:754 rc.cpp:754
+msgid "Stop playback on exit"
+msgstr "Detener reproducción al cerrar"
 
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:626 rc.cpp:626
-msgid "Stop dynamizer on exit:"
-msgstr "Detener el modo dinámico al cerrar:"
+#. i18n: file: gui/playbacksettings.ui:65
+#. i18n: ectx: property (text), widget (QCheckBox, stopDynamizerOnExit)
+#: po/rc.cpp:757 rc.cpp:757
+msgid "Stop dynamizer on exit"
+msgstr "Detener el modo dinámico al cerrar"
 
-#. i18n: file: gui/playbacksettings.ui:184
-#. i18n: ectx: property (text), widget (BuddyLabel, inhibitSuspendLabel)
-#: po/rc.cpp:629 rc.cpp:629
-msgid "Inhibit suspend whilst playing:"
+#. i18n: file: gui/playbacksettings.ui:72
+#. i18n: ectx: property (text), widget (QCheckBox, inhibitSuspend)
+#: po/rc.cpp:760 rc.cpp:760
+msgid "Inhibit suspend whilst playing"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:217
+#. i18n: file: gui/playbacksettings.ui:95
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:632 rc.cpp:632
+#: po/rc.cpp:763 rc.cpp:763
 msgid ""
 "<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
 "shown allowing you to choose whether to stop playback now, or after the "
@@ -5096,9 +5549,46 @@ msgstr ""
 "que permite seleccionar si detener la reproducción inmediatamente o después "
 "de la pista actual.</i>"
 
+#. i18n: file: gui/playbacksettings.ui:108
+#. i18n: ectx: property (title), widget (QGroupBox, outputBox)
+#: po/rc.cpp:766 rc.cpp:766
+msgid "Output"
+msgstr "Salida"
+
+#. i18n: file: gui/playbacksettings.ui:129
+#. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
+#: po/rc.cpp:772 rc.cpp:772
+msgid "Crossfade between tracks:"
+msgstr ""
+
+#. i18n: file: gui/playbacksettings.ui:139
+#. i18n: ectx: property (suffix), widget (QSpinBox, crossfading)
+#: po/rc.cpp:775 rc.cpp:775
+#, fuzzy
+msgid " s"
+msgstr " ms"
+
+#. i18n: file: gui/playbacksettings.ui:152
+#. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
+#: po/rc.cpp:781 rc.cpp:781
+msgid "Replay gain:"
+msgstr "Ganancia de reproducción:"
+
+#. i18n: file: gui/playbacksettings.ui:195
+#. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
+#: po/rc.cpp:784 rc.cpp:784
+msgid "About replay gain"
+msgstr "Acerca de la ganancia de reproducción"
+
+#. i18n: file: gui/playbacksettings.ui:204
+#. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
+#: po/rc.cpp:787 rc.cpp:787
+msgid "Use the checkboxes below to control the active outputs."
+msgstr ""
+
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:635 rc.cpp:635
+#: po/rc.cpp:790 rc.cpp:790
 msgid "Collection:"
 msgstr "Colección:"
 
@@ -5110,26 +5600,26 @@ msgstr "Colección:"
 #. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
 #. i18n: file: gui/serversettings.ui:338
 #. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
-#: po/rc.cpp:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
+#: po/rc.cpp:808 po/rc.cpp:829 rc.cpp:808 rc.cpp:829
 msgid "Cover filename:"
 msgstr "Nombre de fichero de carátula:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:656 rc.cpp:656
+#: po/rc.cpp:811 rc.cpp:811
 msgid "Dynamizer port:"
 msgstr "Puerto del dinamizador:"
 
 #. i18n: file: gui/serversettings.ui:168
 #. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
-#: po/rc.cpp:659 rc.cpp:659
+#: po/rc.cpp:814 rc.cpp:814
 #, fuzzy
 msgid "HTTP stream URL:"
 msgstr "Flujo HTTP"
 
 #. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:662 rc.cpp:662
+#: po/rc.cpp:817 rc.cpp:817
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art "
 "(either the value specified above, or <code>cover.jpg / cover.png</code> if "
@@ -5145,7 +5635,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:277
 #. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
-#: po/rc.cpp:668 rc.cpp:668
+#: po/rc.cpp:823 rc.cpp:823
 #, fuzzy
 msgid ""
 "<i><b>NOTE:</b> 'HTTP Stream URL' is only of use if you have MPD configured "
@@ -5158,7 +5648,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:677 rc.cpp:677
+#: po/rc.cpp:832 rc.cpp:832
 msgid ""
 "<i><b>NOTE:</b> If you change the 'Music folder' setting, then you will need "
 "to manually update the music database. This can be performed by pressing the "
@@ -5171,7 +5661,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:379
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel_2)
-#: po/rc.cpp:680 rc.cpp:680
+#: po/rc.cpp:835 rc.cpp:835
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -5181,19 +5671,13 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:683 rc.cpp:683
+#: po/rc.cpp:838 rc.cpp:838
 msgid "Network interface:"
 msgstr "Interfaz de red:"
 
-#. i18n: file: http/httpserversettings.ui:38
-#. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:686 rc.cpp:686
-msgid "Current URL:"
-msgstr "URL actual:"
-
-#. i18n: file: http/httpserversettings.ui:73
+#. i18n: file: http/httpserversettings.ui:57
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:689 rc.cpp:689
+#: po/rc.cpp:841 rc.cpp:841
 msgid ""
 "<i><b>NOTE:</b> MPD usually only plays songs that are stored within its "
 "folders. Cantata contains a minimal HTTP server that can be used to serve "
@@ -5211,33 +5695,31 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:693 rc.cpp:693
+#: po/rc.cpp:845 rc.cpp:845
 msgid "Mode:"
 msgstr "Modo:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:699 rc.cpp:699
+#: po/rc.cpp:851 rc.cpp:851
 msgid "HTTP Proxy"
 msgstr "Proxy HTTP"
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:702 rc.cpp:702
+#: po/rc.cpp:854 rc.cpp:854
 msgid "SOCKS Proxy"
 msgstr "Proxy SOCKS"
 
 #. i18n: file: online/onlinesettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:717 rc.cpp:717
-msgid ""
-"The following is a list of online providers, to hide a provider simply un-"
-"check its entry in this list."
+#: po/rc.cpp:869 rc.cpp:869
+msgid "Use the checkboxes below to configure the list of active services."
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:723 rc.cpp:723
+#: po/rc.cpp:875 rc.cpp:875
 msgid ""
 "You can listen for free without an account, but Premium members can listen "
 "to higher quality streams without advertisements. Visit <a href=\"http://www."
@@ -5251,38 +5733,38 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:726 rc.cpp:726
+#: po/rc.cpp:878 rc.cpp:878
 msgid "Premium Account"
 msgstr "Cuenta premium"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:735 rc.cpp:735
+#: po/rc.cpp:887 rc.cpp:887
 msgid "Stream type:"
 msgstr "Tipo de flujo:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:738 rc.cpp:738
+#: po/rc.cpp:890 rc.cpp:890
 msgid "Status:"
 msgstr "Estado:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:109
 #. i18n: ectx: property (text), widget (QPushButton, loginButton)
-#: po/rc.cpp:741 streams/digitallyimportedsettings.cpp:130
-#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
+#: po/rc.cpp:893 streams/digitallyimportedsettings.cpp:131
+#: streams/digitallyimportedsettings.cpp:137 rc.cpp:893
 msgid "Login"
 msgstr "Iniciar sesión"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:747 rc.cpp:747
+#: po/rc.cpp:899 rc.cpp:899
 msgid "Session expiry:"
 msgstr "Hora de finalización de sesión:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:151
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:750 rc.cpp:750
+#: po/rc.cpp:902 rc.cpp:902
 #, fuzzy
 msgid ""
 "<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
@@ -5293,7 +5775,7 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:161
 #. i18n: ectx: property (text), widget (QLabel, note2Label)
-#: po/rc.cpp:753 rc.cpp:753
+#: po/rc.cpp:905 rc.cpp:905
 msgid ""
 "<i><b>NOTE:</b> If you enter account details, then a 'DI' status item will "
 "appear under the list of streams. This will indicate if you are logged in or "
@@ -5302,28 +5784,26 @@ msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:756 rc.cpp:756
-msgid ""
-"The following is a list of the top-level stream categories, to hide a "
-"category simply un-check its entry in this list."
+#: po/rc.cpp:908 rc.cpp:908
+msgid "Use the checkboxes below to configure the list of active providers."
 msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: po/rc.cpp:759 rc.cpp:759
+#: po/rc.cpp:911 rc.cpp:911
 #, fuzzy
 msgid "Configure Provider"
 msgstr "Configurar dispositivo"
 
 #. i18n: file: streams/streamssettings.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, installButton)
-#: po/rc.cpp:762 rc.cpp:762
+#: po/rc.cpp:914 rc.cpp:914
 msgid "Install"
 msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:80
 #. i18n: ectx: property (text), widget (QLabel, note)
-#: po/rc.cpp:768 rc.cpp:768
+#: po/rc.cpp:920 rc.cpp:920
 #, fuzzy
 msgid ""
 "<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
@@ -5334,123 +5814,117 @@ msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:771 rc.cpp:771
+#: po/rc.cpp:923 rc.cpp:923
 msgid "Search:"
 msgstr "Buscar:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:65
 #. i18n: ectx: property (title), widget (QGroupBox, actionBox)
-#: po/rc.cpp:774 rc.cpp:774
+#: po/rc.cpp:926 rc.cpp:926
 msgid "Shortcut for Selected Action"
 msgstr "Atajo para la acción seleccionada"
 
 #. i18n: file: support/shortcutssettingswidget.ui:71
 #. i18n: ectx: property (text), widget (QRadioButton, useDefault)
-#: po/rc.cpp:777 rc.cpp:777
+#: po/rc.cpp:929 rc.cpp:929
 msgid "Default:"
 msgstr "Predefinido:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:85
 #. i18n: ectx: property (text), widget (QRadioButton, useCustom)
-#: po/rc.cpp:783 rc.cpp:783
+#: po/rc.cpp:935 rc.cpp:935
 msgid "Custom:"
 msgstr "Personalizado:"
 
-#. i18n: file: tags/tageditor.ui:25
-#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:786 rc.cpp:786
-msgid "Track:"
-msgstr "Pista:"
-
 #. i18n: file: tags/tageditor.ui:64
 #. i18n: ectx: property (text), widget (StateLabel, albumArtistLabel)
-#: po/rc.cpp:795 rc.cpp:795
+#: po/rc.cpp:947 rc.cpp:947
 msgid "Album artist:"
 msgstr "Artista del álbum:"
 
 #. i18n: file: tags/tageditor.ui:103
 #. i18n: ectx: property (text), widget (StateLabel, trackLabel)
-#: po/rc.cpp:804 rc.cpp:804
+#: po/rc.cpp:956 rc.cpp:956
 msgid "Track number:"
 msgstr "Número de pista:"
 
 #. i18n: file: tags/tageditor.ui:116
 #. i18n: ectx: property (text), widget (StateLabel, discLabel)
-#: po/rc.cpp:807 rc.cpp:807
+#: po/rc.cpp:959 rc.cpp:959
 msgid "Disc number:"
 msgstr "Número de disco:"
 
-#. i18n: file: tags/trackorganiser.ui:155
+#. i18n: file: tags/trackorganiser.ui:115
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:834 rc.cpp:834
+#: po/rc.cpp:989 rc.cpp:989
 msgid "Original Name"
 msgstr "Nombre original"
 
-#. i18n: file: tags/trackorganiser.ui:160
+#. i18n: file: tags/trackorganiser.ui:120
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:837 rc.cpp:837
+#: po/rc.cpp:992 rc.cpp:992
 msgid "New Name"
 msgstr "Nombre nuevo"
 
-#: po/rc.cpp:838 rc.cpp:838
+#: po/rc.cpp:996 rc.cpp:996
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "Omar Campagne Polaino"
 
-#: po/rc.cpp:839 rc.cpp:839
+#: po/rc.cpp:997 rc.cpp:997
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "ocampagne at gmail.com"
 
-#: replaygain/rgdialog.cpp:121
+#: replaygain/rgdialog.cpp:116
 msgid "Show All Tracks"
 msgstr "Mostrar todas las pistas"
 
-#: replaygain/rgdialog.cpp:122
+#: replaygain/rgdialog.cpp:117
 msgid "Show Untagged Tracks"
 msgstr "Mostrar pistas sin etiquetar"
 
-#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:124 tags/trackorganiser.cpp:79
 msgid "Remove From List"
 msgstr "Eliminar de la lista"
 
-#: replaygain/rgdialog.cpp:136
+#: replaygain/rgdialog.cpp:131
 msgid "Album Gain"
 msgstr "Ganancia de reproducción del álbum"
 
-#: replaygain/rgdialog.cpp:137
+#: replaygain/rgdialog.cpp:132
 msgid "Track Gain"
 msgstr "Ganancia de reproducción de pista"
 
-#: replaygain/rgdialog.cpp:138
+#: replaygain/rgdialog.cpp:133
 msgid "Album Peak"
 msgstr "Punto más alto del álbum"
 
-#: replaygain/rgdialog.cpp:139
+#: replaygain/rgdialog.cpp:134
 msgid "Track Peak"
 msgstr "Punto más alto del pista"
 
-#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
+#: replaygain/rgdialog.cpp:154 replaygain/rgdialog.cpp:283
 msgid "Scan"
 msgstr "Analizar"
 
-#: replaygain/rgdialog.cpp:238
+#: replaygain/rgdialog.cpp:233
 msgid "Update ReplayGain tags in tracks?"
 msgstr "¿Desea actualizar las etiquetas ReplayGain de las pistas?"
 
-#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
+#: replaygain/rgdialog.cpp:233 replaygain/rgdialog.cpp:234
 msgid "Update Tags"
 msgstr "Actualizar etiquetas"
 
-#: replaygain/rgdialog.cpp:252
+#: replaygain/rgdialog.cpp:247
 msgid "Abort scanning of tracks?"
 msgstr "¿Desea interrumpir el análisis de las pistas?"
 
-#: replaygain/rgdialog.cpp:261
+#: replaygain/rgdialog.cpp:256
 msgid "Abort reading of existing tags?"
 msgstr "¿Desea cancelar la lectura de las etiquetas existentes?"
 
-#: replaygain/rgdialog.cpp:287
+#: replaygain/rgdialog.cpp:282
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
@@ -5458,63 +5932,63 @@ msgstr ""
 "¿Desea analizar <b>todas</b>las pistas?<br><br><i>NOTA: Todas las pistas ya "
 "tienen etiquetas ReplyGain.</i>"
 
-#: replaygain/rgdialog.cpp:289
+#: replaygain/rgdialog.cpp:284
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr "¿Desea analizar todas las pistas, o solo aquellas sin etiquetas?"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "Untagged Tracks"
 msgstr "Pistas sin etiquetar"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "All Tracks"
 msgstr "Todas las pistas"
 
-#: replaygain/rgdialog.cpp:300
+#: replaygain/rgdialog.cpp:295
 msgid "Scanning tracks..."
 msgstr "Analizando pistas..."
 
-#: replaygain/rgdialog.cpp:367
+#: replaygain/rgdialog.cpp:362
 msgid "Reading existing tags..."
 msgstr "Leyendo etiquetas existentes..."
 
-#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+#: replaygain/rgdialog.cpp:414 tags/tageditor.cpp:798
 #, fuzzy
 msgctxt "filename (Timeout)"
 msgid "%1 (Timeout)"
 msgstr "%1 (Estimación)"
 
-#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:802
 msgctxt "filename (Corrupt tags?)"
 msgid "%1 (Corrupt tags?)"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
+#: replaygain/rgdialog.cpp:432 tags/tageditor.cpp:812
 msgid "Failed to update the tags of the following tracks:"
 msgstr "Fallo al actualizar las etiquetas de las siguientes pistas:"
 
-#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
-#: tags/trackorganiser.cpp:451
+#: replaygain/rgdialog.cpp:473 tags/tageditor.cpp:885
+#: tags/trackorganiser.cpp:483
 msgid "Device is not connected."
 msgstr "El dispositivo no está conectado."
 
-#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
-#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
+#: replaygain/rgdialog.cpp:513 replaygain/rgdialog.cpp:520
+#: replaygain/rgdialog.cpp:599 replaygain/rgdialog.cpp:601
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:520 replaygain/rgdialog.cpp:521
-#: replaygain/rgdialog.cpp:527 replaygain/rgdialog.cpp:528
-#: replaygain/rgdialog.cpp:579 replaygain/rgdialog.cpp:580
-#: replaygain/rgdialog.cpp:581 replaygain/rgdialog.cpp:582
+#: replaygain/rgdialog.cpp:516 replaygain/rgdialog.cpp:517
+#: replaygain/rgdialog.cpp:523 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:575 replaygain/rgdialog.cpp:576
+#: replaygain/rgdialog.cpp:577 replaygain/rgdialog.cpp:578
 msgid "Failed"
 msgstr "Fallo"
 
-#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
+#: replaygain/rgdialog.cpp:651 tags/trackorganiser.cpp:428
 msgid "Remove the selected tracks from the list?"
 msgstr "¿Eliminar las pistas seleccionadas de la lista?"
 
-#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
+#: replaygain/rgdialog.cpp:652 tags/trackorganiser.cpp:429
 msgid "Remove Tracks"
 msgstr "Eliminar pistas"
 
@@ -5534,19 +6008,19 @@ msgstr "AAC 64k"
 msgid "AAC 128k"
 msgstr "AAC 128k"
 
-#: streams/digitallyimportedsettings.cpp:109
+#: streams/digitallyimportedsettings.cpp:110
 msgid "Logged out"
 msgstr "Sesión no iniciada"
 
-#: streams/digitallyimportedsettings.cpp:112
+#: streams/digitallyimportedsettings.cpp:113
 msgid "Logging in..."
 msgstr "Iniciando sesión…"
 
-#: streams/digitallyimportedsettings.cpp:136
+#: streams/digitallyimportedsettings.cpp:137
 msgid "Logout"
 msgstr "Finalizar sesión"
 
-#: streams/streamdialog.cpp:71
+#: streams/streamdialog.cpp:72
 msgid "URL:"
 msgstr "URL:"
 
@@ -5570,7 +6044,7 @@ msgstr "Editar flujo"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>ERROR:</b>Protocolo no válido</i>"
 
-#: streams/streamfetcher.cpp:205
+#: streams/streamfetcher.cpp:209
 msgid "Fetching %1"
 msgstr "Obteniendo %1"
 
@@ -5586,90 +6060,90 @@ msgstr "Exportar flujos favoritos"
 msgid "Add New Stream To Favorites"
 msgstr "Añadir flujo nuevo a favoritos"
 
-#: streams/streamspage.cpp:124
+#: streams/streamspage.cpp:125
 #, fuzzy
 msgctxt "Service name"
 msgid "Digitally Imported"
 msgstr "Importe digitalmente"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:243
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|Flujos XML"
 
-#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
+#: streams/streamspage.cpp:243 streams/streamspage.cpp:245
 msgid "Import Streams"
 msgstr "Importar flujos"
 
-#: streams/streamspage.cpp:245
+#: streams/streamspage.cpp:246
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "Flujos XML (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:253
+#: streams/streamspage.cpp:254
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr "Fallo al importar <b>%1</b>.<br/>Compruebe que es del tipo correcto."
 
-#: streams/streamspage.cpp:265
+#: streams/streamspage.cpp:266
 msgid "*.xml|XML Streams"
 msgstr "*.xml|Flujos XML"
 
-#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
+#: streams/streamspage.cpp:266 streams/streamspage.cpp:268
 msgid "Export Streams"
 msgstr "Exportar flujos"
 
-#: streams/streamspage.cpp:267
+#: streams/streamspage.cpp:268
 msgid "XML Streams (*.xml)"
 msgstr "Flujos XML (*.xml)"
 
-#: streams/streamspage.cpp:279
+#: streams/streamspage.cpp:280
 msgid "Failed to create <b>%1</b>!"
 msgstr "Fallo al crear <b>%1</b>."
 
-#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
+#: streams/streamspage.cpp:297 streams/streamspage.cpp:493
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "El flujo ya existe.<br/><b>%1</b>"
 
-#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
+#: streams/streamspage.cpp:299 streams/streamspage.cpp:495
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "Ya existe un flujo llamado <b>%1</b>."
 
-#: streams/streamspage.cpp:318
+#: streams/streamspage.cpp:319
 msgid "Bookmark added"
 msgstr "Favorito añadido"
 
-#: streams/streamspage.cpp:320
+#: streams/streamspage.cpp:321
 msgid "Already bookmarked"
 msgstr "Ya está en favoritos"
 
-#: streams/streamspage.cpp:366
+#: streams/streamspage.cpp:367
 msgid "Added to favorites"
 msgstr "Añadido a favoritos"
 
-#: streams/streamspage.cpp:368
+#: streams/streamspage.cpp:369
 msgid "Already in favorites"
 msgstr "Ya está en favoritos"
 
-#: streams/streamspage.cpp:393
+#: streams/streamspage.cpp:394
 msgid "Reload <b>%1</b> streams?"
 msgstr "¿Actualizar <b>%1</b> flujos?"
 
-#: streams/streamspage.cpp:411
+#: streams/streamspage.cpp:412
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr "¿Seguro que desea eliminar el favorito a <b>%1</b>?"
 
-#: streams/streamspage.cpp:417
+#: streams/streamspage.cpp:418
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr "¿Seguro que desea eliminar todos los favoritos <b>%1</b>?"
 
-#: streams/streamspage.cpp:445
+#: streams/streamspage.cpp:446
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "¿Desea eliminar los %1 flujos seleccionados?"
 
-#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
+#: streams/streamspage.cpp:450 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "¿Desea eliminar <b>%1</b>?"
 
-#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+#: streams/streamspage.cpp:561 streams/streamspage.cpp:577
 #, fuzzy
 msgid "Search %1:"
 msgstr "Buscar %1:"
@@ -5719,139 +6193,90 @@ msgstr "Fallo al guardar las letras"
 msgid "Failed to remove streams folder!"
 msgstr "No se ha podido eliminar el fichero anterior de normas - %1"
 
-#: support/dialog.cpp:89
+#: support/dialog.cpp:73
 msgid "&OK"
 msgstr "&Aceptar"
 
-#: support/dialog.cpp:90
+#: support/dialog.cpp:74
 msgid "&Cancel"
 msgstr "&Cancelar"
 
-#: support/dialog.cpp:91
+#: support/dialog.cpp:75
 msgid "&Yes"
 msgstr "&Si"
 
-#: support/dialog.cpp:92
+#: support/dialog.cpp:76
 msgid "&No"
 msgstr "&No"
 
-#: support/dialog.cpp:93
+#: support/dialog.cpp:77
 msgid "&Discard"
 msgstr "&Descartar"
 
-#: support/dialog.cpp:94
+#: support/dialog.cpp:78
 msgid "&Save"
 msgstr "&Guardar"
 
-#: support/dialog.cpp:95
+#: support/dialog.cpp:79
 msgid "&Apply"
 msgstr "A&plicar"
 
-#: support/dialog.cpp:96
+#: support/dialog.cpp:80
 msgid "&Close"
 msgstr "C&errar"
 
-#: support/dialog.cpp:98
+#: support/dialog.cpp:82
 msgid "&Overwrite"
 msgstr "S&obrescribir"
 
-#: support/dialog.cpp:99
+#: support/dialog.cpp:83
 msgid "&Reset"
 msgstr "&Restablecer"
 
-#: support/dialog.cpp:100
+#: support/dialog.cpp:84
 msgid "&Continue"
 msgstr "Con&tinuar"
 
-#: support/dialog.cpp:101
+#: support/dialog.cpp:85
 msgid "&Delete"
 msgstr "&Eliminar"
 
-#: support/dialog.cpp:102
+#: support/dialog.cpp:86
 msgid "&Stop"
 msgstr "&Parar"
 
-#: support/dialog.cpp:103
+#: support/dialog.cpp:87
 msgid "&Remove"
 msgstr "&Eliminar"
 
-#: support/dialog.cpp:104
+#: support/dialog.cpp:88
 msgid "&Previous"
 msgstr "Anter&ior"
 
-#: support/dialog.cpp:105
+#: support/dialog.cpp:89
 msgid "&Next"
 msgstr "Sig&uiente"
 
-#: support/fancytabwidget.cpp:957
-msgid "Icons Only"
-msgstr "Solo iconos"
-
-#: support/fancytabwidget.cpp:958
-msgid "Style"
-msgstr "Estilo"
-
-#: support/fancytabwidget.cpp:959
-msgid "Large Sidebar"
-msgstr "Barra lateral grande"
-
-#: support/fancytabwidget.cpp:960
-msgid "Small Sidebar"
-msgstr "Barra lateral pequeña"
-
-#: support/fancytabwidget.cpp:961
-msgid "Top Bar"
-msgstr "Barra superior"
-
-#: support/fancytabwidget.cpp:962
-msgid "Bottom Bar"
-msgstr "Barra inferior"
-
-#: support/fancytabwidget.cpp:963
-msgid "Tabs On Side"
-msgstr "Pestañas en el lado"
-
-#: support/fancytabwidget.cpp:964
-msgid "Tabs On Top"
-msgstr "Pestañas en la parte superior"
-
-#: support/fancytabwidget.cpp:965
-msgid "Tabs On Bottom"
-msgstr "Pestañas en la parte inferior"
-
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Password"
 msgstr "Contraseña"
 
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Please enter password:"
 msgstr "Introduzca la contraseña:"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:123
+#: support/messagebox.cpp:50 support/messagebox.cpp:124
 msgid "Warning"
 msgstr "Advertencia"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:118
+#: support/messagebox.cpp:50 support/messagebox.cpp:119
 msgid "Question"
 msgstr "Pregunta"
 
-#: support/messagebox.cpp:107 support/messagebox.cpp:113
-#: support/messagebox.h:62
-msgid "Error"
-msgstr "Fallo"
-
 #: support/messagebox.h:65
 msgid "Information"
 msgstr "Información"
 
-#: support/onoffbutton.cpp:47
-msgid "ON"
-msgstr "ACTIVADO"
-
-#: support/onoffbutton.cpp:48
-msgid "OFF"
-msgstr "DESACTIVADO"
-
 #: support/pathrequester.cpp:50
 msgid "Select Folder"
 msgstr "Seleccione el directorio"
@@ -5894,33 +6319,33 @@ msgid_plural "%1 days %2"
 msgstr[0] "1 día %2"
 msgstr[1] "%1 días %2"
 
-#: tags/tageditor.cpp:134
+#: tags/tageditor.cpp:147
 msgid "Tags"
 msgstr "Etiquetas"
 
-#: tags/tageditor.cpp:147
+#: tags/tageditor.cpp:160
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr "Definir «Artista del álbum» como «Artista»"
 
-#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
+#: tags/tageditor.cpp:261 tags/tageditor.cpp:592
 msgid "All tracks"
 msgstr "Todas las pistas"
 
-#: tags/tageditor.cpp:295
+#: tags/tageditor.cpp:323
 msgid "(Various)"
 msgstr "(Varios)"
 
-#: tags/tageditor.cpp:336
+#: tags/tageditor.cpp:368
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr ""
 "¿Desea aplicar el arreglo para «Varios Artistas» a <b>todas</b> las pistas?"
 
-#: tags/tageditor.cpp:378
+#: tags/tageditor.cpp:410
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr ""
 "¿Desea deshacer el arreglo para «Varios Artistas» a <b>todas</b> las pistas?"
 
-#: tags/tageditor.cpp:428
+#: tags/tageditor.cpp:460
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5928,17 +6353,17 @@ msgstr ""
 "¿Quiere definir «Artista del álbum» como «Artista» (si «Artista del álbum» "
 "está vacío) para <b>todas</b> las pistas?"
 
-#: tags/tageditor.cpp:429
+#: tags/tageditor.cpp:461
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr ""
 "¿Quiere definir «Artista del álbum» como «Artista» (si «Artista del álbum» "
 "está vacío)?"
 
-#: tags/tageditor.cpp:430
+#: tags/tageditor.cpp:462
 msgid "Album Artist from Artist"
 msgstr "«Artista del álbum» como «Artista»"
 
-#: tags/tageditor.cpp:463
+#: tags/tageditor.cpp:495
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5946,55 +6371,55 @@ msgstr ""
 "¿Desea poner en mayúscula la primera letra de «Título», «Artista», «Artista "
 "del álbum», y «Álbum» para <b>todas</b> las pistas?"
 
-#: tags/tageditor.cpp:496
+#: tags/tageditor.cpp:528
 msgid "Adjust the value of each track number by:"
 msgstr "Ajustar el valor de cada número de pista en:"
 
-#: tags/tageditor.cpp:554
+#: tags/tageditor.cpp:586
 msgid "All tracks [modified]"
 msgstr "Todas las pistas [modificado]"
 
-#: tags/tageditor.cpp:556
+#: tags/tageditor.cpp:588
 msgid "%1 [modified]"
 msgstr "%1 [modificado]"
 
-#: tags/tageditor.cpp:783
+#: tags/tageditor.cpp:827
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr ""
 "¿Desea renombrar los ficheros de audio para que coincidan con las etiquetas?"
 
-#: tags/tageditor.cpp:784
+#: tags/tageditor.cpp:828
 msgid "Rename Files"
 msgstr "Renombrar ficheros"
 
-#: tags/trackorganiser.cpp:150
+#: tags/trackorganiser.cpp:164
 msgid "Abort renaming of files?"
 msgstr "¿Cancelar la modificación de los ficheros?"
 
-#: tags/trackorganiser.cpp:263
+#: tags/trackorganiser.cpp:279
 #, fuzzy
 msgid "Source file does not exist!<br/>%1"
 msgstr "La canción no existe.<hr/>%1"
 
-#: tags/trackorganiser.cpp:282
+#: tags/trackorganiser.cpp:298
 msgid "Destination file already exists!<br/>%1"
 msgstr "El fichero de destino ya existe.<br/>%1"
 
-#: tags/trackorganiser.cpp:304
+#: tags/trackorganiser.cpp:320
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "Fallo al crear el directorio de destino. <br/>%1"
 
-#: tags/trackorganiser.cpp:325
+#: tags/trackorganiser.cpp:341
 msgid "Failed to rename %1 to %2"
 msgstr "Fallo al renombrar %1 a %2"
 
-#: widgets/coverwidget.cpp:267
+#: widgets/coverwidget.cpp:280
 #, fuzzy
 msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
 msgstr "<tr><td align=\"right\">Fichero:</td><td>%1</td></tr>"
 
-#: widgets/coverwidget.cpp:269
+#: widgets/coverwidget.cpp:282
 msgid ""
 "<tr><td align=\"right\"><b>Artist:</b></td><td>%1</td></tr><tr><td align="
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Year:"
@@ -6004,38 +6429,42 @@ msgstr ""
 "\"right\"><b>Álbum:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Año:</"
 "b></td><td>%3</td></tr>"
 
-#: widgets/genrecombo.cpp:54
+#: widgets/genrecombo.cpp:44
+msgid "Filter On Genre"
+msgstr ""
+
+#: widgets/genrecombo.cpp:66
 msgid "All Genres"
 msgstr "Todos los géneros"
 
-#: widgets/groupedview.cpp:267
+#: widgets/groupedview.cpp:265
 #, fuzzy
 msgctxt "album (albumYear)"
 msgid "%1 (%2)"
 msgstr "%1 (Disco %2)"
 
-#: widgets/groupedview.cpp:269
+#: widgets/groupedview.cpp:267
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: widgets/itemview.cpp:480
+#: widgets/itemview.cpp:561
 msgid "Go Back"
 msgstr "Retroceder"
 
-#: widgets/itemview.cpp:485
+#: widgets/itemview.cpp:566
 msgid "Go Home"
 msgstr "Página inicial"
 
-#: widgets/menubutton.cpp:36
+#: widgets/menubutton.cpp:39
 msgid "Menu"
 msgstr ""
 
-#: widgets/searchwidget.cpp:62
+#: widgets/searchwidget.cpp:63
 msgid "Search..."
 msgstr "Buscar…"
 
-#: widgets/searchwidget.cpp:66
+#: widgets/searchwidget.cpp:67
 msgid "Close Search Bar"
 msgstr "Cerrar barra de búsqueda"
 
@@ -6049,41 +6478,37 @@ msgstr "Sesión iniciada"
 msgid "<b>NOT</b> logged into %1"
 msgstr "<b>NO</b> registrado en Importe digital"
 
-#: widgets/songdialog.cpp:48
+#: widgets/songdialog.cpp:49
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
 "\" setting, and MPD's \"music_directory\" setting.</p>"
 msgstr ""
 
-#: widgets/songdialog.cpp:51
+#: widgets/songdialog.cpp:52
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check that the device is still "
 "attached.</p>"
 msgstr ""
 
-#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:115 widgets/volumeslider.cpp:230
+#: widgets/volumeslider.cpp:237
 msgid "Mute"
 msgstr "Silenciar"
 
-#: widgets/volumeslider.cpp:199
+#: widgets/volumeslider.cpp:198
 #, fuzzy
 msgid "Muted"
 msgstr "Silenciar"
 
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:237
 msgid "Unmute"
 msgstr ""
 
-#: widgets/volumeslider.cpp:276
-msgid "Volume Disabled"
-msgstr "Volumen desactivado"
-
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1% (Muted)"
 msgstr "Volumen: %1 % (silenciado)"
 
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1%"
 msgstr "Volumen %1%"
 
@@ -6187,6 +6612,139 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Episodes"
 msgstr "%1 entradas"
 
+#~ msgid "Transcoding failed.<br/><br/<hr/>%1"
+#~ msgstr "Fallo durante la transcodificación.<br/><br/<hr/>%1"
+
+#~ msgid "Failed to download track.<br/><br/<hr/>%1"
+#~ msgstr "Fallo de descarga de pista.<br/><br/<hr/>%1"
+
+#~ msgid "<b>Error</b><br/>"
+#~ msgstr "<b>Error</b><br/>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
+#~ "td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Artista:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Álbum:</td><td>%2</td></tr><tr><td align=\"right\">Pista:</td><td>%3</"
+#~ "td></tr>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Destination file:</td><td>%2</td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Artista:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Álbum:</td><td>%2</td></tr><tr><td align=\"right\">Pista:</td><td>%3</"
+#~ "td></tr>"
+
+#~ msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
+#~ msgstr "<tr><td align=\"right\">Fichero:</td><td>%1</td></tr>"
+
+#~ msgid ""
+#~ "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
+#~ "i></tr>"
+#~ msgstr ""
+#~ "<tr><i><td align=\"right\"><i>Tiempo restante:</i></td><td><i>%5</i></"
+#~ "td></i></tr>"
+
+#~ msgctxt ""
+#~ "Google\n"
+#~ "width x height (file size)"
+#~ msgid ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+#~ msgstr ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+
+#~ msgctxt ""
+#~ "Discogs\n"
+#~ "width x height"
+#~ msgid ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+#~ msgstr ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+
+#~ msgid "Grouped by 'Album Artist'"
+#~ msgstr "Agrupado por «Artista del álbum»"
+
+#~ msgid "Search Play Queue"
+#~ msgstr "Buscar en lista de reproducción"
+
+#~ msgid "Do not fadeout"
+#~ msgstr "Sin disminución progresiva de volumen"
+
+#~ msgid "Inactive"
+#~ msgstr "Inactivo"
+
+#~ msgctxt "Track Number (#)"
+#~ msgid "#"
+#~ msgstr "Núm."
+
+#, fuzzy
+#~ msgid "Search For Podcasts"
+#~ msgstr "Búsqueda de letras"
+
+#~ msgid "Use backdrop"
+#~ msgstr "Utilizar fondo"
+
+#~ msgid "Automatically lookup"
+#~ msgstr "Consulta automática"
+
+#~ msgid "<html><head/><body><p>Cancel current query</p></body></html>"
+#~ msgstr "<html><head/><body><p>Cancelar consulta actual</p></body></html>"
+
+#~ msgid "<html><head/><body><p>Add a local file</p></body></html>"
+#~ msgstr "<html><head/><body><p>Añadir un fichero local</p></body></html>"
+
+#~ msgid "Use current album cover as background:"
+#~ msgstr "Utilizar la carátula de álbum actual como fondo:"
+
+#~ msgid "Multiple artist albums:"
+#~ msgstr "Álbumes de varios artistas:"
+
+#~ msgid "Crossfading:"
+#~ msgstr "Atenuación cruzada:"
+
+#~ msgid " seconds"
+#~ msgstr " segundos"
+
+#~ msgid "Devices:"
+#~ msgstr "Dispositivos:"
+
+#~ msgid "Current URL:"
+#~ msgstr "URL actual:"
+
+#~ msgid "Icons Only"
+#~ msgstr "Solo iconos"
+
+#~ msgid "Style"
+#~ msgstr "Estilo"
+
+#~ msgid "Small Sidebar"
+#~ msgstr "Barra lateral pequeña"
+
+#~ msgid "Tabs On Side"
+#~ msgstr "Pestañas en el lado"
+
+#~ msgid "Tabs On Top"
+#~ msgstr "Pestañas en la parte superior"
+
+#~ msgid "Tabs On Bottom"
+#~ msgstr "Pestañas en la parte inferior"
+
+#~ msgid "ON"
+#~ msgstr "ACTIVADO"
+
+#~ msgid "OFF"
+#~ msgstr "DESACTIVADO"
+
+#~ msgid "Volume Disabled"
+#~ msgstr "Volumen desactivado"
+
 #~ msgid ""
 #~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
 #~ msgstr ""
diff --git a/po/hu.po b/po/hu.po
index 9504418..8665cd5 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -6,8 +6,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-14 20:26+0000\n"
-"PO-Revision-Date: 2013-11-15 18:43+0100\n"
+"POT-Creation-Date: 2014-02-02 20:02+0000\n"
+"PO-Revision-Date: 2014-02-19 09:41+0100\n"
 "Last-Translator: Török Árpád <torar at freemail.hu>\n"
 "Language-Team: Hungarian <kde-l10n-hu at kde.org>\n"
 "Language: hu\n"
@@ -21,14 +21,13 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "Albuminformációk frissítése"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:307
-#: gui/cachesettings.cpp:262
+#: context/albumview.cpp:71 gui/cachesettings.cpp:269
 msgid "Album Information"
 msgstr "Albuminformációk"
 
-#. i18n: file: devices/albumdetails.ui:143
+#. i18n: file: devices/albumdetails.ui:136
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
+#: context/albumview.cpp:175 po/rc.cpp:107 rc.cpp:107
 msgid "Tracks"
 msgstr "Számok"
 
@@ -36,22 +35,22 @@ msgstr "Számok"
 msgid "Refresh Artist Information"
 msgstr "Előadói információk frissítése"
 
-#: context/artistview.cpp:92 context/contextwidget.cpp:306
-#: gui/cachesettings.cpp:260
+#: context/artistview.cpp:92 gui/cachesettings.cpp:267
 msgid "Artist Information"
 msgstr "Előadói információk"
 
-#. i18n: file: gui/interfacesettings.ui:137
+#. i18n: file: gui/interfacesettings.ui:272
 #. i18n: ectx: attribute (title), widget (QWidget, tab_2)
-#: context/artistview.cpp:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
+#: context/artistview.cpp:314 gui/interfacesettings.cpp:106
+#: gui/mainwindow.cpp:308 po/rc.cpp:588 rc.cpp:588
 msgid "Albums"
 msgstr "Albumok"
 
-#: context/artistview.cpp:333
+#: context/artistview.cpp:337
 msgid "Web Links"
 msgstr "Web-hivatkozások"
 
-#: context/artistview.cpp:419
+#: context/artistview.cpp:424
 msgid "Similar Artists"
 msgstr "Hasonló művészek"
 
@@ -59,22 +58,29 @@ msgstr "Hasonló művészek"
 msgid "Lyrics Providers"
 msgstr "Szövegtárak"
 
-#: context/contextsettings.cpp:37
+#: context/contextsettings.cpp:37 gui/cachesettings.cpp:278
 msgid "Wikipedia Languages"
 msgstr "Wikipédia nyelvek"
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
-#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1388
+#: models/streamsmodel.cpp:1434 models/streamsmodel.cpp:1642
 msgid "Other"
 msgstr "Továbbiak"
 
-#: context/contextwidget.cpp:98
+#: context/contextwidget.cpp:293
 msgid "Reset Spacing"
 msgstr "Szüneteket alaphelyzetbe"
 
-#: context/contextwidget.cpp:308 context/songview.cpp:105
-#: gui/cachesettings.cpp:259
-msgid "Lyrics"
+#: context/contextwidget.cpp:506
+msgid "&Artist"
+msgstr "Előadó"
+
+#: context/contextwidget.cpp:507
+msgid "Al&bum"
+msgstr "Al&bum"
+
+#: context/contextwidget.cpp:508
+msgid "&Lyrics"
 msgstr "Dalszövegek"
 
 #: context/lastfmengine.cpp:63
@@ -99,37 +105,38 @@ msgstr ""
 "Ha a kereső új dalszöveget talál, hozzákapcsolható az eredeti dalhoz és "
 "előadóhoz, ahogy a Cantata jelzi."
 
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#: context/lyricsdialog.cpp:64 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
-#: rc.cpp:61 rc.cpp:304 rc.cpp:789
+#: context/lyricsdialog.cpp:64 gui/searchpage.cpp:204 po/rc.cpp:92
+#: po/rc.cpp:377 po/rc.cpp:941 rc.cpp:92 rc.cpp:377 rc.cpp:941
 msgid "Title:"
 msgstr "Cím:"
 
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#: context/lyricsdialog.cpp:66 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
-#: rc.cpp:55 rc.cpp:292 rc.cpp:792
+#: context/lyricsdialog.cpp:66 devices/actiondialog.cpp:800
+#: gui/searchpage.cpp:197 po/rc.cpp:86 po/rc.cpp:362 po/rc.cpp:944 rc.cpp:86
+#: rc.cpp:362 rc.cpp:944
 msgid "Artist:"
 msgstr "Előadó:"
 
@@ -141,95 +148,123 @@ msgstr "Dalszöveg keresése"
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "Válaszd ki a weboldalt, amit a dalszöveg keresésekor használni akarsz."
 
-#: context/lyricsettings.cpp:66
-msgid "(Polish Translations)"
-msgstr "(Lengyel fordítás)"
+#: context/othersettings.cpp:45 gui/coverdialog.cpp:877
+#: gui/interfacesettings.cpp:174
+msgid "Images (*.png *.jpg)"
+msgstr "Képek (*.png *.jpg)"
 
-#: context/lyricsettings.cpp:67
-msgid "(Portuguese Translations)"
-msgstr "(Portugál fordítás)"
+#: context/othersettings.cpp:47 gui/interfacesettings.cpp:176
+msgctxt "pixels"
+msgid "10px"
+msgstr "10px"
+
+#: context/othersettings.cpp:102 gui/interfacesettings.cpp:524
+msgctxt "value%"
+msgid "%1%"
+msgstr "%1%"
+
+#: context/othersettings.cpp:107 gui/interfacesettings.cpp:529
+#, c-format
+msgctxt "pixels"
+msgid "%1px"
+msgstr "%1px"
 
-#: context/songview.cpp:89
+#: context/songview.cpp:90
 msgid "Refresh Lyrics"
 msgstr "Dalszöveg frissítése"
 
-#: context/songview.cpp:90
+#: context/songview.cpp:91
 msgid "Edit Lyrics"
 msgstr "Dalszöveg szerkesztése"
 
-#: context/songview.cpp:91
+#: context/songview.cpp:92
 msgid "Save Lyrics"
 msgstr "Dalszöveg mentése"
 
-#: context/songview.cpp:92
+#: context/songview.cpp:93
 msgid "Cancel Editing Lyrics"
 msgstr "A dalszöveg szerkesztésének elvetése"
 
-#: context/songview.cpp:93
+#: context/songview.cpp:94
 msgid "Delete Lyrics File"
 msgstr "Dalszöveg-fájl törlése"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:106 gui/cachesettings.cpp:266
+msgid "Lyrics"
+msgstr "Dalszövegek"
+
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort editing of lyrics?"
 msgstr "Félbeszakítod a dalszöveg szerkesztését?"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort Editing"
 msgstr "Szerkesztés megszakítása"
 
-#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
-#: replaygain/rgdialog.cpp:252 replaygain/rgdialog.cpp:253
-#: replaygain/rgdialog.cpp:261 replaygain/rgdialog.cpp:262
-#: tags/trackorganiser.cpp:150
+#: context/songview.cpp:120 context/songview.cpp:139 context/songview.cpp:198
+#: replaygain/rgdialog.cpp:247 replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:256 replaygain/rgdialog.cpp:257
+#: tags/trackorganiser.cpp:164
 msgid "Abort"
 msgstr "Megszakít"
 
-#: context/songview.cpp:121
+#: context/songview.cpp:122
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr "A dalszöveg mentett másolatát törölöd és újra betöltöd? "
 
-#: context/songview.cpp:121 context/songview.cpp:122
-#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
+#: context/songview.cpp:122 context/songview.cpp:123
+#: online/onlineservicespage.cpp:458 online/onlineservicespage.cpp:459
 msgid "Re-download"
 msgstr "Újra betölt"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Current playing song has changed, still perform search?"
 msgstr "A dal, amit játszik megváltozott, továbbra is keresel?"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Song Changed"
 msgstr "A dal megváltozott"
 
-#: context/songview.cpp:148
+#: context/songview.cpp:149
 msgid "Perform Search"
 msgstr "Keresés"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save updated lyrics?"
 msgstr "Mented a frissített dalszövegeket?"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save"
 msgstr "Mentés"
 
-#: context/songview.cpp:185
+#: context/songview.cpp:186
 msgid "Failed to save lyrics."
 msgstr "Nem sikerült menteni a dalszöveget."
 
-#: context/songview.cpp:207
+#: context/songview.cpp:208
 msgid "Delete lyrics file?"
 msgstr "Törölöd a dalszöveg fájlt."
 
-#: context/songview.cpp:207 gui/mainwindow.cpp:292
-#: widgets/messageoverlay.cpp:43
-msgid "Cancel"
-msgstr "Kilépés"
+#: context/songview.cpp:208
+msgid "Delete File"
+msgstr "Fájl törlése"
 
-#: context/songview.cpp:431
+#: context/songview.cpp:462
 msgid "Fetching lyrics via %1"
 msgstr "Dalszöveg leszedése innen %1"
 
+#: context/ultimatelyricsprovider.cpp:200
+msgid "(Polish Translations)"
+msgstr "(Lengyel fordítás)"
+
+#: context/ultimatelyricsprovider.cpp:201
+msgid "(Portuguese Translations)"
+msgstr "(Portugál fordítás)"
+
+#: context/view.cpp:91 gui/mainwindow.cpp:328 widgets/messageoverlay.cpp:44
+msgid "Cancel"
+msgstr "Kilépés"
+
 #: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "Számlista"
@@ -252,7 +287,7 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "album|kotta|hangsáv"
 
-#: context/wikipediasettings.cpp:99
+#: context/wikipediasettings.cpp:114
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
@@ -260,8 +295,8 @@ msgstr ""
 "Válaszd ki a Wikipédiában, az előadó, vagy album információinak keresésekor "
 "használni kívánt nyelvet"
 
-#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
-#: online/podcastsearchdialog.cpp:393
+#: context/wikipediasettings.cpp:115 models/streamsmodel.cpp:598
+#: online/podcastsearchdialog.cpp:404
 msgid "Reload"
 msgstr "Újratöltés"
 
@@ -269,37 +304,52 @@ msgstr "Újratöltés"
 msgid "Cantata is playing a track"
 msgstr "A Cantata éppen számot játszik le"
 
-#: devices/actiondialog.cpp:76
+#: devices/actiondialog.cpp:83
 msgid "Songs To Be Copied"
 msgstr "Másolandó dal"
 
-#: devices/actiondialog.cpp:146
+#: devices/actiondialog.cpp:153
 msgid "<b>INVALID</b>"
 msgstr "<b>ÉRVÉNYTELEN</b>"
 
-#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
+#: devices/actiondialog.cpp:167 devices/actiondialog.cpp:170
 msgid "<i>(When different)</i>"
 msgstr "<i>(Ha eltérő)</i>"
 
-#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:185 tags/tageditor.cpp:713
+#: tags/trackorganiser.cpp:444
+msgid ""
+"Cantata has detected that you are connected to a Mopidy server.\n"
+"\n"
+"Currently it is not possible for Cantata to force Mopidy to refresh its "
+"local music listing. Therefore, you will need to stop Cantata, manually "
+"refresh Mopidy's database, and restart Cantata for any changes to be active."
+msgstr ""
+"A Cantata észlelte, hogy egy Mopidy szerverhez csatlakozol.\n"
+"\n"
+"A Cantata nem tudja kényszeríteni a Mopidy-t a helyi zenetár frissítésére. "
+"Ehhez le kell állítanod a Cantata-t, kézzel frissíteni a Mopidy adatbázisát "
+"és újraindítani a Cantata-t a változtatások aktiválása érdekében."
+
+#: devices/actiondialog.cpp:211 devices/synccollectionwidget.cpp:274
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "Előadó:%1, Lemez:%2, Dal:%3"
 
-#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
-#: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
+#: devices/actiondialog.cpp:271 devices/mtpdevice.cpp:1622
+#: devices/remotefsdevice.cpp:571 devices/umsdevice.cpp:103
 msgid "%1 free"
 msgstr "%1 szabad"
 
-#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
+#: devices/actiondialog.cpp:284 devices/actiondialog.cpp:288
 msgid "Local Music Library"
 msgstr "Helyi zenekönyvtár"
 
-#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
+#: devices/actiondialog.cpp:286 devices/albumdetailsdialog.cpp:104
+#: gui/preferencesdialog.cpp:115 widgets/groupedview.cpp:251
 msgid "Audio CD"
 msgstr "Hang CD"
 
-#: devices/actiondialog.cpp:293
+#: devices/actiondialog.cpp:309
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -311,7 +361,7 @@ msgstr ""
 "A számot át kell kódolni kisebb fájlméretűre, hogy sikeresen másolni "
 "lehessen."
 
-#: devices/actiondialog.cpp:300
+#: devices/actiondialog.cpp:316
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -319,32 +369,32 @@ msgstr ""
 "Nem maradt elegendő hely a célon.\n"
 "A kiválasztott szám %1 helyet foglal, de csak %2 hely maradt."
 
-#: devices/actiondialog.cpp:349
+#: devices/actiondialog.cpp:365
 msgid "Copy Songs"
 msgstr "Dalok másolása"
 
-#: devices/actiondialog.cpp:349 devices/devicespage.cpp:503
-#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: devices/actiondialog.cpp:365 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:214 gui/folderpage.cpp:270 gui/librarypage.cpp:257
 #: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "Dalok törlése"
 
-#: devices/actiondialog.cpp:380
+#: devices/actiondialog.cpp:402
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
 msgstr ""
 "<p>A céleszközt nem állítottad be.<br/>Folytatod az alapbeállításokkal?</p>"
 
-#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
+#: devices/actiondialog.cpp:403 devices/actiondialog.cpp:407
 msgid "Not Configured"
 msgstr "Nincs beállítva"
 
-#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
+#: devices/actiondialog.cpp:404 devices/actiondialog.cpp:408
 msgid "Use Defaults"
 msgstr "Alapbeállítások alkalmazása"
 
-#: devices/actiondialog.cpp:384
+#: devices/actiondialog.cpp:406
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
@@ -352,224 +402,231 @@ msgstr ""
 "<p>Nem állítottad be a forráseszközt.</br> Használjuk az alapbeállításokat?</"
 "p>"
 
-#: devices/actiondialog.cpp:446
+#: devices/actiondialog.cpp:468
 msgid "Are you sure you wish to stop?"
 msgstr "Biztosan le szeretnéd állítani?"
 
-#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
+#: devices/actiondialog.cpp:468 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "Állj"
 
-#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
-#: tags/trackorganiser.cpp:446
+#: devices/actiondialog.cpp:513 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:468 tags/tageditor.cpp:880
+#: tags/trackorganiser.cpp:478
 msgid "Device has been removed!"
 msgstr "Az eszköz el lett távolítva!"
 
-#: devices/actiondialog.cpp:491
+#: devices/actiondialog.cpp:515
 msgid "Device is not connected!"
 msgstr "Az eszköz nincs csatlakoztatva!"
 
-#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
-#: tags/trackorganiser.cpp:456
+#: devices/actiondialog.cpp:517 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:478 tags/tageditor.cpp:890
+#: tags/trackorganiser.cpp:488
 msgid "Device is busy?"
 msgstr "Az eszköz foglalt?"
 
-#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:519 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "Az eszköz megváltozott?"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:586
 msgid "Clearing unused folders"
 msgstr "A használaton kívüli könyvtárak tisztítása"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "Kiszámítsam a lejátszási szintet leszedett számokra?"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "ReplyGain"
 msgstr "Lejátszási szint"
 
-#: devices/actiondialog.cpp:578
+#: devices/actiondialog.cpp:602
 msgid "Calculate"
 msgstr "Számítás"
 
-#: devices/actiondialog.cpp:634
-msgid "The destination filename already exists!<hr/>%1"
-msgstr "A cél fájlnév már létezik!<hr/>%1"
+#: devices/actiondialog.cpp:661
+msgid "The destination filename already exists!"
+msgstr "A cél fájlnéve már létezik!<hr/>%1"
 
-#: devices/actiondialog.cpp:637
-msgid "Song already exists!<hr/>%1"
-msgstr "A dal már létezik!<hr/>%1"
+#: devices/actiondialog.cpp:664
+msgid "Song already exists!"
+msgstr "A dal már létezik!"
 
-#: devices/actiondialog.cpp:640
-msgid "Song does not exist!<hr/>%1"
-msgstr "A dal nem létezik!<hr/>%1"
+#: devices/actiondialog.cpp:667
+msgid "Song does not exist!"
+msgstr "A dal nem létezik!"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:670
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
-"permissions.<hr/>%1"
+"permissions."
 msgstr ""
-"Nem sikerült létrehozni a cél könyvtárat!<br/>Ellenőrizd a jogosultságod "
+"Nem sikerült létrehozni a célkönyvtárat!<br/>Ellenőrizd a jogosultságod "
 "szintjét.<hr/>%1"
 
-#: devices/actiondialog.cpp:646
-msgid "Source file no longer exists?<br/><br/<hr/>%1"
-msgstr "A forrás fájl már nem létezik?<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:673
+msgid "Source file no longer exists?"
+msgstr "A forrásfájl már nem létezik?<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:649
-msgid "Failed to copy.<hr/>%1"
-msgstr "Nem sikerült másolni.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to copy."
+msgstr "Nem sikerült másolni."
 
-#: devices/actiondialog.cpp:650
-msgid "Failed to delete.<hr/>%1"
-msgstr "Nem sikerült törölni.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to delete."
+msgstr "Nem sikerült törölni."
 
-#: devices/actiondialog.cpp:653
-msgid "Not connected to device.<hr/>%1"
-msgstr "Nincs csatlakoztatva az eszközhöz.<hr/>%1"
+#: devices/actiondialog.cpp:679
+msgid "Not connected to device."
+msgstr "Nincs csatlakoztatva az eszközhöz."
 
-#: devices/actiondialog.cpp:656
-msgid "Selected codec is not available.<hr/>%1"
-msgstr "A kiválasztott codec nem elérhető.<hr/>%1"
+#: devices/actiondialog.cpp:682
+msgid "Selected codec is not available."
+msgstr "A kiválasztott codec nem elérhető."
 
-#: devices/actiondialog.cpp:659
-msgid "Transcoding failed.<br/><br/<hr/>%1"
-msgstr "Az átkódolás nem sikerült. <br><br/<hr/>%1"
+#: devices/actiondialog.cpp:685
+msgid "Transcoding failed."
+msgstr "Átkódolás sikertelen."
 
-#: devices/actiondialog.cpp:662
+#: devices/actiondialog.cpp:688
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
-"devices.)<hr/>%1"
+"devices.)"
 msgstr ""
 "Nem sikerült létrehozni az átmeneti fájlt.<br/>(MTP eszközre átkódoláshoz "
-"kell.)<hr/>%1"
+"kell.)"
 
-#: devices/actiondialog.cpp:665
-msgid "Failed to read source file.<br/><br/<hr/>%1"
-msgstr "Nem sikerül olvasni a forrás fájlt. <br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:691
+msgid "Failed to read source file."
+msgstr "Nem sikerül olvasni a forrásfájlt. <br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:668
-msgid "Failed to write to destination file.<br/><br/<hr/>%1"
-msgstr "Nem sikerül írni a cél fájlt.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:694
+msgid "Failed to write to destination file."
+msgstr "Nem sikerül írni a célfájlba.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:671
-msgid "No space left on device.<br/><br/<hr/>%1"
-msgstr "Nem maradt hely az eszközön.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:697
+msgid "No space left on device."
+msgstr "Nem maradt hely az eszközön."
 
-#: devices/actiondialog.cpp:674
-msgid "Failed to update metadata.<br/><br/<hr/>%1"
-msgstr "Nem sikerült frissíteni a metaadatokat.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:700
+msgid "Failed to update metadata."
+msgstr "Nem sikerült frissíteni a metaadatokat."
 
-#: devices/actiondialog.cpp:677
-msgid "Failed to download track.<br/><br/<hr/>%1"
-msgstr "Nem sikerül letölteni a számot.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:703
+msgid "Failed to download track."
+msgstr "A szám letöltése sikertelen."
 
-#: devices/actiondialog.cpp:680
-msgid "Failed to lock device.<hr/>%1"
-msgstr "Nem sikerült zárolni az eszközt.<hr/>%1"
+#: devices/actiondialog.cpp:706
+msgid "Failed to lock device."
+msgstr "Nem sikerült zárolni az eszközt."
 
-#: devices/actiondialog.cpp:709
+#: devices/actiondialog.cpp:735
 msgid "Local Music Library Properties"
 msgstr "Helyi zenekönyvtár tulajdonságok"
 
-#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
-msgid "<b>Error</b><br/>"
-msgstr "<b>Hiba</b><br/>"
+#: devices/actiondialog.cpp:776 devices/actiondialog.cpp:790
+#: support/messagebox.cpp:108 support/messagebox.cpp:114
+#: support/messagebox.h:62
+msgid "Error"
+msgstr "Hiba"
 
-#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:780 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Skip"
 msgstr "Kihagy"
 
-#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:781 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Auto Skip"
 msgstr "Automatikusan kihagy"
 
-#: devices/actiondialog.cpp:759
+#: devices/actiondialog.cpp:785
 msgid "Retry"
 msgstr "Újrapróbál"
 
-#: devices/actiondialog.cpp:774
-msgid ""
-"<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
-"td></tr>"
-msgstr ""
-"<tr><td align=\"right\">Előadó:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Szám:</td><td>%3</td></"
-"tr>"
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#: devices/actiondialog.cpp:801 gui/searchpage.cpp:203 po/rc.cpp:374
+#: po/rc.cpp:953 rc.cpp:374 rc.cpp:953
+msgid "Album:"
+msgstr "Album"
 
-#: devices/actiondialog.cpp:781
-msgid ""
-"<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
-"\"right\">Destination file:</td><td>%2</td></tr>"
-msgstr ""
-"<tr><td align=\"right\">Forrásfájl:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Célfájl:</td><td>%2</td></tr>"
+#. i18n: file: tags/tageditor.ui:25
+#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
+#: devices/actiondialog.cpp:802 po/rc.cpp:938 rc.cpp:938
+msgid "Track:"
+msgstr "Szám:"
+
+#: devices/actiondialog.cpp:806
+msgid "Source file:"
+msgstr "Forrás fájl:"
 
-#: devices/actiondialog.cpp:786
-msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
-msgstr "<tr><td align=\"right\">Fájl:</td><td>%1</td></tr>"
+#: devices/actiondialog.cpp:807
+msgid "Destination file:"
+msgstr "Célfájl:"
 
-#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
-#: gui/cachesettings.cpp:230
+#: devices/actiondialog.cpp:809 gui/searchpage.cpp:207
+msgid "File:"
+msgstr "Fájl:"
+
+#: devices/actiondialog.cpp:815 gui/cachesettings.cpp:179
+#: gui/cachesettings.cpp:235
 msgid "Calculating..."
 msgstr "Számol..."
 
-#: devices/actiondialog.cpp:799
+#: devices/actiondialog.cpp:822
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (Becsült)"
 
-#: devices/actiondialog.cpp:802
-msgid ""
-"<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
-"i></tr>"
-msgstr ""
-"<tr><i><td align=\"right\"><i>Hátralévő idő:</i></td><td><i>%5</i></td></i></"
-"tr>"
+#: devices/actiondialog.cpp:824
+msgid "Time remaining:"
+msgstr "Hátralévő idő:"
 
-#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: devices/actiondialog.cpp:847 devices/fsdevice.cpp:762
 #: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "A cache mentése"
 
-#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
+#: devices/albumdetailsdialog.cpp:139 devices/albumdetailsdialog.cpp:236
+#: tags/tageditor.cpp:158 tags/tageditor.cpp:373
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "Alkalmazza a \"Vegyes előadók\" munkakörnyezetet"
 
-#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
+#: devices/albumdetailsdialog.cpp:140 devices/albumdetailsdialog.cpp:260
+#: tags/tageditor.cpp:159 tags/tageditor.cpp:418
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "Visszaállítja a \"Vegyes előadók\" munkakörnyezetet"
 
-#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
-#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
+#: devices/albumdetailsdialog.cpp:141 devices/albumdetailsdialog.cpp:278
+#: tags/tageditor.cpp:161 tags/tageditor.cpp:499
 msgid "Capitalize"
 msgstr "Váltás nagybetűre"
 
-#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
-#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
+#: devices/albumdetailsdialog.cpp:142 devices/albumdetailsdialog.cpp:295
+#: tags/tageditor.cpp:162 tags/tageditor.cpp:528
 msgid "Adjust Track Numbers"
 msgstr "Számok sorszámának beállítása"
 
-#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
+#: devices/albumdetailsdialog.cpp:144 tags/tageditor.cpp:156
 msgid "Tools"
 msgstr "Eszközök"
 
-#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:369
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "Alkalmazza a \"Vegyes előadók\" munkakörnyezetet?"
 
-#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
+#: devices/albumdetailsdialog.cpp:234 tags/tageditor.cpp:371
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -577,11 +634,11 @@ msgstr ""
 "<i>Ez a \"Album előadót\" és \"Előadót\" \"Vegyes előadók\"-ra állítja, és a "
 "\"Címet\" \"Előadó Szám - Szám címe\"</i>"
 
-#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:411
 msgid "Revert \"Various Artists\" workaround"
 msgstr "Visszaállítja a \"Vegyes előadók\" munkakörnyezetet"
 
-#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
+#: devices/albumdetailsdialog.cpp:255 tags/tageditor.cpp:413
 msgid ""
 "<i>Where the 'Album artist' is the same as 'Artist' and the 'Title' is of "
 "the format \"TrackArtist - TrackTitle\", 'Artist' will be taken from 'Title' "
@@ -595,37 +652,27 @@ msgstr ""
 "Wobble\", akkor az \"Előadó\" egyszerűen \"Wibble\", a \"Cím\" pedig \"Wobble"
 "\" lesz.</i>"
 
-#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
+#: devices/albumdetailsdialog.cpp:261 tags/tageditor.cpp:419
 msgid "Revert"
 msgstr "Visszaállít"
 
-#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
+#: devices/albumdetailsdialog.cpp:277 tags/tageditor.cpp:497
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr ""
 "A 'Cím', 'Előadó', 'Előadó lemez' és 'Lemez' kezdőbetűjét nagybetűsre váltja"
 
-#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
+#: devices/albumdetailsdialog.cpp:295 tags/tageditor.cpp:529
 msgid "Adjust track number by:"
 msgstr "A szám sorszámának módosítás ennyivel:"
 
-#: devices/albumdetailsdialog.cpp:335 devices/cddbinterface.cpp:143
-#: devices/deviceoptions.cpp:358 devices/musicbrainz.cpp:202
-#: devices/musicbrainz.cpp:324 gui/mainwindow.cpp:1771 gui/mainwindow.cpp:1784
-#: models/musiclibraryitemroot.cpp:362 models/musiclibraryitemroot.cpp:520
-#: models/playqueuemodel.cpp:325 mpd/mpdparseutils.cpp:249
-#: mpd/mpdparseutils.cpp:409 mpd/song.cpp:228 mpd/song.cpp:233
-#: mpd/song.cpp:272 mpd/song.cpp:299 widgets/groupedview.cpp:260
-msgid "Unknown"
-msgstr "Ismeretlen"
-
 #: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "Lemez olvasása"
 
-#: devices/audiocddevice.cpp:353 gui/mainwindow.cpp:2199
-#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
-#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
+#: devices/audiocddevice.cpp:358 gui/mainwindow.cpp:2345
+#: gui/searchpage.cpp:220 models/albumsmodel.cpp:245 models/musicmodel.cpp:217
+#: models/playlistsmodel.cpp:309 models/playlistsmodel.cpp:324
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "1 Szám (%2)"
@@ -648,7 +695,7 @@ msgid "Failed to open CD device"
 msgstr "Nem sikerült megnyitni a CD-eszközt"
 
 #: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
-#: devices/musicbrainz.cpp:217
+#: devices/musicbrainz.cpp:216
 msgid "Track %1"
 msgstr "Szám %1"
 
@@ -668,19 +715,19 @@ msgstr "CDDB hiba: %1"
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr "Több egyezést találtam. Kérem válaszd ki a megfelelőt az alábbiakból:"
 
-#. i18n: file: devices/albumdetails.ui:170
+#. i18n: file: devices/albumdetails.ui:163
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:66
-#: models/playqueuemodel.cpp:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
-#: rc.cpp:82
+#: models/playqueuemodel.cpp:106 po/rc.cpp:113 replaygain/rgdialog.cpp:128
+#: rc.cpp:113
 msgid "Artist"
 msgstr "Előadó"
 
-#. i18n: file: devices/albumdetails.ui:175
+#. i18n: file: devices/albumdetails.ui:168
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:76
-#: models/playqueuemodel.cpp:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
-#: rc.cpp:85
+#: models/playqueuemodel.cpp:105 po/rc.cpp:116 replaygain/rgdialog.cpp:130
+#: rc.cpp:116
 msgid "Title"
 msgstr "Cím"
 
@@ -757,7 +804,7 @@ msgstr ""
 "előállítani az igazi előadót és eltávolítani az előadó nevét a 'Cím' "
 "jelzőből.<!p>"
 
-#: devices/devicepropertieswidget.cpp:99
+#: devices/devicepropertieswidget.cpp:98
 msgid ""
 "<p>If you enable this, then Cantata will create a cache of the device's "
 "music library. This will help to speed up subsequent library scans (as the "
@@ -775,19 +822,19 @@ msgstr ""
 "egyszerűen kattints a 'frissítés' ikonra az eszközlistán. Ennek hatására a "
 "cache fájlt eltávolítja és az eszköz tartalmát újra átnézi.</p>"
 
-#: devices/devicepropertieswidget.cpp:204
+#: devices/devicepropertieswidget.cpp:209
 msgid "Do not transcode"
 msgstr "Ne kódolja át"
 
-#: devices/devicepropertieswidget.cpp:212
+#: devices/devicepropertieswidget.cpp:216
 msgid "Encoder"
 msgstr "Kódoló"
 
-#: devices/devicepropertieswidget.cpp:228
+#: devices/devicepropertieswidget.cpp:231
 msgid "Transcode to %1"
 msgstr "Átkódolás erre %1"
 
-#: devices/devicepropertieswidget.cpp:259
+#: devices/devicepropertieswidget.cpp:262
 msgctxt "name (size free)"
 msgid "%1 (%2 free)"
 msgstr "%1 (%2 szabad)"
@@ -800,11 +847,11 @@ msgstr "Másolás könyvtárba"
 msgid "Sync"
 msgstr "Sync"
 
-#: devices/devicespage.cpp:71
+#: devices/devicespage.cpp:70
 msgid "Forget Device"
 msgstr "Eszköz elfelejtése"
 
-#: devices/devicespage.cpp:114 devices/remotedevicepropertiesdialog.cpp:60
+#: devices/devicespage.cpp:113 devices/remotedevicepropertiesdialog.cpp:60
 msgid "Add Device"
 msgstr "Eszköz hozzáadása"
 
@@ -813,7 +860,7 @@ msgid "Lookup album and track details?"
 msgstr "Keressem az album és szám részleteit?"
 
 #: devices/devicespage.cpp:433 devices/devicespage.cpp:445
-#: devices/devicespage.cpp:455
+#: devices/devicespage.cpp:455 gui/mainwindow.cpp:589
 msgid "Refresh"
 msgstr "Frissítés"
 
@@ -828,12 +875,12 @@ msgstr "MusicBrainz útján"
 #: devices/devicespage.cpp:452
 msgid ""
 "<p>Which type of refresh do you wish to perform?<ul><li>Partial - Only new "
-"songs are scanned <i>(quick)</i></li><li>Full - All songs are rescanned "
-"<i>(slow)</i></li></ul></p>"
+"songs are scanned <i>(quick)</i></li><li>Full - All songs are rescanned <i>"
+"(slow)</i></li></ul></p>"
 msgstr ""
 "<p>Milyen fajta frissítést szeretne végrehajtani?<ul><li>Részleges - Csak új "
-"számokat keres <i>(gyors)</i></li><li>Teljes - Minden számot újrakeres "
-"<i>(lassú)</i></li></ul></p>"
+"számokat keres <i>(gyors)</i></li><li>Teljes - Minden számot újrakeres <i>"
+"(lassú)</i></li></ul></p>"
 
 #: devices/devicespage.cpp:455
 msgid "Partial"
@@ -843,8 +890,8 @@ msgstr "Részleges"
 msgid "Full"
 msgstr "Teljes"
 
-#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
-#: gui/librarypage.cpp:257
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:213 gui/folderpage.cpp:269
+#: gui/librarypage.cpp:256
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -872,11 +919,11 @@ msgstr "Biztosan le szeretnéd csatlakoztatni <b>%1</b>?"
 msgid "Disconnect"
 msgstr "Leválasztás"
 
-#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1220
 msgid "Please close other dialogs first."
 msgstr "Légy szíves zárd be előbb a másik párbeszédet!"
 
-#: devices/encoders.cpp:77
+#: devices/encoders.cpp:78
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -891,7 +938,7 @@ msgstr ""
 "azonos bitrátánál általában jobb hangminőséget ad mint az MP3. Ésszerű "
 "választás lehet iPod-okhoz és más hordozható médialejátszókhoz."
 
-#: devices/encoders.cpp:82
+#: devices/encoders.cpp:83
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>AAC</b> encoder used by Cantata supports a <a "
@@ -921,21 +968,21 @@ msgstr ""
 "hallgatására. <br/>Bármi <b>120kb/s</b> alatt bárki számára alkalmatlan "
 "lehet és bármi <b>200kb/s</b> fölött túlzó lehet."
 
-#: devices/encoders.cpp:100 devices/encoders.cpp:140
+#: devices/encoders.cpp:101 devices/encoders.cpp:141
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr "Változó bitrátás kódolás várható bitrátája"
 
-#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
-#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:293 devices/encoders.cpp:329
 msgid "Smaller file"
 msgstr "Kisebb fájl"
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:233 devices/encoders.cpp:329
+#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
+#: devices/encoders.cpp:234 devices/encoders.cpp:330
 msgid "Better sound quality"
 msgstr "Jobb hangminőség"
 
-#: devices/encoders.cpp:119
+#: devices/encoders.cpp:120
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -950,7 +997,7 @@ msgstr ""
 "<br>Tökéletlenségei ellenére a felhasználói hang tárolás elterjedt "
 "formátuma, és a hordozható zenejátszók széles köre támogatja. "
 
-#: devices/encoders.cpp:123
+#: devices/encoders.cpp:124
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>MP3</b> encoder used by Cantata supports a <a "
@@ -976,11 +1023,11 @@ msgstr ""
 "hordozható lejátszókon történő hallgatására. <br/>Bármi <b>120kb/s</b> alatt "
 "bárki számára alkalmatlan lehet és bármi <b>205kb/s</b> fölött túlzó lehet."
 
-#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
+#: devices/encoders.cpp:156 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:158
+#: devices/encoders.cpp:159
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -995,7 +1042,7 @@ msgstr ""
 "produkál azonos, vagy jobb minőség  mellett. Az Ogg Vorbis általában kiváló "
 "választás, különösen azokat hordozható zenelejátszók esetén. "
 
-#: devices/encoders.cpp:163
+#: devices/encoders.cpp:164
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Vorbis</b> encoder used by Cantata supports a "
@@ -1028,15 +1075,15 @@ msgstr ""
 "<b>3</b> alatt bárki számára alkalmatlan lehet és bármi <b>8</b> fölött "
 "túlzó lehet."
 
-#: devices/encoders.cpp:183
+#: devices/encoders.cpp:184
 msgid "Quality rating"
 msgstr "Minőségi osztályzat"
 
-#: devices/encoders.cpp:200
+#: devices/encoders.cpp:201
 msgid "Opus"
 msgstr "Opus"
 
-#: devices/encoders.cpp:203
+#: devices/encoders.cpp:204
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1047,7 +1094,7 @@ msgstr ""
 "<a href=http://hu.wikipedia.org/wiki/Opus_(hangformátum)>Opus</a> "
 "szabadalommentes, veszteséges adattömörítést alkalmazó digitális audio codec."
 
-#: devices/encoders.cpp:205
+#: devices/encoders.cpp:206
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Opus</b> encoder used by Cantata supports a <a "
@@ -1075,15 +1122,15 @@ msgstr ""
 "<b>100kb/s</b> alatt bárki számára alkalmatlan lehet és bármi <b>256kb/s</b> "
 "fölött túlzó lehet."
 
-#: devices/encoders.cpp:222 devices/encoders.cpp:319
+#: devices/encoders.cpp:223 devices/encoders.cpp:320
 msgid "Bitrate"
 msgstr "Bitráta"
 
-#: devices/encoders.cpp:241
+#: devices/encoders.cpp:242
 msgid "Apple Lossless"
 msgstr "Apple veszteségmentes"
 
-#: devices/encoders.cpp:244
+#: devices/encoders.cpp:245
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1097,11 +1144,11 @@ msgstr ""
 "(ALAC) veszteségmentes digitális zenetömörítő audio codec. <br>Csak a FLAC-"
 "ot nem támogató Apple zenelejátszók és lejátszók számára javasolt "
 
-#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:260 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:262
+#: devices/encoders.cpp:263
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1116,7 +1163,7 @@ msgstr ""
 "zenetömörítő codec. <br>Ha a zenédet hangminőség-romlás nélkül akarod "
 "tárolni, FLAC kitűnő választás."
 
-#: devices/encoders.cpp:266
+#: devices/encoders.cpp:267
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1142,19 +1189,19 @@ msgstr ""
 "növeli a tömörítési időt, a fájlméret csak kicsit lesz kisebb és nem "
 "ajánlott."
 
-#: devices/encoders.cpp:281
+#: devices/encoders.cpp:282
 msgid "Compression level"
 msgstr "Tömörítési szint"
 
-#: devices/encoders.cpp:291
+#: devices/encoders.cpp:292
 msgid "Faster compression"
 msgstr "Gyorsabb tömörítés"
 
-#: devices/encoders.cpp:298
+#: devices/encoders.cpp:299
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:301
+#: devices/encoders.cpp:302
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1169,7 +1216,7 @@ msgstr ""
 "hangtömörítési eljárás. <br>Csak azon hordozható zenejátszók esetén "
 "ajánlott, amelyek nem támogatják az Ogg Vorbis-t."
 
-#: devices/encoders.cpp:305
+#: devices/encoders.cpp:306
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>Due to the limitations of the proprietary <b>WMA</b> "
@@ -1192,41 +1239,41 @@ msgstr ""
 "történő hallgatására. <br>Minden  <b>112kb/s</b> alatt nem kielégítő zenét "
 "eredményez és bármi <b>182kb/s</b> fölött valószínűleg túllövés."
 
-#: devices/filenameschemedialog.cpp:33
+#: devices/filenameschemedialog.cpp:34
 msgid "Filename Scheme"
 msgstr "Fájlnév-séma"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:62
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "Vegyes előadók"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:63
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Zengetés"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:64
 msgctxt "Example composer"
 msgid "Vivaldi"
 msgstr "Vivaldi"
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:65
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "Now 5001"
 
-#: devices/filenameschemedialog.cpp:56
+#: devices/filenameschemedialog.cpp:66
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "Wobble"
 
-#: devices/filenameschemedialog.cpp:57
+#: devices/filenameschemedialog.cpp:67
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Dance"
 
-#: devices/filenameschemedialog.cpp:101
+#: devices/filenameschemedialog.cpp:121
 msgid ""
 "<p>The following variables will be replaced with their corresponding meaning "
 "for each track name.</p>"
@@ -1234,135 +1281,69 @@ msgstr ""
 "<p>A számok címeiben a következő változók, értelmüknek megfelelően "
 "lecserélésre kerülnek."
 
-#: devices/filenameschemedialog.cpp:103
+#: devices/filenameschemedialog.cpp:123
 msgid ""
-"<tr><th><em>Button</em></th><th><em>Variable</em></th><th><em>Description</"
+"<tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</"
 "em></th></tr>"
 msgstr ""
-"<tr><th><em>Gomb</em></th><th><em>Változó</em></th><th><em>Leírás</em></th></"
+"<tr><th><em>Változó</em></th><th><em>Gomb</em></th><th><em>Leírás</em></th></"
 "tr>"
 
-#: devices/filenameschemedialog.cpp:104
-msgid ""
-"<tr><td>%albumartist%</td><td>%1</td><td>The artist of the album. For most "
-"albums, this will be the same as the <i>Track Artist.</i> For compilations, "
-"this will often be <i>Various Artists.</i> </td></tr>"
-msgstr ""
-"<tr><td>%albumartist%</td><td>%1</td><td>Az album előadója. Az albumok "
-"többségében ugyan az, mint a <i>Szám előadója.</i> A válogatások esetében ez "
-"többnyire <i>Vegyes előadók.</i> lesz. </td></tr>"
-
-#: devices/filenameschemedialog.cpp:106
-msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
-msgstr "<tr><td>%album%</td><td>%1</td><td>Az album címe.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:107
-msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
-msgstr "<tr><td>%composer%</td><td>%1</td><td>A zeneszerző.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:108
-msgid "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
-msgstr ""
-"<tr><td>%artist%</td><td>%1</td><td>Az egyes számok előadója.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:109
-msgid ""
-"<tr><td>%title%</td><td>%1</td><td>The track title (without <i>Track Artist</"
-"i>).</td></tr>"
-msgstr ""
-"<tr><td>%title%</td><td>%1</td><td>A szám címe (a <i>Szám előadója</i> "
-"nélkül).</td></tr>"
-
-#: devices/filenameschemedialog.cpp:110
-msgid ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>The track title (with <i>Track "
-"Artist</i>, if different to <i>Album Artist</i>).</td></tr>"
-msgstr ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>A szám címe (a <i>Szám "
-"előadójával</i>, ha az eltér az <i>Album előadójától</i>).</td></tr>"
-
-#: devices/filenameschemedialog.cpp:111
-msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
-msgstr "<tr><td>%track%</td><td>%1</td><td>A szám sorszáma.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:112
-msgid ""
-"<tr><td>%discnumber%</td><td>%1</td><td>The album number of a multi-album "
-"album. Often compilations consist of several albums.</td></tr>"
-msgstr ""
-"<tr><td>%discnumber%</td><td>%1</td><td>Többlemezes album esetén a lemez "
-"sorszáma. A válogatások sokszor több lemezből állnak.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:113
-msgid ""
-"<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></tr>"
-msgstr "<tr><td>%year%</td><td>%1</td><td>Az album kiadásának éve.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:114
-msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
-msgstr "<tr><td>%genre%</td><td>%1</td><td>Az album műfaja.</td></tr>"
-
-#: devices/fsdevice.cpp:668
+#: devices/fsdevice.cpp:675 gui/albumspage.cpp:287 gui/folderpage.cpp:304
+#: gui/librarypage.cpp:414
 msgid "Updating..."
 msgstr "Frissítés..."
 
-#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: devices/fsdevice.cpp:757 online/onlineservice.cpp:94
 #: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "Cache olvasása"
 
-#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
+#: devices/fsdevice.cpp:769 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
 
-#: devices/mtpdevice.cpp:137
+#: devices/mtpdevice.cpp:153
 msgid "Connecting to device..."
 msgstr "Csatlakozás az eszközhöz..."
 
-#: devices/mtpdevice.cpp:139 devices/mtpdevice.cpp:161
+#: devices/mtpdevice.cpp:155 devices/mtpdevice.cpp:202
 msgid "No devices found"
 msgstr "Nem találtam eszközt"
 
-#: devices/mtpdevice.cpp:173
+#: devices/mtpdevice.cpp:217
 msgid "Connected to device"
 msgstr "Csatlakozva az eszközhöz"
 
-#: devices/mtpdevice.cpp:183
+#: devices/mtpdevice.cpp:230
 msgid "Disconnected from device"
 msgstr "Leválasztva az eszközről"
 
-#: devices/mtpdevice.cpp:250
+#: devices/mtpdevice.cpp:304
 msgid "Updating folders..."
 msgstr "Könyvtárak frissítése"
 
-#: devices/mtpdevice.cpp:257
+#: devices/mtpdevice.cpp:320
 msgid "Updating files..."
 msgstr "Fájlok frissítése..."
 
-#: devices/mtpdevice.cpp:262 devices/remotefsdevice.cpp:465
-#: devices/remotefsdevice.cpp:485
+#: devices/mtpdevice.cpp:334 devices/remotefsdevice.cpp:461
+#: devices/remotefsdevice.cpp:481
 msgid "Updating tracks..."
 msgstr "számok frissítése..."
 
-#: devices/mtpdevice.cpp:281 devices/mtpdevice.cpp:383
-#: models/musiclibraryitemroot.cpp:78 models/musiclibraryitemroot.cpp:117
-#: models/musiclibraryitemroot.cpp:171 models/musiclibraryitemroot.cpp:833
-#: models/musiclibraryitemroot.cpp:1012 mpd/song.cpp:371
-msgid "Various Artists"
-msgstr "Vegyes előadók"
-
-#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
-#: models/devicesmodel.cpp:140
+#: devices/mtpdevice.cpp:1619 devices/remotefsdevice.cpp:564
+#: devices/umsdevice.cpp:100 gui/initialsettingswizard.cpp:57
+#: models/devicesmodel.cpp:157
 msgid "Not Connected"
 msgstr "Nincs csatlakozva"
 
-#: devices/musicbrainz.cpp:320
+#: devices/musicbrainz.cpp:319
 msgid "%1 (Disc %2)"
 msgstr "%1 (Lemez %2)"
 
-#: devices/musicbrainz.cpp:408
+#: devices/musicbrainz.cpp:407
 msgid "No matches found in MusicBrainz"
 msgstr "Nincs találat a MusicBrainz-ben"
 
@@ -1370,7 +1351,7 @@ msgstr "Nincs találat a MusicBrainz-ben"
 msgid "Connection"
 msgstr "Csatlakozás"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:261
 msgid "Music Library"
 msgstr "Zenekönyvtár"
 
@@ -1398,31 +1379,31 @@ msgstr "Biztonságos héj (sshfs)"
 msgid "Locally Mounted Folder"
 msgstr "Helyileg csatolt könyvtár"
 
-#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:612
+#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:608
 msgid "Available"
 msgstr "Elérhető"
 
-#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:610
+#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:606
 msgid "Not Available"
 msgstr "Nem elérhető"
 
-#: devices/remotefsdevice.cpp:315
+#: devices/remotefsdevice.cpp:313
 msgid "Failed to resolve connection details for %1"
 msgstr "Nem sikerült megállapítani a csatlakozási részleteket erre %1"
 
-#: devices/remotefsdevice.cpp:330 devices/remotefsdevice.cpp:345
-#: devices/remotefsdevice.cpp:403
+#: devices/remotefsdevice.cpp:328 devices/remotefsdevice.cpp:343
+#: devices/remotefsdevice.cpp:399
 msgid "Connecting..."
 msgstr "Csatlakozás..."
 
-#: devices/remotefsdevice.cpp:358
+#: devices/remotefsdevice.cpp:356
 msgid ""
 "Password prompting does not work when cantata is started from the "
 "commandline."
 msgstr ""
 "A jelszóbekérés nem működik, amikor a Cantata-t parancssorból indítják."
 
-#: devices/remotefsdevice.cpp:379
+#: devices/remotefsdevice.cpp:375
 msgid ""
 "No suitable ssh-askpass application installed! This is required for entering "
 "passwords."
@@ -1430,50 +1411,50 @@ msgstr ""
 "Nincs megfelelő ssh-jelszóbekérő alkalmazás telepítve. A jelszó beviteléhez "
 "szükséges."
 
-#: devices/remotefsdevice.cpp:386
+#: devices/remotefsdevice.cpp:382
 msgid "Mount point (\"%1\") is not empty!"
 msgstr "Csatolási pont (\"%1\") nem üres!"
 
-#: devices/remotefsdevice.cpp:398
+#: devices/remotefsdevice.cpp:394
 msgid "\"sshfs\" is not installed!"
 msgstr "\"sshfs\" nincs telepítve!"
 
-#: devices/remotefsdevice.cpp:426 devices/remotefsdevice.cpp:446
+#: devices/remotefsdevice.cpp:422 devices/remotefsdevice.cpp:442
 msgid "Disconnecting..."
 msgstr "Leválasztás..."
 
-#: devices/remotefsdevice.cpp:440
+#: devices/remotefsdevice.cpp:436
 msgid "\"fusermount\" is not installed!"
 msgstr "\"fusermount\" nincs telepítve!"
 
-#: devices/remotefsdevice.cpp:461 devices/remotefsdevice.cpp:482
+#: devices/remotefsdevice.cpp:457 devices/remotefsdevice.cpp:478
 msgid "Failed to connect to \"%1\""
 msgstr "Nem sikerült csatlakozni ehhez \"%1\""
 
-#: devices/remotefsdevice.cpp:462 devices/remotefsdevice.cpp:497
+#: devices/remotefsdevice.cpp:458 devices/remotefsdevice.cpp:493
 msgid "Failed to disconnect from \"%1\""
 msgstr "Nem sikerült leválasztani erről \"%1\""
 
-#: devices/remotefsdevice.cpp:573
+#: devices/remotefsdevice.cpp:569
 msgid "Capacity Unknown"
 msgstr "Kapacitás ismeretlen"
 
-#. i18n: file: gui/coverdialog.ui:30
+#. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (text), widget (QPushButton, search)
-#: devices/synccollectionwidget.cpp:53 gui/stdactions.cpp:92
-#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
+#: devices/synccollectionwidget.cpp:54 gui/mainwindow.cpp:323
+#: online/podcastsearchdialog.cpp:334 po/rc.cpp:404 rc.cpp:404
 msgid "Search"
 msgstr "Keresés"
 
-#: devices/synccollectionwidget.cpp:62
+#: devices/synccollectionwidget.cpp:63
 msgid "Check Items"
 msgstr "Tételek kiválasztása"
 
-#: devices/synccollectionwidget.cpp:64
+#: devices/synccollectionwidget.cpp:65
 msgid "Uncheck Items"
 msgstr "Tételek kiválasztásának törlése"
 
-#: devices/synccollectionwidget.cpp:266
+#: devices/synccollectionwidget.cpp:272
 msgid "Nothing selected"
 msgstr "Semmi sincs kiválasztva"
 
@@ -1497,7 +1478,7 @@ msgstr "Szinkronizálás"
 msgid "Device and library are in sync."
 msgstr "Az eszköz és a könyvtár szinkronban van."
 
-#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:190
+#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:188
 msgid "Not Scanned"
 msgstr "Nincs átnézve"
 
@@ -1505,21 +1486,21 @@ msgstr "Nincs átnézve"
 msgid " (recommended)"
 msgstr " (ajánlott)"
 
-#: dynamic/dynamic.cpp:208
+#: dynamic/dynamic.cpp:215
 msgid "Start Dynamic Playlist"
 msgstr "Dinamikus lejátszási lista indítása"
 
-#: dynamic/dynamic.cpp:209
+#: dynamic/dynamic.cpp:216
 msgid "Stop Dynamic Mode"
 msgstr "Dinamikus mód leállítása"
 
-#: dynamic/dynamic.cpp:257
+#: dynamic/dynamic.cpp:264
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "1 Szabály"
 msgstr[1] "%1 Szabályok"
 
-#: dynamic/dynamic.cpp:396
+#: dynamic/dynamic.cpp:403
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
@@ -1527,71 +1508,71 @@ msgstr ""
 "Telepítened kell a  \"perl\"-t a rendszeredre, a Cantata dinamikus módjának "
 "működéséhez."
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:410
 msgid "Failed to locate rules file - %1"
 msgstr "Nem találom a szabályok fájlt - %1"
 
-#: dynamic/dynamic.cpp:411
+#: dynamic/dynamic.cpp:418
 msgid "Failed to remove previous rules file - %1"
 msgstr "Nem sikerült eltávolítani a korábbi szabályok fájlt - %1"
 
-#: dynamic/dynamic.cpp:416
+#: dynamic/dynamic.cpp:423
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "Nem sikerült telepíteni a szabályok fájlt - %1 -> %2"
 
-#: dynamic/dynamic.cpp:729
+#: dynamic/dynamic.cpp:736
 msgid "Dynamizer has been terminated."
 msgstr "A dinamizáló befejeződött."
 
-#: dynamic/dynamic.cpp:816
+#: dynamic/dynamic.cpp:823 mpd/mpdconnection.cpp:150
 msgid "Uknown"
 msgstr "Ismeretlen"
 
-#: dynamic/dynamic.cpp:818
+#: dynamic/dynamic.cpp:825
 msgid "Loading list of rules"
 msgstr "Szabálylista betöltése"
 
-#: dynamic/dynamic.cpp:819
+#: dynamic/dynamic.cpp:826
 msgid "Saving rule"
 msgstr "Szabályok mentése"
 
-#: dynamic/dynamic.cpp:820
+#: dynamic/dynamic.cpp:827
 msgid "Deleting rule"
 msgstr "Szabályok törlése"
 
-#: dynamic/dynamic.cpp:821
+#: dynamic/dynamic.cpp:828
 msgid "Setting active rule"
 msgstr "Aktív szabályok beállítása"
 
-#: dynamic/dynamic.cpp:822
+#: dynamic/dynamic.cpp:829
 msgid "Stopping dynamizer"
 msgstr "Dinamizáló leállítása"
 
-#: dynamic/dynamic.cpp:823
+#: dynamic/dynamic.cpp:830
 msgid "Requesting ID details"
 msgstr "Azonosító-részletek bekérése"
 
-#: dynamic/dynamic.cpp:826
+#: dynamic/dynamic.cpp:833
 msgid "Awaiting response for previous command. (%1)"
 msgstr "Választ vár a korábbi parancshoz. (%1) "
 
-#: dynamic/dynamic.cpp:981
+#: dynamic/dynamic.cpp:988
 msgid "Dynamizer is not active"
 msgstr "Dinamizáló nem aktív"
 
-#: dynamic/dynamic.cpp:989
+#: dynamic/dynamic.cpp:996
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "Nem sikerült helyreállítani a dinamika szabálylistát. (%1) "
 
-#: dynamic/dynamic.cpp:1020
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to delete rules file. (%1)"
 msgstr "Nem sikerült törölni a dinamika szabálylistát. (%1) "
 
-#: dynamic/dynamic.cpp:1027
+#: dynamic/dynamic.cpp:1034
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Nem sikerült ellenőrizni a dinamizáló állapotát. (%1) "
 
-#: dynamic/dynamic.cpp:1036
+#: dynamic/dynamic.cpp:1043
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "Nem sikerült helyreállítani jelenlegi dinamika-szabályokat. (%1) "
 
@@ -1607,11 +1588,11 @@ msgstr "Dinamikaszabályok hozzáadása"
 msgid "Edit Dynamic Rules"
 msgstr "Dinamikaszabályok szerkesztése"
 
-#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:151
+#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:150
 msgid "Remove Dynamic Rules"
 msgstr "Dinamikaszabályok eltávolítása"
 
-#: dynamic/dynamicpage.cpp:150
+#: dynamic/dynamicpage.cpp:149
 msgid ""
 "Are you sure you wish to remove the selected rules?\n"
 "This cannot be undone."
@@ -1625,18 +1606,18 @@ msgstr "Dinamikaszabály"
 
 #. i18n: file: dynamic/dynamicrules.ui:53
 #. i18n: ectx: property (text), widget (QPushButton, addBtn)
-#: dynamic/dynamicruledialog.cpp:136 po/rc.cpp:280 rc.cpp:280
+#: dynamic/dynamicruledialog.cpp:145 po/rc.cpp:341 rc.cpp:341
 msgid "Add"
 msgstr "Hozzáad"
 
-#: dynamic/dynamicruledialog.cpp:202
+#: dynamic/dynamicruledialog.cpp:211
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr "<i><b>HIBA</b>: Az 'Évtől...' kisebb legyen mint az 'Évig...'</i>"
 
-#: dynamic/dynamicruledialog.cpp:205
+#: dynamic/dynamicruledialog.cpp:214
 msgid ""
-"<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 "
-"years)</i>"
+"<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
+"</i>"
 msgstr "<i><b>HIBA:</b> A dátumtartomány túl nagy (legfeljebb %1 év lehet)</i>"
 
 #: dynamic/dynamicrulesdialog.cpp:68
@@ -1647,27 +1628,27 @@ msgstr "Hasonló előadók"
 msgid "AlbumArtist"
 msgstr "AlbumElőadó"
 
-#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: file: devices/filenameschemedialog.ui:102
 #. i18n: ectx: property (text), widget (QPushButton, composer)
-#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:212 rc.cpp:212
 msgid "Composer"
 msgstr "Zeneszerző"
 
-#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:48
+#: models/playqueuemodel.cpp:107 replaygain/rgdialog.cpp:129
 msgid "Album"
 msgstr "Lemez"
 
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:106
-#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:112
+#: po/rc.cpp:254 po/rc.cpp:380 rc.cpp:254 rc.cpp:380
 msgid "Genre"
 msgstr "Műfaj"
 
@@ -1740,88 +1721,87 @@ msgstr "Szabályok felülírása"
 msgid "Saving %1"
 msgstr "Mentés %1"
 
-#: gui/cachesettings.cpp:168
+#: gui/cachesettings.cpp:173
 msgid "Deleting..."
 msgstr "Törlés..."
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Name"
 msgstr "Név"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Item Count"
 msgstr "Elemek számolása"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Space Used"
 msgstr "Felhasznált hely"
 
-#: gui/cachesettings.cpp:234
+#: gui/cachesettings.cpp:239
 msgid "Total space used: %1"
 msgstr "Teljes felhasznált terület: %1"
 
-#: gui/cachesettings.cpp:245
+#: gui/cachesettings.cpp:250
 msgid ""
-"To speed up loading of the music library, Cantata caches a local copy of the "
-"MPD listing. Cantata might also have cached covers, or lyrics, if these have "
-"been downloaded and could not be saved into the MPD folder (because Cantata "
-"cannot access it, or you have configured Cantata to not save these items "
-"there). Below is a summary of Cantata's cache usage."
+"Cantata caches a local copy of the MPD listing to speed up loading of the "
+"music library. Cantata might also have cached covers, lyrics, or artist "
+"images, if these have been downloaded and could not be saved into the MPD "
+"folder (because Cantata cannot access it, or you have configured Cantata to "
+"not save these items there). Below is a summary of Cantata's current cache "
+"usage."
 msgstr ""
-"Hogy a zenekönyvtár feltöltését gyorsítsa, a Cantata az MPD listájából helyi "
-"másolatot olvas be. A cache be tehet borítókat, vagy dalszövegeket is, "
-"amennyiben ezek letöltésre kerültek, de az MPD-könyvtárába nem menthetők "
-"(vagy azért, mert a Cantata nem éri el, vagy a Cantata-t úgy állítottad be, "
-"hogy ne mentse azokat oda). Alább olvasható a Cantata cache használatáról "
+"A Cantata az MPD listájából a cache-ba másolatot készít a zenekönyvtár "
+"gyorsabb betöltésére. A Cantata a borítókat, dalszövegeket, vagy előadói "
+"képeket is tárolhatja ideiglenesen, ha ezek letöltötte, de az MPD "
+"könyvtárába nem menthetők (mivel a Cantata nem éri el, vagy úgy állítottad "
+"be, hogy ne mentse azokat oda). Lent olvasható a Cantata cache használatáról "
 "egy összegzés."
 
-#: gui/cachesettings.cpp:257
+#: gui/cachesettings.cpp:263
 msgid "Covers"
 msgstr "Borítók"
 
-#: gui/cachesettings.cpp:258
+#: gui/cachesettings.cpp:264
+msgid "Scaled Covers"
+msgstr "Méretarányos borítók"
+
+#: gui/cachesettings.cpp:265
 msgid "Backdrops"
 msgstr "Hátterek"
 
-#: gui/cachesettings.cpp:263 gui/interfacesettings.cpp:167
-#: gui/mainwindow.cpp:283 gui/preferencesdialog.cpp:85
-#: widgets/groupedview.cpp:256
-msgid "Streams"
-msgstr "Stream-ek"
+#: gui/cachesettings.cpp:271
+msgid "Stream Listings"
+msgstr "Hangfolyamok (stream-ek) listája"
 
-#: gui/cachesettings.cpp:264
+#: gui/cachesettings.cpp:274
 msgid "Jamendo"
 msgstr "Jamedo"
 
-#: gui/cachesettings.cpp:265
+#: gui/cachesettings.cpp:275
 msgid "Magnatune"
 msgstr "Magnatune"
 
-#: gui/cachesettings.cpp:266
+#: gui/cachesettings.cpp:276
 msgid "Podcast Directories"
 msgstr "Podcast-könyvtárak"
 
-#: gui/cachesettings.cpp:273
+#: gui/cachesettings.cpp:285
 msgid "Delete All"
 msgstr "Minden törlése"
 
-#: gui/cachesettings.cpp:312
+#: gui/cachesettings.cpp:324
 msgid "Delete all '%1' items?"
 msgstr "Törli mind a '%1' tételt?"
 
-#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
+#: gui/cachesettings.cpp:325 gui/cachesettings.cpp:335
 msgid "Delete Cache Items"
 msgstr "Cache tételek törlése"
 
-#: gui/cachesettings.cpp:322
+#: gui/cachesettings.cpp:334
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr "<p>Innentől kezdve mindent töröl?<ul>%1</ul></p>"
 
-#: gui/coverdialog.cpp:151 gui/main.cpp:231
-msgid "Last.fm"
-msgstr "Last.fm"
-
-#: gui/coverdialog.cpp:165
+#: gui/coverdialog.cpp:124
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1832,53 +1812,39 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:184
-msgctxt ""
-"Google\n"
-"width x height (file size)"
-msgid ""
-"Google\n"
-"%1 x %2 (%3)"
-msgstr ""
-"Google\n"
-"%1 x %2 (%3)"
-
-#: gui/coverdialog.cpp:204
+#: gui/coverdialog.cpp:126
 msgctxt ""
-"Discogs\n"
+"name\n"
 "width x height"
 msgid ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 msgstr ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 
-#: gui/coverdialog.cpp:238
-msgctxt ""
-"Current Cover\n"
-"width x height"
-msgid ""
-"Current Cover\n"
-"%1 x %2"
-msgstr ""
-"Jelenlegi borító\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:162
+msgid "Current Cover"
+msgstr "Aktuális borító"
+
+#: gui/coverdialog.cpp:211 gui/coverdialog.cpp:411
+msgid "CoverArt Archive"
+msgstr "CoverArt archívum"
 
-#: gui/coverdialog.cpp:256
+#: gui/coverdialog.cpp:242
 msgid "Image"
 msgstr "Kép"
 
-#: gui/coverdialog.cpp:259
+#: gui/coverdialog.cpp:245
 msgid "Downloading..."
 msgstr "Letöltés..."
 
-#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
+#: gui/coverdialog.cpp:290 gui/coverdialog.cpp:325
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "Kép (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:446
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
@@ -1886,7 +1852,7 @@ msgstr ""
 "<p>Erről az előadóról már van képünk és a fájl nem írható.<p></p><i>%1</i></"
 "p>"
 
-#: gui/coverdialog.cpp:433
+#: gui/coverdialog.cpp:447
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
@@ -1894,13 +1860,16 @@ msgstr ""
 "<p>Ehhez az albumhoz már van borítónk, és a fájl nem írható.<p></p><i>%1</"
 "i></p>"
 
-#: gui/coverdialog.cpp:440 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:234
-msgctxt "Album by Artist"
-msgid "%1 by %2"
-msgstr "%1 előadja %2"
+#: gui/coverdialog.cpp:452
+msgid "'%1' Artist Image"
+msgstr "%1 Előadó képe"
+
+#: gui/coverdialog.cpp:454
+msgctxt "'Artist - Album' Album Cover"
+msgid "'%1 - %2' Album Cover"
+msgstr "'%1 - %2' Album borító"
 
-#: gui/coverdialog.cpp:579
+#: gui/coverdialog.cpp:582
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1908,27 +1877,23 @@ msgstr ""
 "Nem sikerült a borítót beállítani\n"
 "Nem tudtam átmeneti fájlba tölteni!"
 
-#: gui/coverdialog.cpp:607
+#: gui/coverdialog.cpp:616
 msgid "Failed to download image!"
 msgstr "A képet nem tudtam letölteni!"
 
-#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
+#: gui/coverdialog.cpp:875 gui/coverdialog.cpp:877
 msgid "Load Local Cover"
 msgstr "Helyi borító letöltése"
 
-#: gui/coverdialog.cpp:795
-msgid "Images (*.png *.jpg)"
-msgstr "Képek (*.png *.jpg)"
-
-#: gui/coverdialog.cpp:800
+#: gui/coverdialog.cpp:882
 msgid "File is already in list!"
 msgstr "A fájl már szerepel a listában!"
 
-#: gui/coverdialog.cpp:804
+#: gui/coverdialog.cpp:886
 msgid "Failed to read image!"
 msgstr "Nem tudtam olvasni a képet!"
 
-#: gui/coverdialog.cpp:817
+#: gui/coverdialog.cpp:899
 msgid "Display"
 msgstr "Mutatás"
 
@@ -1940,12 +1905,12 @@ msgstr "Mutatás"
 #. i18n: ectx: property (text), widget (QPushButton, removeBtn)
 #. i18n: file: streams/streamssettings.ui:73
 #. i18n: ectx: property (text), widget (QPushButton, removeButton)
-#: gui/coverdialog.cpp:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
-#: rc.cpp:286 rc.cpp:765
+#: gui/coverdialog.cpp:900 gui/stdactions.cpp:90 po/rc.cpp:347 po/rc.cpp:917
+#: rc.cpp:347 rc.cpp:917
 msgid "Remove"
 msgstr "Eltávolítás"
 
-#: gui/coverdialog.cpp:1181
+#: gui/coverdialog.cpp:1333
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1953,7 +1918,7 @@ msgstr ""
 "A borító beállítása sikertelen!\n"
 "Nem tudtam másolatot készíteni!"
 
-#: gui/coverdialog.cpp:1190
+#: gui/coverdialog.cpp:1342
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1961,7 +1926,7 @@ msgstr ""
 "A borító beállítása sikertelen!\n"
 "Nem tudtam menteni az eredetit!"
 
-#: gui/coverdialog.cpp:1239
+#: gui/coverdialog.cpp:1391
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1969,163 +1934,251 @@ msgstr ""
 "A borító beállítása sikertelen!\n"
 "Nem tudtam másolni a fájlt ide '%1'!"
 
-#: gui/folderpage.cpp:45
+#: gui/coverdialog.cpp:1449 models/onlineservicesmodel.cpp:157
+msgid "Searching..."
+msgstr "Keresés..."
+
+#: gui/folderpage.cpp:44
 msgid "Open In File Manager"
 msgstr "Megnyitás fájlkezelőben"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Established"
 msgstr "Kapcsolat felállt"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Failed"
 msgstr "Csatlakozás sikertelen"
 
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
+#. i18n: file: support/shortcutssettingswidget.ui:78
+#. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
 #. i18n: file: support/shortcutssettingswidget.ui:78
 #. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
-#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
-#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
+#: gui/interfacesettings.cpp:48 gui/playbacksettings.cpp:46
+#: online/magnatuneservice.cpp:159 po/rc.cpp:6 po/rc.cpp:660 po/rc.cpp:751
+#: po/rc.cpp:778 po/rc.cpp:932 rc.cpp:6 rc.cpp:660 rc.cpp:751 rc.cpp:778
+#: rc.cpp:932
 msgid "None"
 msgstr "Nincs"
 
-#: gui/interfacesettings.cpp:40
+#: gui/interfacesettings.cpp:49 gui/interfacesettings.cpp:160
 msgid "Small"
 msgstr "Kicsi"
 
-#: gui/interfacesettings.cpp:41
+#: gui/interfacesettings.cpp:50
 msgid "Medium"
 msgstr "Közepes"
 
-#: gui/interfacesettings.cpp:42
+#: gui/interfacesettings.cpp:51 gui/interfacesettings.cpp:159
 msgid "Large"
 msgstr "Nagy"
 
-#: gui/interfacesettings.cpp:43
+#: gui/interfacesettings.cpp:52
 msgid "Extra Large"
 msgstr "Nagyon nagy"
 
-#: gui/interfacesettings.cpp:48
+#: gui/interfacesettings.cpp:57
+msgid "Basic Tree (No Icons)"
+msgstr "Alap fastruktúra (nincs ikon)"
+
+#: gui/interfacesettings.cpp:58
 msgid "Simple Tree"
 msgstr "Egyszerű fa"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:59
 msgid "Detailed Tree"
 msgstr "Részletes fa"
 
-#. i18n: file: gui/interfacesettings.ui:329
+#. i18n: file: gui/interfacesettings.ui:449
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
+#: gui/interfacesettings.cpp:61 po/rc.cpp:639 rc.cpp:639
 msgid "Grouped Albums"
 msgstr "Csoportosított lemezek"
 
-#: gui/interfacesettings.cpp:53
+#: gui/interfacesettings.cpp:63
 msgid "List"
 msgstr "Lista"
 
-#: gui/interfacesettings.cpp:55
+#: gui/interfacesettings.cpp:65
 msgid "Icon/List"
 msgstr "Ikon, vagy lista"
 
-#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+#. i18n: file: gui/interfacesettings.ui:454
+#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
+#: gui/interfacesettings.cpp:68 po/rc.cpp:642 rc.cpp:642
+msgid "Table"
+msgstr "Táblázat"
+
+#: gui/interfacesettings.cpp:104
+msgid "Play queue"
+msgstr "Sor lejátszása"
+
+#. i18n: file: gui/interfacesettings.ui:182
+#. i18n: ectx: attribute (title), widget (QWidget, tab)
+#: gui/interfacesettings.cpp:105 gui/mainwindow.cpp:307 po/rc.cpp:569
+#: rc.cpp:569
+msgid "Artists"
+msgstr "Előadók"
+
+#: gui/interfacesettings.cpp:107 gui/interfacesettings.cpp:138
+#: gui/mainwindow.cpp:309
 msgid "Folders"
 msgstr "Könyvtárak"
 
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:337
+#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
+#: gui/interfacesettings.cpp:108 gui/mainwindow.cpp:310 po/rc.cpp:609
+#: rc.cpp:609
+msgid "Playlists"
+msgstr "Lejátszási listák"
+
+#: gui/interfacesettings.cpp:110
+msgid "Dynamic Playlists"
+msgstr "Dinamikus lejátszási lista"
+
+#: gui/interfacesettings.cpp:114
+msgid "Streams (e.g. Radio Stations)"
+msgstr "Hangfolyam (stream-ek, pl. rádióállomások)"
+
+#: gui/interfacesettings.cpp:121
+msgid "Online Services - Jamendo, Maganatune, SoundCloud, and Podcasts"
+msgstr ""
+"Online szolgáltatások -  Jamendo, Maganatune, SoundCloud és podcast-ok."
+
+#: gui/interfacesettings.cpp:128
+msgid "Devices - UMS, MTP (e.g. Android), and AudioCDs"
+msgstr "Eszközök - UMS, MPT (pl. Android) és hang CD-k."
+
+#: gui/interfacesettings.cpp:134
+msgid "Search (via MPD)"
+msgstr "Keresés (MPD-n keresztül)"
+
+#: gui/interfacesettings.cpp:135
+msgid "Info - Current song information (artist, album, and lyrics)"
+msgstr "Infó. - a jelenlegi szám adatai (előadó, album és dalszöveg)"
+
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#: gui/interfacesettings.cpp:165 gui/interfacesettings.cpp:168
-#: gui/interfacesettings.cpp:171 gui/interfacesettings.cpp:174 po/rc.cpp:472
-#: po/rc.cpp:491 po/rc.cpp:512 po/rc.cpp:536 rc.cpp:472 rc.cpp:491 rc.cpp:512
-#: rc.cpp:536
+#: gui/interfacesettings.cpp:139 po/rc.cpp:554 po/rc.cpp:572 po/rc.cpp:591
+#: po/rc.cpp:612 po/rc.cpp:636 rc.cpp:554 rc.cpp:572 rc.cpp:591 rc.cpp:612
+#: rc.cpp:636
 msgid "Style:"
 msgstr "Stílus:"
 
-#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
-#: gui/preferencesdialog.cpp:89
-msgid "Online"
-msgstr "Online"
+#: gui/interfacesettings.cpp:161
+msgid "Tab-bar"
+msgstr "Lapsáv (fülek)"
 
-#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
-msgid "Devices"
-msgstr "Eszközök"
+#: gui/interfacesettings.cpp:162
+msgid "Left"
+msgstr "Bal"
+
+#: gui/interfacesettings.cpp:162
+msgid "Right"
+msgstr "Jobb"
+
+#: gui/interfacesettings.cpp:163
+msgid "Top"
+msgstr "Felső"
 
-#: gui/interfacesettings.cpp:178
-msgid "Grouped by 'Album Artist'"
-msgstr "'Album Előadó' szerint csoportosítva"
+#: gui/interfacesettings.cpp:164
+msgid "Bottom"
+msgstr "Alsó"
 
-#: gui/interfacesettings.cpp:179
-msgid "Grouped under 'Various Artists'"
-msgstr "'Vegyes előadók' alatt csoportosítva"
+#: gui/interfacesettings.cpp:391
+msgid "System default"
+msgstr "Rendszer alapbeállítása"
 
-#: gui/main.cpp:213 gui/mainwindow.cpp:1941 gui/trayitem.cpp:98
-#: gui/trayitem.cpp:100 gui/trayitem.cpp:135 gui/trayitem.cpp:199
-#: gui/trayitem.cpp:209 gui/trayitem.cpp:212 gui/trayitem.cpp:215
-#: gui/trayitem.cpp:228 gui/trayitem.cpp:230
+#: gui/main.cpp:224 gui/mainwindow.cpp:2075 gui/trayitem.cpp:112
+#: gui/trayitem.cpp:118 gui/trayitem.cpp:153 gui/trayitem.cpp:217
+#: gui/trayitem.cpp:227 gui/trayitem.cpp:230 gui/trayitem.cpp:233
+#: gui/trayitem.cpp:246 gui/trayitem.cpp:248
 msgid "Cantata"
 msgstr "Cantata"
 
-#: gui/main.cpp:214
+#: gui/main.cpp:225
 msgid "A KDE client for MPD"
 msgstr "KDE kliens az MPD-nek"
 
-#: gui/main.cpp:216
-msgid "Copyright (c) 2011–2013 Craig Drummond"
-msgstr "Copyright (c) 2011-2013 Craig Drummond "
+#: gui/main.cpp:227
+msgid "© 2011-2014 Craig Drummond"
+msgstr "© 2011-2014 Craig Drummond"
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Maintainer"
 msgstr "Karban tartó"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "UI Improvements"
 msgstr "UI fejlesztések"
 
-#: gui/main.cpp:222
+#: gui/main.cpp:233
 msgid "Sander Knopper"
 msgstr "Sander Knopper"
 
-#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
+#: gui/main.cpp:233 gui/main.cpp:234 gui/main.cpp:235 gui/main.cpp:236
 msgid "QtMPC author"
 msgstr "QtMPC készítője"
 
-#: gui/main.cpp:223
+#: gui/main.cpp:234
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:224
+#: gui/main.cpp:235
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:225
+#: gui/main.cpp:236
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
@@ -2133,101 +2186,105 @@ msgstr ""
 "Hátterek tartalmi nézete (kérlek, gondolkodj el a saját zene inspirálta "
 "műved feltöltésén a fanart.tv-re)"
 
-#: gui/main.cpp:230
+#: gui/main.cpp:238
 msgid "Wikipedia"
 msgstr "Wikipédia"
 
-#: gui/main.cpp:230 gui/main.cpp:231
+#: gui/main.cpp:238 gui/main.cpp:239
 msgid "Context view metadata"
 msgstr "A metaadatok tartalmi nézete"
 
-#: gui/main.cpp:235
+#: gui/main.cpp:239
+msgid "Last.fm"
+msgstr "Last.fm"
+
+#: gui/main.cpp:243
 msgid "URL to open"
 msgstr "URL megnyitásra"
 
-#: gui/mainwindow.cpp:238
+#: gui/mainwindow.cpp:269
 msgid "Quit"
 msgstr "Megszakít"
 
-#: gui/mainwindow.cpp:242
+#: gui/mainwindow.cpp:273
 msgid "Show Window"
 msgstr "Ablak mutatása"
 
 #. i18n: file: gui/initialsettingswizard.ui:469
 #. i18n: ectx: property (text), widget (QPushButton, connectButton)
-#: gui/mainwindow.cpp:245 po/rc.cpp:418 rc.cpp:418
+#: gui/mainwindow.cpp:276 po/rc.cpp:482 rc.cpp:482
 msgid "Connect"
 msgstr "Csatlakozás"
 
-#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
+#: gui/mainwindow.cpp:277 gui/preferencesdialog.cpp:83
 msgid "Collection"
 msgstr "Gyűjtemény"
 
-#: gui/mainwindow.cpp:247
+#: gui/mainwindow.cpp:278
 msgid "Outputs"
 msgstr "Kimenetek"
 
-#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
+#: gui/mainwindow.cpp:279 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "A szám után leáll"
 
-#: gui/mainwindow.cpp:249
+#: gui/mainwindow.cpp:280
 msgid "Add To Stored Playlist"
 msgstr "A tárolt lejátszási listához hozzáad"
 
-#: gui/mainwindow.cpp:250
+#: gui/mainwindow.cpp:281
 msgid "Remove From Play Queue"
 msgstr "A lejátszási sorból töröl"
 
-#: gui/mainwindow.cpp:251
+#: gui/mainwindow.cpp:282
 msgid "Copy Track Info"
 msgstr "Száminformációk másolása"
 
-#: gui/mainwindow.cpp:252
+#: gui/mainwindow.cpp:283
 msgid "Crop"
 msgstr "Vágás"
 
-#: gui/mainwindow.cpp:253
+#: gui/mainwindow.cpp:284
 msgid "Shuffle Tracks"
 msgstr "Számok keverése"
 
-#: gui/mainwindow.cpp:254
+#: gui/mainwindow.cpp:285
 msgid "Shuffle Albums"
 msgstr "Albumok keverése"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:286
 msgid "Add Stream URL"
 msgstr "Stream URL hozzáadása"
 
-#: gui/mainwindow.cpp:256
+#: gui/mainwindow.cpp:287
 msgid "Clear"
 msgstr "Töröl"
 
-#: gui/mainwindow.cpp:257
+#: gui/mainwindow.cpp:288
 msgid "Expanded Interface"
 msgstr "Lejátszó kinyitása"
 
-#: gui/mainwindow.cpp:258
+#: gui/mainwindow.cpp:289
 msgid "Show Current Song Information"
 msgstr "A lejátszó kibontása"
 
-#: gui/mainwindow.cpp:261
+#: gui/mainwindow.cpp:292
 msgid "Full Screen"
 msgstr "Teljes képernyő"
 
-#: gui/mainwindow.cpp:263
+#: gui/mainwindow.cpp:294
 msgid "Random"
 msgstr "Véletlenszerűen"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:295
 msgid "Repeat"
 msgstr "Ismétlés"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid "Single"
 msgstr "Egyszeri"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
@@ -2235,11 +2292,11 @@ msgstr ""
 "'Egyszeri' beállítása esetén a lejátszás az aktuális dal után leáll, vagy a "
 "dal ismétlődik, ha az 'Ismétlés' engedélyezett."
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid "Consume"
 msgstr "Elhasznál"
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
@@ -2247,107 +2304,108 @@ msgstr ""
 "Amikor az 'Elhasznál' aktív, a dal a lejátszása után kikerül a lejátszási "
 "sorból."
 
-#: gui/mainwindow.cpp:267
-msgid "Search Play Queue"
-msgstr "Lejátszási sor keresése"
-
-#: gui/mainwindow.cpp:269
+#: gui/mainwindow.cpp:298
 msgid "Set Priority"
 msgstr "Prioritás beállítása"
 
-#: gui/mainwindow.cpp:271
+#: gui/mainwindow.cpp:300
 msgid "Play Stream"
 msgstr "Hangfolyam (stream) lejátszása"
 
-#: gui/mainwindow.cpp:273
+#: gui/mainwindow.cpp:302
 msgid "Locate In Library"
 msgstr "Könyvtárban megkeres"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:304
 msgid "Edit Song Tags"
 msgstr "Dal címkéjének szerkesztése"
 
-#. i18n: file: gui/interfacesettings.ui:304
+#. i18n: file: gui/interfacesettings.ui:429
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
+#: gui/mainwindow.cpp:306 po/rc.cpp:633 rc.cpp:633
 msgid "Play Queue"
 msgstr "Sor lejátszása"
 
-#. i18n: file: gui/interfacesettings.ui:27
-#. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
-msgid "Artists"
-msgstr "Előadók"
-
-#. i18n: file: gui/interfacesettings.ui:202
-#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
-#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
-msgid "Playlists"
-msgstr "Lejátszási listák"
-
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:312
 msgid "Dynamic"
 msgstr "Dinamikus"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:315 gui/preferencesdialog.cpp:89
+#: widgets/groupedview.cpp:251
+msgid "Streams"
+msgstr "Stream-ek"
+
+#: gui/mainwindow.cpp:318 gui/preferencesdialog.cpp:94
+msgid "Online"
+msgstr "Online"
+
+#: gui/mainwindow.cpp:321
+msgid "Devices"
+msgstr "Eszközök"
+
+#: gui/mainwindow.cpp:324
 msgid "Expand All"
 msgstr "Mind kibontása"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:325
 msgid "Collapse All"
 msgstr "Mind elrejtése"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:326
 msgid "Remove All Songs"
 msgstr "Összes dal eltávolítása"
 
-#: gui/mainwindow.cpp:398
+#: gui/mainwindow.cpp:456
 msgid "Info"
 msgstr "Info"
 
-#: gui/mainwindow.cpp:405
-msgid "Auto Hide"
-msgstr "Automatikus elrejtés"
-
-#: gui/mainwindow.cpp:411
-msgid "Monochrome Icons"
-msgstr "Fekete-fehér ikonok"
-
-#: gui/mainwindow.cpp:541
+#: gui/mainwindow.cpp:585
 msgid "Server information..."
 msgstr "Kiszolgáló-információk"
 
-#: gui/mainwindow.cpp:552
+#: gui/mainwindow.cpp:588
+msgid "Refresh Database"
+msgstr "Adatbázis-frissítés"
+
+#: gui/mainwindow.cpp:602
 msgid "Configure Cantata..."
 msgstr "Cantata beállítása..."
 
-#: gui/mainwindow.cpp:559
+#: gui/mainwindow.cpp:612
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "Cantata névjegye..."
 
-#: gui/mainwindow.cpp:571
+#: gui/mainwindow.cpp:624
 msgid "&File"
 msgstr "&Fájl"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:628
+msgid "&Edit"
+msgstr "Szerkesztés"
+
+#: gui/mainwindow.cpp:631
 msgid "&Settings"
 msgstr "Beállítások"
 
-#: gui/mainwindow.cpp:589 support/dialog.cpp:97
+#: gui/mainwindow.cpp:646 support/dialog.cpp:81
 msgid "&Help"
 msgstr "Segítség"
 
-#: gui/mainwindow.cpp:948
+#: gui/mainwindow.cpp:1035
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
 "A dinamikus lejátszási lista feltételeinek megfelelő fájl nem található."
 
-#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
+#: gui/mainwindow.cpp:1157 mpd/mpdconnection.cpp:401
 msgid "Connecting to %1"
 msgstr "Csatlakozás ehhez %1"
 
-#: gui/mainwindow.cpp:1151
+#: gui/mainwindow.cpp:1189
+msgid "Refresh MPD Database?"
+msgstr "Adatbázist frissítsem?"
+
+#: gui/mainwindow.cpp:1257
 msgid ""
 "Podcasts are currently being downloaded\n"
 "\n"
@@ -2357,34 +2415,35 @@ msgstr ""
 "\n"
 "A kilépés az összes letöltést megszakítja."
 
-#: gui/mainwindow.cpp:1152
+#: gui/mainwindow.cpp:1258
 msgid "Abort downloads and quit"
 msgstr "Letöltés megszakítása és kilépés"
 
-#: gui/mainwindow.cpp:1447
+#: gui/mainwindow.cpp:1577
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "Cantata névjegye"
 
-#: gui/mainwindow.cpp:1448
+#: gui/mainwindow.cpp:1578
 msgctxt "Qt-only"
 msgid ""
-"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html"
-"\">GPLv3</a>"
+"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl."
+"html\">GPLv3</a>"
 msgstr ""
-"<b>Cantata %1</b><br/><br/>MPD kliens.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Kiadva <a href=\"http://www.gnu.org/licenses/gpl.html\">GPLv3 alatt</a>"
+"<b>Cantata %1</b><br/><br/>MPD kliens.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Kiadva <a href=\"http://www.gnu.org/licenses/gpl.html\">GPLv3 "
+"szerint.</a>"
 
-#: gui/mainwindow.cpp:1450
+#: gui/mainwindow.cpp:1580
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
-"QtMPC Authors<br/>"
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"The QtMPC Authors<br/>"
 msgstr ""
-"Ezen alapul <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
-"QtMPC Authors<br/>"
+"Ezen alapul <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"The QtMPC Authors<br/>"
 
-#: gui/mainwindow.cpp:1451
+#: gui/mainwindow.cpp:1581
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
@@ -2393,7 +2452,7 @@ msgstr ""
 "A tartalmi nézet háttere innen származik <a href=\"http://www.fanart.tv"
 "\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1452
+#: gui/mainwindow.cpp:1582
 msgctxt "Qt-only"
 msgid ""
 "Context view metadata courtesy of <a href=\"http://www.wikipedia.org"
@@ -2402,7 +2461,7 @@ msgstr ""
 "A tartalmi nézet metaadatai innen származnak <a href=\"http://www.wikipedia."
 "org\">Wikipédia</a> és <a href=\"http://www.last.fm\">Last.fm</a>"
 
-#: gui/mainwindow.cpp:1453
+#: gui/mainwindow.cpp:1583
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
@@ -2410,128 +2469,140 @@ msgstr ""
 "Fontold meg a kedvenc zenéd feltöltését ide <a href=\"http://www.fanart.tv"
 "\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1594
 msgid ""
-"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Uptime:</td><td>%4</td></"
-"tr><tr><td align=\"right\">Time playing:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right"
+"\">Protocol version: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Uptime: </td><td>%4</td></tr><tr><td align=\"right"
+"\">Time playing: </td><td>%5</td></tr>"
 msgstr ""
-"<tr><td colspan=\"2\"><b>Szerver</b></td></tr><tr><td align=\"right\">Verzió:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Feltöltés ideje:</td><td>"
-"%4</td></tr><tr><td align=\"right\">Lejátszási idő:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Szerver</b></td></tr><tr><td align=\"right"
+"\">Protocol verzió: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Bekapcsolva: </td><td>%4</td></tr><tr><td align=\"right"
+"\">Idő játszva: </td><td>%5</td></tr>"
 
-#: gui/mainwindow.cpp:1472
+#: gui/mainwindow.cpp:1602
 msgid ""
 "<tr><td colspan=\"2\"><b>Database</b></td></tr><tr><td align=\"right"
-"\">Artists:</td><td>%1</td></tr><tr><td align=\"right\">Albums:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Songs:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL handlers:</td><td>%4</td></tr><tr><td align=\"right\">Total "
-"duration:</td><td>%5</td></tr><tr><td align=\"right\">Last update:</td><td>"
-"%6</td></tr></table></p>"
+"\">Artists: </td><td>%1</td></tr><tr><td align=\"right\">Albums: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Songs: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Total duration: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Last update: </td><td>%6</td></tr></"
+"table></p>"
 msgstr ""
 "<tr><td colspan=\"2\"><b>Adatbázis</b></td></tr><tr><td align=\"right"
-"\">Előadók:</td><td>%1</td></tr><tr><td align=\"right\">Albumok:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Dalok:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL-címek:</td><td>%4</td></tr><tr><td align=\"right\">Teljes időn:"
-"</td><td>%5</td></tr><tr><td align=\"right\">Utolsó frissítés:</td><td>%6</"
-"td></tr></table></p>"
-
-#: gui/mainwindow.cpp:1481
+"\">Előadó: </td><td>%1</td></tr><tr><td align=\"right\">Albumok: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Dalok: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Teljes időtartam: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Utolsó frissítés: </td><td>%6</td></"
+"tr></table></p>"
+
+#: gui/mainwindow.cpp:1611
 msgid "Server Information"
 msgstr "Szerver-információk"
 
-#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
+#: gui/mainwindow.cpp:1859 gui/mainwindow.cpp:1866
 msgid "Cantata (%1)"
 msgstr "Cantata (%1)"
 
-#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
+#: gui/mainwindow.cpp:1862 gui/mainwindow.cpp:1869
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: Cantata (%2)"
 
-#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
+#: gui/mainwindow.cpp:1863 gui/mainwindow.cpp:1870
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: Cantata"
 
-#: gui/mainwindow.cpp:1728
+#: gui/mainwindow.cpp:1874
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: Cantata (%3)"
 
-#: gui/mainwindow.cpp:1730
+#: gui/mainwindow.cpp:1876
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: Cantata"
 
-#: gui/mainwindow.cpp:1773
+#: gui/mainwindow.cpp:1919
 msgid "(Stream)"
 msgstr "(Stream)"
 
-#: gui/mainwindow.cpp:1775
+#: gui/mainwindow.cpp:1921
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
+#: gui/mainwindow.cpp:1939 widgets/groupedview.cpp:278
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1843
+#: gui/mainwindow.cpp:1989 mpd/mpdconnection.cpp:543 mpd/mpdconnection.cpp:550
 msgid "MPD reported the following error: %1"
 msgstr "Az MPD a következő hibát jelezte: %1"
 
-#: gui/mainwindow.cpp:1990
+#: gui/mainwindow.cpp:2119
 msgid "Remove all songs from play queue?"
 msgstr "A lejátszási sorból minden számot töröl?"
 
-#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
+#: gui/mainwindow.cpp:2210 models/playqueuemodel.cpp:113
 msgid "Priority"
 msgstr "Prioritás"
 
-#: gui/mainwindow.cpp:2080
+#: gui/mainwindow.cpp:2210
 msgid "Enter priority (0..255):"
 msgstr "Add meg a prioritást (0-255):"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Playlist Name"
 msgstr "Lejátszási lista neve"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Enter a name for the playlist:"
 msgstr "Írj be egy nevet a lejátszási listának:"
 
-#: gui/mainwindow.cpp:2106
+#: gui/mainwindow.cpp:2236
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr ""
 "A(z) <b>%1</b> lejátszási lista már létezik!<br/>Ahhoz a listához adjam "
 "hozzá?"
 
-#: gui/mainwindow.cpp:2107
+#: gui/mainwindow.cpp:2237
 msgid "Existing Playlist"
 msgstr "Létező lejátszási lista"
 
-#: gui/playbacksettings.cpp:42
-msgid "Do not fadeout"
-msgstr "Nem úsztasson ki"
+#: gui/mainwindow.cpp:2303
+msgid "Stream URL"
+msgstr "Stream URL-je"
 
-#: gui/playbacksettings.cpp:43
-msgid " ms"
-msgstr " ms"
+#: gui/mainwindow.cpp:2303
+msgid "Enter URL of stream:"
+msgstr "A stream URL-je:"
+
+#: gui/mainwindow.cpp:2306
+msgid "Invalid, or unsupported, URL!"
+msgstr "Érvénytelen, vagy nem támogatott URL!"
 
-#. i18n: file: devices/albumdetails.ui:165
+#: gui/mainwindow.cpp:2889
+msgid "Can only edit tags of songs within MPD's music collection."
+msgstr "Csak az MPD zenetárában található dalok címkéi szerkeszthetők."
+
+#. i18n: file: devices/albumdetails.ui:158
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
-#: gui/playbacksettings.cpp:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
-#: rc.cpp:79
+#: gui/playbacksettings.cpp:47 models/playqueuemodel.cpp:108 po/rc.cpp:110
+#: rc.cpp:110
 msgid "Track"
 msgstr "Szám"
 
-#: gui/playbacksettings.cpp:51
+#: gui/playbacksettings.cpp:49
 msgid "Auto"
 msgstr "Automatikus"
 
-#: gui/playbacksettings.cpp:164
+#: gui/playbacksettings.cpp:161
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
@@ -2539,9 +2610,9 @@ msgstr ""
 "<i>csatlakozva ehhez %1<br/>Alábbi elemeket a jelenleg kapcsolt MPD-"
 "gyűjteményre érvényesíti.</i>"
 
-#. i18n: file: gui/playbacksettings.ui:26
+#. i18n: file: gui/playbacksettings.ui:114
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
+#: gui/playbacksettings.cpp:164 po/rc.cpp:769 rc.cpp:769
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
@@ -2549,7 +2620,7 @@ msgstr ""
 "<i>Nincs csatlakoztatva!<br/>Az alábbi elemek nem módosíthatóak, mivel a "
 "Cantata ben csatlakozik az MPD-hez.</i>"
 
-#: gui/playbacksettings.cpp:174
+#: gui/playbacksettings.cpp:171
 msgid ""
 "<p>Replay Gain is a proposed standard published in 2001 to normalize the "
 "perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It "
@@ -2573,11 +2644,19 @@ msgstr ""
 "véletlenszerű lejátszás aktív, akkor a számok ReplayGain címkéi alapján "
 "állítja be, egyébként az album címkéjét használja.</li></ul></p>"
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:95 widgets/playqueueview.cpp:160
+msgid "Stretch Columns To Fit Window"
+msgstr "Oszlop igazítás az ablakhoz illeszkedéshez"
+
+#: gui/playlistspage.cpp:146 tags/tageditor.cpp:828 tags/trackorganiser.cpp:72
 msgid "Rename"
 msgstr "Átnevezés"
 
-#: gui/playlistspage.cpp:190
+#: gui/playlistspage.cpp:147 models/playqueuemodel.cpp:156
+msgid "Remove Duplicates"
+msgstr "Másolatok eltávolítása"
+
+#: gui/playlistspage.cpp:309
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2585,130 +2664,188 @@ msgstr ""
 "Biztosan eltávolítod a kijelölt lejátszási listát?\n"
 "Nem vonható vissza."
 
-#: gui/playlistspage.cpp:191
+#: gui/playlistspage.cpp:310
 msgid "Remove Playlists"
 msgstr "Lejátszási lista eltávolítása"
 
-#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
+#: gui/playlistspage.cpp:330 gui/playlistspage.cpp:357
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr "A(z) <b>%1</b> lejátszási lista létezik!<br/>Felülírjam?"
 
-#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
+#: gui/playlistspage.cpp:331 gui/playlistspage.cpp:358
 msgid "Overwrite Playlist"
 msgstr "Lejátszási lista felülírása"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Rename Playlist"
 msgstr "Lejátszási lista eltávolítása"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Enter new name for playlist:"
 msgstr "Adj új nevet a lejátszási listának:"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/playlistspage.cpp:446
+msgid "Cannot add songs from '%1' to '%2'"
+msgstr "A dalok innen '%1'nem adhatók ide '%2'"
+
+#: gui/preferencesdialog.cpp:83
 msgid "Collection Settings"
 msgstr "Gyűjtemény beállításai"
 
-#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: file: gui/playbacksettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
+#: gui/preferencesdialog.cpp:84 po/rc.cpp:742 rc.cpp:742
 msgid "Playback"
 msgstr "Lejátszás"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:84
 msgid "Playback Settings"
 msgstr "Lejátszás beállításai"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "Files"
 msgstr "Fájlok"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "File Settings"
 msgstr "Fájl-beállítások"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface"
 msgstr "Felület"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface Settings"
 msgstr "A felület beállításai"
 
-#: gui/preferencesdialog.cpp:85
+#: gui/preferencesdialog.cpp:89
 msgid "Streams Settings"
 msgstr "Hangfolyam beállításai"
 
-#: gui/preferencesdialog.cpp:89
+#: gui/preferencesdialog.cpp:94
 msgid "Online Providers"
 msgstr "Online szolgáltatók"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context"
 msgstr "Tartalom"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context View Settings"
 msgstr "Tartalmi nézet beállításai"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server"
 msgstr "HTTP Szerver"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server Settings"
 msgstr "HTTP Szerver beállításai"
 
-#: gui/preferencesdialog.cpp:103
+#: gui/preferencesdialog.cpp:115
 msgid "Audio CD Settings"
 msgstr "Hang CD beállításai"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgid "Proxy"
 msgstr "Proxy"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "Proxybeállítások"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "Gyorsbillentyűk"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "Gyorsbillentyűk beállításai"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cache"
 msgstr "Cache"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cached Items"
 msgstr "Cache elemei"
 
-#: gui/preferencesdialog.cpp:116
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#: gui/preferencesdialog.cpp:128 po/rc.cpp:53 po/rc.cpp:65 po/rc.cpp:410
+#: rc.cpp:53 rc.cpp:65 rc.cpp:410
 msgid "Configure"
 msgstr "Beállítás"
 
-#: gui/serversettings.cpp:87
-msgid ""
-"<i> This folder will also be used to locate music files for transferring to "
-"(and from) devices.</i>"
-msgstr ""
-"<i> A könyvtár az eszközökre (és eszközökről) átvitelre szánt zene "
-"tárolására is szolgál.</i>"
-
-#: gui/serversettings.cpp:100
-msgid "Not used"
-msgstr "Használaton kívül"
-
-#. i18n: file: devices/remotedevicepropertieswidget.ui:75
-#. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2)
-#. i18n: file: devices/remotedevicepropertieswidget.ui:292
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#: gui/searchpage.cpp:200 po/rc.cpp:89 po/rc.cpp:371 po/rc.cpp:950 rc.cpp:89
+#: rc.cpp:371 rc.cpp:950
+msgid "Composer:"
+msgstr "Zeneszerző:"
+
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#: gui/searchpage.cpp:205 po/rc.cpp:95 po/rc.cpp:962 rc.cpp:95 rc.cpp:962
+msgid "Genre:"
+msgstr "Műfaj:"
+
+#: gui/searchpage.cpp:206
+msgid "Date:"
+msgstr "Dátum:"
+
+#: gui/searchpage.cpp:208
+msgid "Any:"
+msgstr "Bármely:"
+
+#: gui/searchpage.cpp:215
+msgid "No tracks found."
+msgstr "Számokat nem találtam."
+
+#: gui/serversettings.cpp:87
+msgid ""
+"<i> This folder will also be used to locate music files for transferring to "
+"(and from) devices.</i>"
+msgstr ""
+"<i> A könyvtár az eszközökre (és eszközökről) átvitelre szánt zene "
+"tárolására is szolgál.</i>"
+
+#: gui/serversettings.cpp:100
+msgid "Not used"
+msgstr "Használaton kívül"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:75
+#. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:292
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
@@ -2718,8 +2855,8 @@ msgstr "Használaton kívül"
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
-#: gui/serversettings.cpp:103 po/rc.cpp:208 po/rc.cpp:247 po/rc.cpp:705
-#: rc.cpp:208 rc.cpp:247 rc.cpp:705
+#: gui/serversettings.cpp:103 po/rc.cpp:269 po/rc.cpp:308 po/rc.cpp:857
+#: rc.cpp:269 rc.cpp:308 rc.cpp:857
 msgid "Host:"
 msgstr "Elhelyező:"
 
@@ -2767,7 +2904,7 @@ msgstr ""
 "marad 'borítót' használja.<br/><br/><i>A jelenlegi számnál az %előadó% album "
 "előadóra kerül lecserélésre, és az %album% pedig az album nevére.</i></p>"
 
-#: gui/serversettings.cpp:252
+#: gui/serversettings.cpp:257
 msgid ""
 "Which type of collection do you wish to connect to?<br/><ul><li>Standard - "
 "music collection may be shared, is on another machine, or is already setup</"
@@ -2779,79 +2916,64 @@ msgstr ""
 "li><li>Basic - zenegyűjtemény nincs megosztva más gépekkel, és a Cantata "
 "állítja be és vezérli az MPD példányt.</li></ul>"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Add Collection"
 msgstr "Gyűjteményt hozzáad"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Standard"
 msgstr "Szabványos"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Basic"
 msgstr "Alap"
 
-#: gui/serversettings.cpp:297
+#: gui/serversettings.cpp:302
 msgid "Delete <b>%1</b>?"
 msgstr "Törlöd <b>%1</b>?"
 
-#: gui/serversettings.cpp:298
+#: gui/serversettings.cpp:303
 msgid "Delete"
 msgstr "Törlés"
 
-#: gui/serversettings.cpp:336
+#: gui/serversettings.cpp:341
 msgid "New Collection %1"
 msgstr "Új gyűjtemény %1"
 
-#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
+#: gui/serversettings.cpp:357 mpd/mpdconnection.cpp:173
 msgid "Default"
 msgstr "Alapbeállítás"
 
-#: gui/shortcutssettingspage.cpp:74
+#: gui/shortcutssettingspage.cpp:76
 msgid "Multi-Media Keys"
 msgstr "Multimédia-gombok"
 
-#: gui/shortcutssettingspage.cpp:80
+#: gui/shortcutssettingspage.cpp:82
 msgid "Do not use media keys to control Cantata"
 msgstr "Ne használd a média-gombokat a Cantata vezérlésére"
 
-#: gui/shortcutssettingspage.cpp:81
+#: gui/shortcutssettingspage.cpp:83 gui/shortcutssettingspage.cpp:97
 msgid "Use media keys to control Cantata"
 msgstr "A médiagombok használata a Cantata vezérlésére"
 
-#: gui/shortcutssettingspage.cpp:84
+#: gui/shortcutssettingspage.cpp:86 gui/shortcutssettingspage.cpp:104
 msgid "Use media keys, as configured in desktop settings, to control Cantata"
 msgstr ""
 "A médiagombok használata a Cantata vezérlésére asztalbeállítások szerint"
 
-#: gui/shortcutssettingspage.cpp:85
+#: gui/shortcutssettingspage.cpp:87 gui/shortcutssettingspage.cpp:105
 msgid ""
 "Use media keys, as configured in GNOME/Unity settings, to control Cantata"
 msgstr ""
 "A médiagombok használata a Cantata vezérlésére a GNOME/Unity beállításai "
 "szerint"
 
-#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
-#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+#: gui/shortcutssettingspage.cpp:90 gui/shortcutssettingspage.cpp:107
+#: online/onlineservicespage.cpp:99 streams/streamspage.cpp:99
+#: support/fancytabwidget.cpp:825
 msgid "Configure..."
 msgstr "Beállítás..."
 
-#: gui/shortcutssettingspage.cpp:95
-msgid "Use media keys to control Cantata:"
-msgstr "A médiagombok használata a Cantata vezérlésére:"
-
-#: gui/shortcutssettingspage.cpp:106
-msgid "Use media keys, as configured in desktop settings, to control Cantata:"
-msgstr ""
-"A médiagombok használata a Cantata vezérlésére asztalbeállítások szerint:"
-
-#: gui/shortcutssettingspage.cpp:107
-msgid ""
-"Use media keys, as configured in GNOME/Unity settings, to control Cantata:"
-msgstr ""
-"A médiagombok használata a Cantata vezérlésére a GNOME/Unity beállításai "
-"szerint:"
-
 #: gui/stdactions.cpp:55
 msgid "Previous Track"
 msgstr "Előző szám"
@@ -2924,7 +3046,7 @@ msgstr "Tetszőleges prioritás..."
 msgid "Add To Playlist"
 msgstr "Lejátszási listához ad"
 
-#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:66
 msgid "Organize Files"
 msgstr "Fájlok rendezése"
 
@@ -2932,7 +3054,7 @@ msgstr "Fájlok rendezése"
 msgid "Edit Tags"
 msgstr "Címkék szerkesztése"
 
-#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:106
 msgid "ReplayGain"
 msgstr "Lejátszási szint"
 
@@ -2945,88 +3067,89 @@ msgid "Set Image"
 msgstr "Kép beállítása"
 
 #: gui/stdactions.cpp:88
-msgid "Refresh Database"
-msgstr "Adatbázis-frissítés"
-
-#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "Vissza"
 
-#: gui/trayitem.cpp:192
+#: gui/stdactions.cpp:91
+msgid "Find"
+msgstr "Keres"
+
+#: gui/trayitem.cpp:210
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%1 ezen %2"
 
-#: gui/trayitem.cpp:193
+#: gui/trayitem.cpp:211
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%1 ezen %2 (%3)"
 
-#: gui/trayitem.cpp:195
+#: gui/trayitem.cpp:213
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%1 előadja %2 ezen %3"
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:214
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr "%1 előadja %2 ezen %3"
 
-#: gui/trayitem.cpp:223
+#: gui/trayitem.cpp:241
 msgid "Now playing"
 msgstr "Most megy"
 
-#: http/httpserversettings.cpp:40
+#: http/httpserversettings.cpp:39
 msgid "Local loopback (%1)"
 msgstr "Helyi visszacsatolás (%1)"
 
-#: http/httpserversettings.cpp:43
+#: http/httpserversettings.cpp:42
 msgid "Wired (%1)"
 msgstr "Vezetékes (%1)"
 
-#: http/httpserversettings.cpp:46
+#: http/httpserversettings.cpp:45
 msgid "Wireless (%1)"
 msgstr "Vezeték nélküli (%1)"
 
-#: http/httpserversettings.cpp:53
+#: http/httpserversettings.cpp:52
 msgid "First active interface"
 msgstr "Az első aktív interfész"
 
-#: http/httpserversettings.cpp:98
-msgid "Inactive"
-msgstr "Inaktív"
+#: models/albumsmodel.cpp:260 models/musicmodel.cpp:254
+msgctxt "Album by Artist"
+msgid "%1 by %2"
+msgstr "%1 előadja %2"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:221
+#: models/musicmodel.cpp:133
 msgid "Cue Sheet"
 msgstr "Kulcslap"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:220
+#: models/musicmodel.cpp:133
 msgid "Playlist"
 msgstr "Lejátszási lista"
 
-#: models/devicesmodel.cpp:108
+#: models/devicesmodel.cpp:116
 msgid "Configure Device"
 msgstr "Eszköz beállítása"
 
-#: models/devicesmodel.cpp:109
+#: models/devicesmodel.cpp:117
 msgid "Refresh Device"
 msgstr "Eszköz frissítése"
 
-#: models/devicesmodel.cpp:110
+#: models/devicesmodel.cpp:118
 msgid "Connect Device"
 msgstr "Eszköz csatlakoztatása"
 
-#: models/devicesmodel.cpp:111
+#: models/devicesmodel.cpp:119
 msgid "Disconnect Device"
 msgstr "Eszköz leválasztása"
 
-#: models/devicesmodel.cpp:113
+#: models/devicesmodel.cpp:121
 msgid "Edit CD Details"
 msgstr "CD-adatok szerkesztése"
 
-#: models/devicesmodel.cpp:690
+#: models/devicesmodel.cpp:730
 msgid "No Devices Attached"
 msgstr "Nincs csatlakoztatott eszköz"
 
@@ -3058,42 +3181,42 @@ msgstr "Bejelentkezve (lejárat:%1) "
 msgid "Session expired"
 msgstr "Munkamenet lejárt"
 
-#: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
+#: models/dirviewmodel.cpp:204 models/dirviewmodel.cpp:212
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:696
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "1 elem"
 msgstr[1] "%1 elemek"
 
-#: models/dirviewmodel.cpp:190
+#: models/dirviewmodel.cpp:219
 msgid "Audio File"
 msgstr "Hangfájl"
 
-#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
-#: models/musiclibraryitemroot.cpp:844
+#: models/musiclibraryitemartist.cpp:248 models/musiclibraryitemartist.cpp:261
+#: models/musiclibraryitemroot.cpp:840
 msgid "Single Tracks"
 msgstr "Egyedüli számok"
 
-#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
-#: widgets/groupedview.cpp:366
+#: models/musicmodel.cpp:190 models/onlineservicesmodel.cpp:167
+#: widgets/groupedview.cpp:364
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "1 Szám"
 msgstr[1] "%1 Számok"
 
-#: models/musicmodel.cpp:185
+#: models/musicmodel.cpp:196
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "1 Előadó"
 msgstr[1] "%1 Előadók"
 
-#: models/musicmodel.cpp:192
+#: models/musicmodel.cpp:203
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "1 Album"
 msgstr[1] "%1 Albumok"
 
-#: models/musicmodel.cpp:198
+#: models/musicmodel.cpp:209
 msgid "1 Episode"
 msgid_plural "%1 Episodes"
 msgstr[0] "1 Rész"
@@ -3101,186 +3224,193 @@ msgstr[1] "%1 Részek"
 
 #. i18n: file: online/onlinesettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: models/onlineservicesmodel.cpp:83 po/rc.cpp:720 rc.cpp:720
+#: models/onlineservicesmodel.cpp:91 po/rc.cpp:872 rc.cpp:872
 msgid "Configure Service"
 msgstr "Szolgáltatás beállítása"
 
-#: models/onlineservicesmodel.cpp:84
+#: models/onlineservicesmodel.cpp:92
 msgid "Refresh Service"
 msgstr "Szolgáltatás frissítése"
 
-#: models/onlineservicesmodel.cpp:85
+#: models/onlineservicesmodel.cpp:93
 msgid "Add Subscription"
 msgstr "Előfizetés hozzáadása"
 
-#: models/onlineservicesmodel.cpp:86
+#: models/onlineservicesmodel.cpp:94
 msgid "Remove Subscription"
 msgstr "Előfizetés eltávolítása"
 
-#: models/onlineservicesmodel.cpp:87
+#: models/onlineservicesmodel.cpp:95
 msgid "Refresh Subscription"
 msgstr "Előfizetés frissítése"
 
-#: models/onlineservicesmodel.cpp:137
+#: models/onlineservicesmodel.cpp:145
 msgid "Last Search:%1"
 msgstr "Utoljára keresett:%1"
 
-#: models/onlineservicesmodel.cpp:149
-msgid "Searching..."
-msgstr "Keresés..."
-
-#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
-#: models/streamsmodel.cpp:670
+#: models/onlineservicesmodel.cpp:160 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:691
 msgid "Not Loaded"
 msgstr "Nincs betöltve"
 
-#: models/onlineservicesmodel.cpp:155
+#: models/onlineservicesmodel.cpp:163
 msgid "Use search to locate tracks"
 msgstr "Számok előkerítésére használd a keresést "
 
-#: models/onlineservicesmodel.cpp:166
+#: models/onlineservicesmodel.cpp:174
 msgid "1 Podcast"
 msgid_plural "%1 Podcasts"
 msgstr[0] "1 Podcast"
 msgstr[1] "%1 Pocast-ok"
 
-#: models/onlineservicesmodel.cpp:177
+#: models/onlineservicesmodel.cpp:185
 msgid "(Downloading: %1%)"
 msgstr "(Letölt: %1%)"
 
-#: models/onlineservicesmodel.cpp:235
+#: models/onlineservicesmodel.cpp:243
 msgctxt "podcast name (num unplayed episodes)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: models/playlistsmodel.cpp:77
+#: models/playlistsmodel.cpp:105
 msgid "New Playlist..."
 msgstr "Új lejátszási lista..."
 
-#: models/playqueuemodel.cpp:102
-msgctxt "Track Number (#)"
-msgid "#"
-msgstr "#"
+#: models/playlistsmodel.cpp:321
+msgid "Smart Playlist"
+msgstr "Okos lejátszási lista"
 
-#: models/playqueuemodel.cpp:103
+#: models/playqueuemodel.cpp:109
 msgid "Length"
 msgstr "Időtartam"
 
-#: models/playqueuemodel.cpp:104
+#: models/playqueuemodel.cpp:110
 msgid "Disc"
 msgstr "Lemez"
 
-#. i18n: file: devices/filenameschemedialog.ui:138
+#. i18n: file: devices/filenameschemedialog.ui:174
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
+#: models/playqueuemodel.cpp:111 po/rc.cpp:248 rc.cpp:248
 msgid "Year"
 msgstr "Év"
 
-#: models/playqueuemodel.cpp:360
+#: models/playqueuemodel.cpp:158
+msgid "Undo"
+msgstr "Visszavon"
+
+#: models/playqueuemodel.cpp:160
+msgid "Redo"
+msgstr "Újra végrehajt"
+
+#: models/playqueuemodel.cpp:404
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(Prioritás: %1)</b>"
 
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:693
 msgid "Loading..."
 msgstr "Betöltés..."
 
-#: models/streamsmodel.cpp:286
+#: models/streamsmodel.cpp:302
 msgid "Bookmarks"
 msgstr "Könyvjelzők"
 
-#: models/streamsmodel.cpp:560
+#: models/streamsmodel.cpp:576
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:563
+#: models/streamsmodel.cpp:579
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:564
+#: models/streamsmodel.cpp:580
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:567
+#: models/streamsmodel.cpp:583
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:568
+#: models/streamsmodel.cpp:584
+msgid "Radio GFM"
+msgstr "Rádió GFM"
+
+#: models/streamsmodel.cpp:585
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: models/streamsmodel.cpp:569
+#: models/streamsmodel.cpp:586
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:570
+#: models/streamsmodel.cpp:587
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:571
+#: models/streamsmodel.cpp:588
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:572
+#: models/streamsmodel.cpp:589
 msgid "Favorites"
 msgstr "Kedvencek"
 
-#: models/streamsmodel.cpp:573
+#: models/streamsmodel.cpp:590
 msgid "Listen Live"
 msgstr "Hallgatás élőben"
 
-#: models/streamsmodel.cpp:578
+#: models/streamsmodel.cpp:595
 msgid "Bookmark Category"
 msgstr "Könyvjelző-kategóriák"
 
-#: models/streamsmodel.cpp:579
+#: models/streamsmodel.cpp:596
 msgid "Add Stream To Favorites"
 msgstr "Hangfolyam hozzáadása a kedvencekhez"
 
-#: models/streamsmodel.cpp:580
+#: models/streamsmodel.cpp:597
 msgid "Configure Streams"
 msgstr "Hangfolyam beállítása"
 
-#: models/streamsmodel.cpp:660
+#: models/streamsmodel.cpp:681
 msgid "%1 (Read-Only)"
 msgstr "%1 (Csak olvasható)"
 
-#: models/streamsmodel.cpp:1241
+#: models/streamsmodel.cpp:1261
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr "Hangfolyam-lista mentése sikertelen. Ellenőrizd, hogy a %1 írható-e."
 
-#: models/streamsmodel.cpp:1639
+#: models/streamsmodel.cpp:1659
 msgid "All"
 msgstr "Mindet"
 
-#: mpd/mpdconnection.cpp:154
+#: mpd/mpdconnection.cpp:179
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "\"%1\""
 
-#: mpd/mpdconnection.cpp:156
+#: mpd/mpdconnection.cpp:181
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr "\"%1\" (%2:%3)"
 
-#: mpd/mpdconnection.cpp:372 mpd/mpdconnection.cpp:415
-#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
-#: mpd/mpdconnection.cpp:1036
+#: mpd/mpdconnection.cpp:406 mpd/mpdconnection.cpp:451
+#: mpd/mpdconnection.cpp:501 mpd/mpdconnection.cpp:1137
+#: mpd/mpdconnection.cpp:1164
 msgid "Connection to %1 failed"
 msgstr "Csatlakozás ehhez %1 sikertelen"
 
-#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
+#: mpd/mpdconnection.cpp:412 mpd/mpdconnection.cpp:455
 msgid "Connection to %1 failed - incorrect password"
 msgstr "Csatlakozás ehhez %1 sikertelen - hibás jelszó"
 
-#: mpd/mpdconnection.cpp:455
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to send command to %1 - not connected"
 msgstr "Csatlakozás ehhez %1 sikertelen - nincs csatlakozva"
 
-#: mpd/mpdconnection.cpp:491
+#: mpd/mpdconnection.cpp:539
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr "Betöltés sikertelen. Ellenőrizd a felhasználó \"mpd\" olvasási jogát."
 
-#: mpd/mpdconnection.cpp:493
+#: mpd/mpdconnection.cpp:541
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
@@ -3288,23 +3418,23 @@ msgstr ""
 "Betöltés sikertelen. Az MPD csak helyi fájlokat játszik le, ha helyi "
 "csatlakozóra csatolva."
 
-#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
+#: mpd/mpdconnection.cpp:547 mpd/mpdconnection.cpp:558
 msgid "Failed to send command. Disconnected from %1"
 msgstr "Sikertelen parancsküldés. Leválasztva innen: %1"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1306
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr "Sikertelen átnevezés erről <b>%1</b> erre <b>%2</b>"
 
-#: mpd/mpdconnection.cpp:1183
+#: mpd/mpdconnection.cpp:1318
 msgid "Failed to save <b>%1</b>"
 msgstr "Sikertelen mentés"
 
-#: mpd/mpdconnection.cpp:1196
+#: mpd/mpdconnection.cpp:1331
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr "Kulcslap részletét nem adhatod a lejátszási listához!"
 
-#: mpd/mpdconnection.cpp:1199
+#: mpd/mpdconnection.cpp:1334
 msgid "You cannot add a playlist to another playlist!"
 msgstr "Nem adhatsz lejátszási listát másik listához!"
 
@@ -3312,7 +3442,15 @@ msgstr "Nem adhatsz lejátszási listát másik listához!"
 msgid "Personal"
 msgstr "Személyes"
 
-#: mpd/song.cpp:343
+#: mpd/song.cpp:62
+msgid "Unknown"
+msgstr "Ismeretlen"
+
+#: mpd/song.cpp:63
+msgid "Various Artists"
+msgstr "Vegyes előadók"
+
+#: mpd/song.cpp:427
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3382,8 +3520,8 @@ msgstr "Magnatune-beállítások"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
-#: rc.cpp:711 rc.cpp:729
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:863 po/rc.cpp:881
+#: rc.cpp:863 rc.cpp:881
 msgid "Username:"
 msgstr "Felhasználónév:"
 
@@ -3411,9 +3549,9 @@ msgstr "Felhasználónév:"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPasswordLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:220 po/rc.cpp:238
-#: po/rc.cpp:412 po/rc.cpp:647 po/rc.cpp:714 po/rc.cpp:732 rc.cpp:220
-#: rc.cpp:238 rc.cpp:412 rc.cpp:647 rc.cpp:714 rc.cpp:732
+#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:281 po/rc.cpp:299
+#: po/rc.cpp:476 po/rc.cpp:802 po/rc.cpp:866 po/rc.cpp:884 rc.cpp:281
+#: rc.cpp:299 rc.cpp:476 rc.cpp:802 rc.cpp:866 rc.cpp:884
 msgid "Password:"
 msgstr "Jelszó:"
 
@@ -3453,155 +3591,179 @@ msgstr "Letöltés sikertelen"
 msgid "Download To Library"
 msgstr "Letöltés könyvtárba"
 
-#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
-msgid "Search For Podcasts"
-msgstr "Podcast keresése"
-
-#: online/onlineservicespage.cpp:63
+#: online/onlineservicespage.cpp:62
 msgid "Download Podcast Episodes"
 msgstr "Podcast részek letöltése"
 
-#: online/onlineservicespage.cpp:64
+#: online/onlineservicespage.cpp:63
 msgid "Delete Downloaded Podcast Episodes"
 msgstr "A letöltött podcast részek törlése"
 
-#: online/onlineservicespage.cpp:329
+#: online/onlineservicespage.cpp:320
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "Keresés %1:"
 
-#: online/onlineservicespage.cpp:464
+#: online/onlineservicespage.cpp:458
 msgid "Re-download music listing for %1?"
 msgstr "Újratöltésem a zenelistát evvel kapcsolatban %1?"
 
-#: online/onlineservicespage.cpp:532
-msgid "Subscribe to Podcast"
-msgstr "Feliratkozás a podcast-ra"
-
-#: online/onlineservicespage.cpp:532
-msgid "Enter podcast URL:"
-msgstr "Írd be a podcast URL-jét:"
-
-#: online/onlineservicespage.cpp:541
-msgid "Invalid URL!"
-msgstr "Érvénytelen URL!"
-
-#: online/onlineservicespage.cpp:546
-msgid "You are already subscribed to this URL!"
-msgstr "Már feliratkoztál erre az URL-re!"
-
-#: online/onlineservicespage.cpp:550
-msgid "Already downloading this URL!"
-msgstr "Már folyik az URL letöltése!"
-
-#: online/onlineservicespage.cpp:579
+#: online/onlineservicespage.cpp:544
 msgid "Unsubscribe from <b>%1</b>?"
 msgstr "Leiratkozik innen <b>%1</b>?"
 
-#: online/onlineservicespage.cpp:600
+#: online/onlineservicespage.cpp:565
 msgid "Refresh all podcast listings?"
 msgstr "Az összes podcast-listát frissíti?"
 
-#: online/onlineservicespage.cpp:621
+#: online/onlineservicespage.cpp:586
 msgid "Refresh episode listing from <b>%1</b>?"
 msgstr "Frissíti a részek listáját innentől: <b>%1</b>?"
 
-#: online/onlineservicespage.cpp:695
+#: online/onlineservicespage.cpp:652
 msgid "All selected podcasts have already been downloaded!"
 msgstr "Az összes kiválasztott podcast-részt már letöltöttem!"
 
-#: online/onlineservicespage.cpp:699
+#: online/onlineservicespage.cpp:656
 msgid "Do you wish to download the following podcast episode?"
 msgstr "Letöltenéd a következő podcast részt?"
 
-#: online/onlineservicespage.cpp:702
+#: online/onlineservicespage.cpp:659
 msgid "Do you wish to download the following podcast episodes?"
 msgstr "Letöltenéd a következő podcast részeket?"
 
-#: online/onlineservicespage.cpp:705
+#: online/onlineservicespage.cpp:662
 msgid "Do you wish to download the selected podcast episodes?"
 msgstr "Biztosan eltávolítanád a kiválasztott %1 podcast epizódot?"
 
-#: online/onlineservicespage.cpp:753
+#: online/onlineservicespage.cpp:710
 msgid "All selected downloaded podcast episodes have already been deleted!"
 msgstr "Az összes kiválasztott podcast-részt már töröltem!"
 
-#: online/onlineservicespage.cpp:757
+#: online/onlineservicespage.cpp:714
 msgid ""
 "Do you wish to delete the downloaded file of the following podcast episode?"
 msgstr "Letörölnéd a következő podcast rész letöltött fájlját?"
 
-#: online/onlineservicespage.cpp:760
+#: online/onlineservicespage.cpp:717
 msgid ""
 "Do you wish to the delete downloaded files of the following podcast episodes?"
 msgstr "Letörölnéd a következő podcast részek letöltött fájljait?"
 
-#: online/onlineservicespage.cpp:763
+#: online/onlineservicespage.cpp:720
 msgid ""
 "Do you wish to the delete downloaded files of the selected podcast episodes?"
 msgstr "Letörölnéd a következő kiválasztott podcast részek letöltött fájljait?"
 
-#: online/podcastsearchdialog.cpp:243
+#: online/podcastsearchdialog.cpp:253
 msgid "RSS:"
 msgstr "RSS:"
 
-#: online/podcastsearchdialog.cpp:245
+#: online/podcastsearchdialog.cpp:255
 msgid "Website:"
 msgstr "Weblap:"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Podcast details"
 msgstr "A podcast részletei"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Select a podcast to display its details"
 msgstr "Válaszd ki a podcast-ot, amiek a részleteit megjelenítenéd"
 
-#: online/podcastsearchdialog.cpp:322
+#: online/podcastsearchdialog.cpp:333
 msgid "Enter search term..."
 msgstr "Írd be a keresett kifejezést..."
 
-#: online/podcastsearchdialog.cpp:372
+#: online/podcastsearchdialog.cpp:383
 msgid "Failed to fetch podcasts from %1"
 msgstr "Nem sikerült podcast-ot letölteni erről %1"
 
-#: online/podcastsearchdialog.cpp:378
+#: online/podcastsearchdialog.cpp:389
 msgid "There was a problem parsing the response from %1"
 msgstr "A(z) %1 válaszának elemzésével probléma adódott."
 
-#: online/podcastsearchdialog.cpp:439
+#: online/podcastsearchdialog.cpp:450
 msgid "Failed to download directory listing"
 msgstr "A könyvtárlistát nem sikerült letölteni"
 
-#: online/podcastsearchdialog.cpp:447
+#: online/podcastsearchdialog.cpp:458
 msgid "Failed to parse directory listing"
 msgstr "Könyvtárlista elemzése sikertelen"
 
 #: online/podcastsearchdialog.cpp:508
+msgid "URL"
+msgstr "URL"
+
+#: online/podcastsearchdialog.cpp:517
+msgid "Enter podcast URL..."
+msgstr "Írd be a podcast URL-jét..."
+
+#: online/podcastsearchdialog.cpp:518
+msgid "Load"
+msgstr "Betölt"
+
+#: online/podcastsearchdialog.cpp:525
+msgid "Enter podcast URL below, and press 'Load'"
+msgstr "Írd be a podcast URL-jét és 'Betölt' gombot nyomd le."
+
+#: online/podcastsearchdialog.cpp:552
+msgid "Invalid URL!"
+msgstr "Érvénytelen URL!"
+
+#: online/podcastsearchdialog.cpp:562
+msgid "Failed to fetch podcast!"
+msgstr "Nem sikerült podcast-ot letölteni"
+
+#: online/podcastsearchdialog.cpp:567
+msgid "Failed to parse podcast."
+msgstr "A podcast elemzése sikertelen"
+
+#: online/podcastsearchdialog.cpp:571
+msgid ""
+"Cantata only supports audio podcasts! The URL entered contains only video "
+"podcasts."
+msgstr ""
+"A Cantata csak audio podcast-ok lejátszását támogatja! Az URL csak videó "
+"podcast-okat tartalmaz."
+
+#: online/podcastsearchdialog.cpp:589
 msgid "Subscribe"
 msgstr "Feliratkozás"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:607
+msgid "Enter URL"
+msgstr "Írd be a URL-t:"
+
+#: online/podcastsearchdialog.cpp:607
+msgid "Manual podcast URL"
+msgstr "Podcast kézi URL"
+
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search %1"
 msgstr "Keresés %1"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search for podcasts on %1"
 msgstr "Podcast keresése itt: %1"
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1"
 msgstr "Böngészés %1"
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1 podcasts"
 msgstr "A(z) %1 podcast-ok böngészése"
 
-#: online/podcastsearchdialog.cpp:602
+#: online/podcastsearchdialog.cpp:639
+msgid "Add Podcast Subscription"
+msgstr "Podcast leírásának hozzáadása"
+
+#: online/podcastsearchdialog.cpp:695
 msgid "Subscription added"
 msgstr "Előfizetés hozzáadva"
 
-#: online/podcastsearchdialog.cpp:604
+#: online/podcastsearchdialog.cpp:697
 msgid "You are already subscribed to this podcast!"
 msgstr "Már feliratkoztál erre a podcsat-ra!"
 
@@ -3609,93 +3771,172 @@ msgstr "Már feliratkoztál erre a podcsat-ra!"
 msgid "Podcasts"
 msgstr "Podcast-ok"
 
-#: online/podcastservice.cpp:284
+#: online/podcastservice.cpp:288
 msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
 msgstr ""
 "A Cantata csak audio podcast-ok lejátszását támogatja! A(z) %1 csak videó "
 "podcast-okat tartalmaz."
 
-#: online/podcastservice.cpp:286
+#: online/podcastservice.cpp:290
 msgid "Failed to parse %1"
 msgstr "Elemzés sikertelen %1"
 
-#: online/podcastservice.cpp:290
+#: online/podcastservice.cpp:294
 msgid "Failed to download %1"
 msgstr "Letöltés sikertelen %1"
 
-#: online/podcastsettingsdialog.cpp:58
+#: online/podcastsettingsdialog.cpp:59
 msgid "Check for new episodes:"
 msgstr "Új részek keresése:"
 
-#: online/podcastsettingsdialog.cpp:59
+#: online/podcastsettingsdialog.cpp:60
 msgid "Download episodes to:"
 msgstr "Részek letöltése ide:"
 
-#: online/podcastsettingsdialog.cpp:60
-msgid "Automatically download new episodes:"
-msgstr "Új részek automatikus letöltése::"
+#: online/podcastsettingsdialog.cpp:67
+msgid "Automatically download new episodes"
+msgstr "Új részek automatikus letöltése"
 
-#: online/podcastsettingsdialog.cpp:82
+#: online/podcastsettingsdialog.cpp:80
 msgid "Podcast Settings"
 msgstr "Podcast beállítások"
 
-#: online/podcastsettingsdialog.cpp:84
+#: online/podcastsettingsdialog.cpp:82
 msgid "Manually"
 msgstr "Kézzel"
 
-#: online/podcastsettingsdialog.cpp:85
+#: online/podcastsettingsdialog.cpp:83
 msgid "Every 15 minutes"
 msgstr "Minden 15. percben"
 
-#: online/podcastsettingsdialog.cpp:86
+#: online/podcastsettingsdialog.cpp:84
 msgid "Every 30 minutes"
 msgstr "Minden 30. percben"
 
-#: online/podcastsettingsdialog.cpp:87
+#: online/podcastsettingsdialog.cpp:85
 msgid "Every hour"
 msgstr "Minden órában"
 
-#: online/podcastsettingsdialog.cpp:88
+#: online/podcastsettingsdialog.cpp:86
 msgid "Every 2 hours"
 msgstr "Minden 2. órában"
 
-#: online/podcastsettingsdialog.cpp:89
+#: online/podcastsettingsdialog.cpp:87
 msgid "Every 6 hours"
 msgstr "Minden 6. órában"
 
-#: online/podcastsettingsdialog.cpp:90
+#: online/podcastsettingsdialog.cpp:88
 msgid "Every 12 hours"
 msgstr "Minden 12. órában"
 
-#: online/podcastsettingsdialog.cpp:91
+#: online/podcastsettingsdialog.cpp:89
 msgid "Every day"
 msgstr "Minden nap"
 
-#: online/podcastsettingsdialog.cpp:92
+#: online/podcastsettingsdialog.cpp:90
 msgid "Every week"
 msgstr "Minden héten"
 
-#. i18n: file: context/othersettings.ui:19
-#. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
-#: po/rc.cpp:3 rc.cpp:3
-msgid "Use backdrop:"
-msgstr "Háttér használata:"
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:3 po/rc.cpp:657 rc.cpp:3 rc.cpp:657
+msgid "Background Image"
+msgstr "Háttérkép"
+
+#. i18n: file: context/othersettings.ui:36
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_artist)
+#: po/rc.cpp:9 rc.cpp:9
+msgid "Artist image"
+msgstr "A művész képe"
+
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#: po/rc.cpp:12 po/rc.cpp:666 rc.cpp:12 rc.cpp:666
+msgid "Custom image:"
+msgstr "Egyéni kép:"
+
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#: po/rc.cpp:15 po/rc.cpp:669 rc.cpp:15 rc.cpp:669
+msgid "Blur:"
+msgstr "Elmosás:"
+
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#: po/rc.cpp:18 po/rc.cpp:672 rc.cpp:18 rc.cpp:672
+msgid "10px"
+msgstr "10px"
+
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: po/rc.cpp:21 po/rc.cpp:675 rc.cpp:21 rc.cpp:675
+msgid "Opacity:"
+msgstr "Áttetszőség:"
+
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#: po/rc.cpp:25 po/rc.cpp:679 rc.cpp:25 rc.cpp:679
+#, no-c-format
+msgid "40%"
+msgstr "40%"
 
-#. i18n: file: context/othersettings.ui:32
-#. i18n: ectx: property (text), widget (BuddyLabel, contextDarkBackgroundLabel)
-#: po/rc.cpp:6 rc.cpp:6
-msgid "Dark background:"
+#. i18n: file: context/othersettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, contextDarkBackground)
+#: po/rc.cpp:28 rc.cpp:28
+msgid "Dark background"
 msgstr "Fekete háttér"
 
-#. i18n: file: context/othersettings.ui:45
-#. i18n: ectx: property (text), widget (BuddyLabel, wikipediaIntroOnlyLabel)
-#: po/rc.cpp:9 rc.cpp:9
-msgid "Only show basic wikipedia text:"
-msgstr "Csak az alapvető Wikipédia-szöveg mutatása:"
+#. i18n: file: context/othersettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, wikipediaIntroOnly)
+#: po/rc.cpp:31 rc.cpp:31
+msgid "Only show basic wikipedia text"
+msgstr "Csak az alapvető Wikipédia-szöveg mutatása"
+
+#. i18n: file: context/othersettings.ui:178
+#. i18n: ectx: property (text), widget (QCheckBox, contextAlwaysCollapsed)
+#: po/rc.cpp:34 rc.cpp:34
+msgid "Always collapse into a single pane"
+msgstr "Mindig csukd össze egyetlen táblába"
 
-#. i18n: file: context/othersettings.ui:86
+#. i18n: file: context/othersettings.ui:207
 #. i18n: ectx: property (text), widget (StateLabel, wikipediaIntroOnlyNote)
-#: po/rc.cpp:13 rc.cpp:13
+#: po/rc.cpp:38 rc.cpp:38
 #, no-c-format
 msgid ""
 "<i><b>NOTE:</b> Cantata does not show the full wikipedia pages (with images, "
@@ -3715,188 +3956,174 @@ msgstr ""
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:16 rc.cpp:16
+#: po/rc.cpp:41 rc.cpp:41
 msgid "Available:"
 msgstr "Elérhető:"
 
 #. i18n: file: context/togglelist.ui:24
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:19 rc.cpp:19
+#: po/rc.cpp:44 rc.cpp:44
 msgid "Selected:"
 msgstr "Kiválasztva:"
 
-#. i18n: file: devices/actiondialog.ui:30
+#. i18n: file: devices/actiondialog.ui:33
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:22 rc.cpp:22
+#: po/rc.cpp:47 rc.cpp:47
 msgid "Copy songs from:"
 msgstr "Dalok másolása innen:"
 
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#: po/rc.cpp:25 po/rc.cpp:31 po/rc.cpp:49 po/rc.cpp:744 rc.cpp:25 rc.cpp:31
-#: rc.cpp:49 rc.cpp:744
+#: po/rc.cpp:50 po/rc.cpp:62 po/rc.cpp:896 rc.cpp:50 rc.cpp:62 rc.cpp:896
 msgid "TextLabel"
 msgstr "Szövegcímke"
 
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#: po/rc.cpp:28 po/rc.cpp:34 rc.cpp:28 rc.cpp:34
+#: po/rc.cpp:56 po/rc.cpp:68 rc.cpp:56 rc.cpp:68
 msgid "(Needs configuring)"
 msgstr "(Beállítandó)"
 
-#. i18n: file: devices/actiondialog.ui:123
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:37 rc.cpp:37
-msgid "Overwrite songs:"
-msgstr "Dalok felülírása:"
-
-#. i18n: file: devices/actiondialog.ui:150
+#. i18n: file: devices/actiondialog.ui:86
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:40 rc.cpp:40
+#: po/rc.cpp:59 rc.cpp:59
 msgid "Copy songs to:"
 msgstr "Dalok másolása ide:"
 
-#. i18n: file: devices/actiondialog.ui:157
+#. i18n: file: devices/actiondialog.ui:149
 #. i18n: ectx: property (text), widget (QLabel, codecLabel)
-#: po/rc.cpp:43 rc.cpp:43
+#: po/rc.cpp:71 rc.cpp:71
 msgid "Destination format:"
 msgstr "Célformátum:"
 
-#. i18n: file: devices/actiondialog.ui:171
+#. i18n: file: devices/actiondialog.ui:163
+#. i18n: ectx: property (text), widget (QCheckBox, overwrite)
+#: po/rc.cpp:74 rc.cpp:74
+msgid "Overwrite songs"
+msgstr "Dalok felülírása"
+
+#. i18n: file: devices/actiondialog.ui:170
 #. i18n: ectx: property (text), widget (QLabel, songCountLabel)
-#: po/rc.cpp:46 rc.cpp:46
+#: po/rc.cpp:77 rc.cpp:77
 msgid "To copy:"
 msgstr "Másolandó:"
 
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#: po/rc.cpp:80 po/rc.cpp:968 po/rc.cpp:995 rc.cpp:80 rc.cpp:968 rc.cpp:995
+msgid ""
+"<i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b> Mopidy szerverhez kapcsolódva (kézi frissítés "
+"szükséges).</i>"
+
 #. i18n: file: devices/albumdetails.ui:26
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:52 rc.cpp:52
+#: po/rc.cpp:83 rc.cpp:83
 msgid "Album Details"
 msgstr "Album részletei"
 
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#: po/rc.cpp:58 po/rc.cpp:298 po/rc.cpp:798 rc.cpp:58 rc.cpp:298 rc.cpp:798
-msgid "Composer:"
-msgstr "Zeneszerző:"
-
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
-msgid "Genre:"
-msgstr "Műfaj:"
-
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#: po/rc.cpp:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
+#: po/rc.cpp:98 po/rc.cpp:965 rc.cpp:98 rc.cpp:965
 msgid "Year:"
 msgstr "Év:"
 
-#. i18n: file: devices/albumdetails.ui:99
+#. i18n: file: devices/albumdetails.ui:102
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:70 rc.cpp:70
+#: po/rc.cpp:101 rc.cpp:101
 msgid "Disc:"
 msgstr "Lemez:"
 
-#. i18n: file: devices/albumdetails.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:73 rc.cpp:73
-msgid "Single artist:"
-msgstr "Szólista:"
+#. i18n: file: devices/albumdetails.ui:115
+#. i18n: ectx: property (text), widget (QCheckBox, singleArtist)
+#: po/rc.cpp:104 rc.cpp:104
+msgid "Single artist"
+msgstr "Egyetlen előadó:"
 
-#. i18n: file: devices/audiocdsettings.ui:20
+#. i18n: file: devices/audiocdsettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:119 rc.cpp:119
 msgid "Album and Track Information Retrieval"
 msgstr "Album- és száminformációk visszakeresése"
 
-#. i18n: file: devices/audiocdsettings.ui:26
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:91 rc.cpp:91
-msgid "Automatically lookup:"
-msgstr "Automatikus áttekintés:"
-
-#. i18n: file: devices/audiocdsettings.ui:39
+#. i18n: file: devices/audiocdsettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:122 rc.cpp:122
 msgid "Initially look up via:"
 msgstr "Elsőként evvel keressen:"
 
-#. i18n: file: devices/audiocdsettings.ui:52
+#. i18n: file: devices/audiocdsettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:125 rc.cpp:125
 msgid "CDDB Host:"
 msgstr "CDDB Host:"
 
-#. i18n: file: devices/audiocdsettings.ui:65
+#. i18n: file: devices/audiocdsettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:128 rc.cpp:128
 msgid "CDDB Port:"
 msgstr "CDDB Port:"
 
-#. i18n: file: devices/audiocdsettings.ui:88
+#. i18n: file: devices/audiocdsettings.ui:84
+#. i18n: ectx: property (text), widget (QCheckBox, cdAuto)
+#: po/rc.cpp:131 rc.cpp:131
+msgid "Lookup information as soon as CD is inserted"
+msgstr "Információk keresése a CD beillesztése után"
+
+#. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:134 rc.cpp:134
 msgid "Audio Extraction"
 msgstr "Audi kivonatolás"
 
-#. i18n: file: devices/audiocdsettings.ui:94
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:106 rc.cpp:106
-msgid "Full paranoia mode (best quality):"
-msgstr "Teljes paranoia mód (legjobb minőség):"
+#. i18n: file: devices/audiocdsettings.ui:100
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaFull)
+#: po/rc.cpp:137 rc.cpp:137
+msgid "Full paranoia mode (best quality)"
+msgstr "Teljes paranoia mód (legjobb minőség)"
 
 #. i18n: file: devices/audiocdsettings.ui:107
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:109 rc.cpp:109
-msgid "Never skip on read error:"
-msgstr "Olvasási hiba átlépése - soha:"
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaNeverSkip)
+#: po/rc.cpp:140 rc.cpp:140
+msgid "Never skip on read error"
+msgstr "Olvasási hiba átlépése - soha"
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:112 rc.cpp:112
+#: po/rc.cpp:143 rc.cpp:143
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3924,188 +4151,262 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
 #. i18n: file: gui/serversettings.ui:325
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
-#: po/rc.cpp:115 po/rc.cpp:415 po/rc.cpp:433 po/rc.cpp:650 po/rc.cpp:671
-#: rc.cpp:115 rc.cpp:415 rc.cpp:433 rc.cpp:650 rc.cpp:671
+#: po/rc.cpp:146 po/rc.cpp:479 po/rc.cpp:497 po/rc.cpp:805 po/rc.cpp:826
+#: rc.cpp:146 rc.cpp:479 rc.cpp:497 rc.cpp:805 rc.cpp:826
 msgid "Music folder:"
 msgstr "Zenekönyvtár:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:149 rc.cpp:149
 msgid "Copy album covers as:"
 msgstr "Másolja az albumborítókat mint:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: po/rc.cpp:152 rc.cpp:152
 msgid "Maximum cover size:"
 msgstr "Borító maximális mérete:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:82
-#. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:124 rc.cpp:124
-msgid "'Various Artists' workaround:"
-msgstr "'Vegyes előadók' munkakörnyezet:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, autoScanLabel)
-#: po/rc.cpp:127 rc.cpp:127
-msgid "Automatically scan music when attached:"
-msgstr "Csatlakozáskor zene automatikus keresése:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:108
-#. i18n: ectx: property (text), widget (BuddyLabel, useCacheLabel)
-#: po/rc.cpp:130 rc.cpp:130
-msgid "Use cache:"
-msgstr "Cache használata:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:121
+#. i18n: file: devices/devicepropertieswidget.ui:85
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:133 rc.cpp:133
+#: po/rc.cpp:155 rc.cpp:155
 msgid "Default volume:"
 msgstr "Alaphangerő:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, fixVariousArtists)
+#: po/rc.cpp:158 rc.cpp:158
+msgid "'Various Artists' workaround"
+msgstr "'Válogatás' munkakörnyezet:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:99
+#. i18n: ectx: property (text), widget (QCheckBox, autoScan)
+#: po/rc.cpp:161 rc.cpp:161
+msgid "Automatically scan music when attached"
+msgstr "Zene automatikus keresése csatlakoztatáskor"
+
+#. i18n: file: devices/devicepropertieswidget.ui:106
+#. i18n: ectx: property (text), widget (QCheckBox, useCache)
+#: po/rc.cpp:164 rc.cpp:164
+msgid "Use cache"
+msgstr "Cache használata"
+
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#: po/rc.cpp:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
+#: po/rc.cpp:167 po/rc.cpp:971 rc.cpp:167 rc.cpp:971
 msgid "Filenames"
 msgstr "Fájlnevek"
 
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
-msgid "Use only ASCII characters:"
-msgstr "Csak ASCII-es karakterek használata:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
-msgid "Replace spaces with underscores:"
-msgstr "Szóközök cseréje aláhúzásra:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
-msgid "Ignore 'The' in artist names:"
-msgstr "A 'The' elvetése az előadók nevében:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
+#: po/rc.cpp:170 po/rc.cpp:974 rc.cpp:170 rc.cpp:974
 msgid "Filename scheme:"
 msgstr "Fájlnév-séma:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
-msgid "VFAT safe:"
-msgstr "VFAT tároló:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:250
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#: po/rc.cpp:173 po/rc.cpp:977 rc.cpp:173 rc.cpp:977
+msgid "VFAT safe"
+msgstr "VFAT tároló"
+
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#: po/rc.cpp:176 po/rc.cpp:980 rc.cpp:176 rc.cpp:980
+msgid "Use only ASCII characters"
+msgstr "Kizárólag ASCII-es karakterek használata"
+
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#: po/rc.cpp:179 po/rc.cpp:983 rc.cpp:179 rc.cpp:983
+msgid "Replace spaces with underscores"
+msgstr "Szóközök cseréje aláhúzásra"
+
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#: po/rc.cpp:182 po/rc.cpp:986 rc.cpp:182 rc.cpp:986
+msgid "Ignore 'The' in artist names"
+msgstr "A 'The' elvetése az előadók nevében"
+
+#. i18n: file: devices/devicepropertieswidget.ui:192
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:185 rc.cpp:185
 msgid "Transcoding"
 msgstr "Átkódolás"
 
-#. i18n: file: devices/devicepropertieswidget.ui:261
-#. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:157 rc.cpp:157
-msgid "Only transcode if source file is of a different format:"
-msgstr "Átkódolás csak akkor, ha a forrásfájl eltérő formátumú:"
+#. i18n: file: devices/devicepropertieswidget.ui:201
+#. i18n: ectx: property (text), widget (QCheckBox, transcoderWhenDifferent)
+#: po/rc.cpp:188 rc.cpp:188
+msgid "Only transcode if source file is of a different format"
+msgstr "Átkódolás csak akkor, ha a forrásfájl eltérő formátumú"
 
-#. i18n: file: devices/filenameschemedialog.ui:29
+#. i18n: file: devices/filenameschemedialog.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:191 rc.cpp:191
 msgid "Example:"
 msgstr "Példa:"
 
-#. i18n: file: devices/filenameschemedialog.ui:58
+#. i18n: file: devices/filenameschemedialog.ui:67
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:194 rc.cpp:194
 msgid "About filename schemes"
 msgstr "A fájlnév-sémákról"
 
-#. i18n: file: devices/filenameschemedialog.ui:70
+#. i18n: file: devices/filenameschemedialog.ui:79
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumArtist)
+#: po/rc.cpp:197 rc.cpp:197
+msgid ""
+"The artist of the album. For most albums, this will be the same as the "
+"<i>Track Artist.</i> For compilations, this will often be <i>Various Artists."
+"</i>"
+msgstr ""
+"Az album előadója. A legtöbb album esetén, ez ugyanaz, mint a <i>Szám "
+"előadója</i>. Válogatások esetén ez többnyire <i>Válogatott előadók</i>-at "
+"jelent."
+
+#. i18n: file: devices/filenameschemedialog.ui:82
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:200 rc.cpp:200
 msgid "Album Artist"
 msgstr "Album előadója"
 
-#. i18n: file: devices/filenameschemedialog.ui:77
+#. i18n: file: devices/filenameschemedialog.ui:89
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumTitle)
+#: po/rc.cpp:203 rc.cpp:203
+msgid "The name of the album."
+msgstr "Az album címe."
+
+#. i18n: file: devices/filenameschemedialog.ui:92
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:206 rc.cpp:206
 msgid "Album Title"
 msgstr "Album címe"
 
-#. i18n: file: devices/filenameschemedialog.ui:91
+#. i18n: file: devices/filenameschemedialog.ui:99
+#. i18n: ectx: property (toolTip), widget (QPushButton, composer)
+#: po/rc.cpp:209 rc.cpp:209
+msgid "The composer."
+msgstr "Zeneszerző."
+
+#. i18n: file: devices/filenameschemedialog.ui:109
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtist)
+#: po/rc.cpp:215 rc.cpp:215
+msgid "The artist of each track."
+msgstr "Az egyes számok előadói."
+
+#. i18n: file: devices/filenameschemedialog.ui:112
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:218 rc.cpp:218
 msgid "Track Artist"
 msgstr "Szám előadója"
 
-#. i18n: file: devices/filenameschemedialog.ui:98
+#. i18n: file: devices/filenameschemedialog.ui:119
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackTitle)
+#: po/rc.cpp:221 rc.cpp:221
+msgid "The track title (without <i>Track Artist</i>)."
+msgstr "A szám címe (a <i>Szám előadója</i> nélkül)."
+
+#. i18n: file: devices/filenameschemedialog.ui:122
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:224 rc.cpp:224
 msgid "Track Title"
 msgstr "Szám címe"
 
-#. i18n: file: devices/filenameschemedialog.ui:117
+#. i18n: file: devices/filenameschemedialog.ui:141
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtistAndTitle)
+#: po/rc.cpp:227 rc.cpp:227
+msgid ""
+"The track title (with <i>Track Artist</i>, if different to <i>Album Artist</"
+"i>)."
+msgstr ""
+"A szám címe (a <i>Szám előadója</i>-val, ha az eltér az más, mint az<i>Album "
+"előadója</i>)."
+
+#. i18n: file: devices/filenameschemedialog.ui:144
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:230 rc.cpp:230
 msgid "Track Title (+Artist)"
 msgstr "Szám címe (+Artist)"
 
-#. i18n: file: devices/filenameschemedialog.ui:124
+#. i18n: file: devices/filenameschemedialog.ui:151
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackNo)
+#: po/rc.cpp:233 rc.cpp:233
+msgid "The track number."
+msgstr "Szám sorszáma"
+
+#. i18n: file: devices/filenameschemedialog.ui:154
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:184 rc.cpp:184
+#: po/rc.cpp:236 rc.cpp:236
 msgid "Track #"
 msgstr "Szám #"
 
-#. i18n: file: devices/filenameschemedialog.ui:131
+#. i18n: file: devices/filenameschemedialog.ui:161
+#. i18n: ectx: property (toolTip), widget (QPushButton, cdNo)
+#: po/rc.cpp:239 rc.cpp:239
+msgid ""
+"The album number of a multi-album album. Often compilations consist of "
+"several albums."
+msgstr ""
+"Többlemezes albumban a lemez sorszáma. A válogatások sokszor több lemezből "
+"állnak."
+
+#. i18n: file: devices/filenameschemedialog.ui:164
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:187 rc.cpp:187
+#: po/rc.cpp:242 rc.cpp:242
 msgid "CD #"
 msgstr "CD #"
 
+#. i18n: file: devices/filenameschemedialog.ui:171
+#. i18n: ectx: property (toolTip), widget (QPushButton, year)
+#: po/rc.cpp:245 rc.cpp:245
+msgid "The year of the album's release."
+msgstr "Az album kiadásának éve."
+
+#. i18n: file: devices/filenameschemedialog.ui:181
+#. i18n: ectx: property (toolTip), widget (QPushButton, genre)
+#: po/rc.cpp:251 rc.cpp:251
+msgid "The genre of the album."
+msgstr "Az album műfaja."
+
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:196 rc.cpp:196
+#: po/rc.cpp:257 rc.cpp:257
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -4115,17 +4416,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
-#: po/rc.cpp:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
+#: po/rc.cpp:260 po/rc.cpp:353 po/rc.cpp:848 rc.cpp:260 rc.cpp:353 rc.cpp:848
 msgid "Type:"
 msgstr "Típus:"
 
@@ -4137,14 +4438,16 @@ msgstr "Típus:"
 #. i18n: ectx: property (text), widget (BuddyLabel, nameLabel)
 #. i18n: file: gui/serversettings.ui:63
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
-#: rc.cpp:638
+#: po/rc.cpp:263 po/rc.cpp:793 streams/streamdialog.cpp:71 rc.cpp:263
+#: rc.cpp:793
 msgid "Name:"
 msgstr "Név:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:205 rc.cpp:205
+#. i18n: file: gui/interfacesettings.ui:122
+#. i18n: ectx: property (title), widget (QGroupBox, optionsGroup)
+#: po/rc.cpp:266 rc.cpp:266 po/rc.cpp:551 rc.cpp:551
 msgid "Options"
 msgstr "Opciók"
 
@@ -4168,8 +4471,8 @@ msgstr "Opciók"
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: network/proxysettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPortLabel)
-#: po/rc.cpp:211 po/rc.cpp:250 po/rc.cpp:409 po/rc.cpp:644 po/rc.cpp:708
-#: rc.cpp:211 rc.cpp:250 rc.cpp:409 rc.cpp:644 rc.cpp:708
+#: po/rc.cpp:272 po/rc.cpp:311 po/rc.cpp:473 po/rc.cpp:799 po/rc.cpp:860
+#: rc.cpp:272 rc.cpp:311 rc.cpp:473 rc.cpp:799 rc.cpp:860
 msgid "Port:"
 msgstr "Port:"
 
@@ -4185,7 +4488,7 @@ msgstr "Port:"
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2x)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:322
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel)
-#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
+#: po/rc.cpp:275 po/rc.cpp:293 po/rc.cpp:314 rc.cpp:275 rc.cpp:293 rc.cpp:314
 msgid "User:"
 msgstr "Felhasználó:"
 
@@ -4197,7 +4500,7 @@ msgstr "Felhasználó:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:218
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2x)
-#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:278 po/rc.cpp:296 rc.cpp:278 rc.cpp:296
 msgid "Domain:"
 msgstr "Kiszolgáló:"
 
@@ -4209,7 +4512,7 @@ msgstr "Kiszolgáló:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:248
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2)
-#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
+#: po/rc.cpp:284 po/rc.cpp:302 rc.cpp:284 rc.cpp:302
 msgid "Share:"
 msgstr "Megosztás:"
 
@@ -4221,7 +4524,7 @@ msgstr "Megosztás:"
 #. i18n: ectx: property (text), widget (QLabel, label_4)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:263
 #. i18n: ectx: property (text), widget (QLabel, label_4x)
-#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
+#: po/rc.cpp:287 po/rc.cpp:305 rc.cpp:287 rc.cpp:305
 msgid ""
 "<i><b>NOTE:</b> If you enter a password here, it will be stored "
 "<b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the "
@@ -4233,7 +4536,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:229 rc.cpp:229
+#: po/rc.cpp:290 rc.cpp:290
 msgid "Service name:"
 msgstr "Szolgáltatás neve:"
 
@@ -4245,19 +4548,19 @@ msgstr "Szolgáltatás neve:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:390
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
+#: po/rc.cpp:317 po/rc.cpp:326 rc.cpp:317 rc.cpp:326
 msgid "Folder:"
 msgstr "Könyvtár:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:259 rc.cpp:259
+#: po/rc.cpp:320 rc.cpp:320
 msgid "Extra Options:"
 msgstr "Extra opciók:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:323 rc.cpp:323
 msgid ""
 "<i><b>NOTE:</b> Due to the way sshfs works, a suitable ssh-askpass "
 "application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter "
@@ -4269,7 +4572,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:329 rc.cpp:329
 msgid ""
 "<i><b>NOTE:</b> This dialog is only used to add remote devices (e.g. via "
 "Samba), or to access locally mounted folders. For normal media players, "
@@ -4283,112 +4586,100 @@ msgstr ""
 
 #. i18n: file: dynamic/dynamicpage.ui:26
 #. i18n: ectx: property (text), widget (StatusLabel, infoLabel)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:332 rc.cpp:332
 msgid "No dynamizer port defined in server settings."
 msgstr "A szerverbeállításoknál dinamizáló port nincs meghatározva."
 
 #. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:274 rc.cpp:274
+#: po/rc.cpp:335 rc.cpp:335
 msgid "Remote dynamizer is not running."
 msgstr "A távoli dinamizáló nem fut."
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:277 rc.cpp:277
+#: po/rc.cpp:338 rc.cpp:338
 msgid "Name of Dynamic Rules"
 msgstr "A dinamikus szabályok neve"
 
 #. i18n: file: dynamic/dynamicrules.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, editBtn)
-#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
+#: po/rc.cpp:344 streams/streamspage.cpp:62 rc.cpp:344
 msgid "Edit"
 msgstr "Szerkesztés"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:350 rc.cpp:350
 msgid "About Rules"
 msgstr "Szabályokról"
 
-#. i18n: file: dynamic/dynamicrule.ui:38
+#. i18n: file: dynamic/dynamicrule.ui:37
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:356 rc.cpp:356
+msgid "Include songs that match the following:"
+msgstr "Beleértve a következőknek megfelelő dalokat:"
+
+#. i18n: file: dynamic/dynamicrule.ui:42
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:359 rc.cpp:359
+msgid "Exclude songs that match the following:"
+msgstr "Kizárva a következőknek megfelelő dalokat:"
+
+#. i18n: file: dynamic/dynamicrule.ui:63
+#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
+#: po/rc.cpp:365 rc.cpp:365
+msgid "Artists similar to:"
+msgstr "Ehhez hasonló előadók:"
+
+#. i18n: file: dynamic/dynamicrule.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:295 rc.cpp:295
+#: po/rc.cpp:368 rc.cpp:368
 msgid "Album Artist:"
 msgstr "Album előadó:"
 
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
-msgid "Album:"
-msgstr "Album"
-
-#. i18n: file: dynamic/dynamicrule.ui:103
+#. i18n: file: dynamic/dynamicrule.ui:141
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:310 rc.cpp:310
+#: po/rc.cpp:383 rc.cpp:383
 msgid "From Year:"
 msgstr "Évből:"
 
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#: po/rc.cpp:386 po/rc.cpp:392 rc.cpp:386 rc.cpp:392
 msgid "Any"
 msgstr "Akármi"
 
-#. i18n: file: dynamic/dynamicrule.ui:126
+#. i18n: file: dynamic/dynamicrule.ui:164
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:316 rc.cpp:316
+#: po/rc.cpp:389 rc.cpp:389
 msgid "To Year:"
 msgstr "Évig"
 
-#. i18n: file: dynamic/dynamicrule.ui:149
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:322 rc.cpp:322
-msgid "Exact match:"
-msgstr "Pontos egyezés:"
-
-#. i18n: file: dynamic/dynamicrule.ui:173
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:328 rc.cpp:328
-msgid "Include songs that match the following:"
-msgstr "Beleértve a következőknek megfelelő dalokat:"
-
-#. i18n: file: dynamic/dynamicrule.ui:178
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:331 rc.cpp:331
-msgid "Exclude songs that match the following:"
-msgstr "Kizárva a következőknek megfelelő dalokat:"
+#. i18n: file: dynamic/dynamicrule.ui:187
+#. i18n: ectx: property (text), widget (QCheckBox, exactCheck)
+#: po/rc.cpp:395 rc.cpp:395
+msgid "Exact match"
+msgstr "Pontos egyezés"
 
-#. i18n: file: dynamic/dynamicrule.ui:186
-#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:334 rc.cpp:334
-msgid "Artists similar to:"
-msgstr "Ehhez hasonló előadók:"
-
-#. i18n: file: dynamic/dynamicrule.ui:236
+#. i18n: file: dynamic/dynamicrule.ui:231
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:337 rc.cpp:337
+#: po/rc.cpp:398 rc.cpp:398
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
 "<i><b>Megjegyzés:</b> csak azokhoz a címkékhez írj értéket, amelyekre "
 "keresni akarsz.</i>"
 
-#. i18n: file: dynamic/dynamicrule.ui:262
+#. i18n: file: dynamic/dynamicrule.ui:260
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:340 rc.cpp:340
+#: po/rc.cpp:401 rc.cpp:401
 msgid ""
 "<i><b>NOTE</b> For genre, end string with an asterisk to match various "
 "genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. </i>"
@@ -4397,69 +4688,63 @@ msgstr ""
 "csillaggal zárd pl. 'rock*' megfelelője a 'Hard Rock' és a 'Rock and Roll' "
 "is. </i>"
 
-#. i18n: file: gui/coverdialog.ui:23
-#. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:343 rc.cpp:343
-msgid "<html><head/><body><p>Cancel current query</p></body></html>"
-msgstr "<html><head/><body><p>Jelenlegi keresés megszakítása</p></body></html>"
-
-#. i18n: file: gui/coverdialog.ui:37
+#. i18n: file: gui/coverdialog.ui:30
 #. i18n: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:349 rc.cpp:349
-msgid "<html><head/><body><p>Add a local file</p></body></html>"
-msgstr "<html><head/><body><p>Helyi fájl hozzáadása</p></body></html>"
-
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:352 po/rc.cpp:442 rc.cpp:352 rc.cpp:442
-msgid "Save downloaded covers in music folder:"
-msgstr "Letöltött borítók mentése a zenekönyvtárban:"
-
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:355 po/rc.cpp:445 rc.cpp:355 rc.cpp:445
-msgid "Save downloaded lyrics in music folder:"
-msgstr "Letöltött dalszövegek mentése a zenekönyvtárban:"
-
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#: po/rc.cpp:358 po/rc.cpp:448 rc.cpp:358 rc.cpp:448
-msgid "Save downloaded backdrops in music folder:"
-msgstr "Letöltött hátterek mentése a a zenekönyvtárban:"
-
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:361 po/rc.cpp:451 rc.cpp:361 rc.cpp:451
-msgid "Save list of favorite streams in music folder:"
-msgstr "Kedvenc stream-ek mentése a zenekönyvtárban:"
-
-#. i18n: file: gui/filesettings.ui:110
+#: po/rc.cpp:407 rc.cpp:407
+msgid "Add a local file"
+msgstr "Helyi fájl hozzáadása."
+
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#: po/rc.cpp:413 po/rc.cpp:506 rc.cpp:413 rc.cpp:506
+msgid "Save downloaded covers in music folder"
+msgstr "Letöltött borítók mentése a zenekönyvtárban"
+
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#: po/rc.cpp:416 po/rc.cpp:509 rc.cpp:416 rc.cpp:509
+msgid "Save downloaded lyrics in music folder"
+msgstr "Letöltött dalszövegek mentése a zenekönyvtárban"
+
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#: po/rc.cpp:419 po/rc.cpp:512 rc.cpp:419 rc.cpp:512
+msgid "Save downloaded backdrops in music folder"
+msgstr "Letöltött hátterek mentése a a zenekönyvtárban"
+
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#: po/rc.cpp:422 po/rc.cpp:515 rc.cpp:422 rc.cpp:515
+msgid "Save list of favorite streams in music folder"
+msgstr "Kedvenc stream-ek mentése a zenekönyvtárban"
+
+#. i18n: file: gui/filesettings.ui:79
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:425 rc.cpp:425
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, lyrics, or "
 "backdrops, within the music folder, and you do not have write access to this "
@@ -4479,9 +4764,21 @@ msgstr ""
 "stream-eket ne mentsen a zenekönyvtárba, akkor ezeket a helyi beállítások "
 "könyvtárba menti - és csak te érheted el.</i>"
 
-#. i18n: file: gui/filesettings.ui:145
+#. i18n: file: gui/filesettings.ui:108
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:428 rc.cpp:428
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. (i.e. 'Artist/Album/Tracks')"
+"</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b>A Cantata csak a zenekönyvtár szerkezetén belül, "
+"legfeljebb 2 szint mélységig képes háttereket és előadói képeket menteni. "
+"(azaz 'Előadó/Album/szám')</i>"
+
+#. i18n: file: gui/filesettings.ui:140
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:431 rc.cpp:431
 msgid ""
 "<i><b>NOTE:</b> If you change the location where streams are stored (i.e. "
 "you toggle the 'Save list of favorite streams in music folder' option), then "
@@ -4499,19 +4796,19 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:370 rc.cpp:370
+#: po/rc.cpp:434 rc.cpp:434
 msgid "Cantata First Run"
 msgstr "Cantata első futása"
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:373 rc.cpp:373
+#: po/rc.cpp:437 rc.cpp:437
 msgid "Welcome to Cantata"
 msgstr "Légy üdvözölve a Cantata-ban"
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:440 rc.cpp:440
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4531,13 +4828,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:379 rc.cpp:379
+#: po/rc.cpp:443 rc.cpp:443
 msgid "<html><head/><body><p>Welcome to Cantata</p></body></html>"
 msgstr "<html><head/><body><p>Légy üdvözölve a Cantata-ban.</p></body></html>"
 
 #. i18n: file: gui/initialsettingswizard.ui:128
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:382 rc.cpp:382
+#: po/rc.cpp:446 rc.cpp:446
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4553,13 +4850,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:166
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:385 rc.cpp:385
+#: po/rc.cpp:449 rc.cpp:449
 msgid "Standard multi-user/server setup"
 msgstr "Szabványos többfelhasználós, vagy szerver beállítások."
 
 #. i18n: file: gui/initialsettingswizard.ui:179
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:388 rc.cpp:388
+#: po/rc.cpp:452 rc.cpp:452
 msgid ""
 "<i>Select this option if your music collection is shared between users, your "
 "MPD instance is running on another machine, or you already have a personal "
@@ -4575,13 +4872,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:211
 #. i18n: ectx: property (text), widget (QRadioButton, basic)
-#: po/rc.cpp:391 rc.cpp:391
+#: po/rc.cpp:455 rc.cpp:455
 msgid "Basic single user setup"
 msgstr "Egyfelhasználós alapbeállítások"
 
 #. i18n: file: gui/initialsettingswizard.ui:224
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
-#: po/rc.cpp:394 rc.cpp:394
+#: po/rc.cpp:458 rc.cpp:458
 msgid ""
 "<i>Select this option if your music collection is not shared with others, "
 "and you wish Cantata to configure and control the MPD instance.</i>"
@@ -4591,7 +4888,7 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:397 rc.cpp:397
+#: po/rc.cpp:461 rc.cpp:461
 msgid ""
 "<html><head/><body><p>For more information on MPD itself, please refer to "
 "the MPD website <a href=\"http://www.musicpd.org\"><span style=\" text-"
@@ -4607,13 +4904,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:400 rc.cpp:400
+#: po/rc.cpp:464 rc.cpp:464
 msgid "Connection details"
 msgstr "Gyűjtemény részletei"
 
 #. i18n: file: gui/initialsettingswizard.ui:341
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:403 rc.cpp:403
+#: po/rc.cpp:467 rc.cpp:467
 msgid ""
 "The settings below are the basic settings required by Cantata. Please enter "
 "the relevant details, and use the 'Connect' button to test the connection."
@@ -4629,19 +4926,21 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: gui/serversettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
-#: po/rc.cpp:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
+#: po/rc.cpp:470 po/rc.cpp:796 rc.cpp:470 rc.cpp:796
 msgid "Host (or local socket):"
 msgstr "Host (vagy helyi csatlakozó):"
 
 #. i18n: file: gui/initialsettingswizard.ui:494
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:421 rc.cpp:421
+#: po/rc.cpp:485 rc.cpp:485
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
-"lyrics, etc.</i>"
+"lyrics, etc. If you're MPD instance is on a remote host, you may set this to "
+"a HTTP URL.</i>"
 msgstr ""
 "<i><b>Megjegyzés:</b> a 'Zenekönyvtár' beállításait borítóképek, dalszövegek "
-"stb. keresésére használja.</i>"
+"stb. keresésére használja. Haz MPD-d távoli kiszolgálón van, akkor ez HTTP "
+"URL-re állítható.</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:520
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
@@ -4651,7 +4950,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
 #. i18n: file: gui/serversettings.ui:225
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#: po/rc.cpp:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
+#: po/rc.cpp:488 po/rc.cpp:820 rc.cpp:488 rc.cpp:820
 msgid ""
 "<i><b>NOTE:</b> When using a local socket the full absolute path to the "
 "socket needs to be set. (Port number is not required.)</i>"
@@ -4661,25 +4960,25 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:553
 #. i18n: ectx: property (text), widget (QLabel, label_13)
-#: po/rc.cpp:427 rc.cpp:427
+#: po/rc.cpp:491 rc.cpp:491
 msgid "Music folder"
 msgstr "Zenekönyvtár"
 
 #. i18n: file: gui/initialsettingswizard.ui:576
 #. i18n: ectx: property (text), widget (QLabel, label_12)
-#: po/rc.cpp:430 rc.cpp:430
+#: po/rc.cpp:494 rc.cpp:494
 msgid "Please choose the folder containing your music collection."
 msgstr "Válaszd ki a zenegyűjteményedet tartalmazó könyvtárat."
 
 #. i18n: file: gui/initialsettingswizard.ui:662
 #. i18n: ectx: property (text), widget (QLabel, label_6f)
-#: po/rc.cpp:436 rc.cpp:436
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Covers, Lyrics, and Streams"
 msgstr "Borítók, dalszövegek és hangfolyamok"
 
 #. i18n: file: gui/initialsettingswizard.ui:685
 #. i18n: ectx: property (text), widget (QLabel, label_5f)
-#: po/rc.cpp:439 rc.cpp:439
+#: po/rc.cpp:503 rc.cpp:503
 msgid ""
 "<p>Cantata will download missing covers, and lyrics, from the internet. "
 "Cantata also allows you to save a list of internet streams (e.g. Radio "
@@ -4694,9 +4993,9 @@ msgstr ""
 "fájlok lementését a zenekönyvtáradba, vagy a saját cache/beállítások "
 "könyvtáradban.</p>"
 
-#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: file: gui/initialsettingswizard.ui:758
 #. i18n: ectx: property (text), widget (QLabel, persNote)
-#: po/rc.cpp:454 rc.cpp:454
+#: po/rc.cpp:518 rc.cpp:518
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
 "the music folder, and you do not have write access to this folder, then "
@@ -4716,27 +5015,39 @@ msgstr ""
 "stream-eket ne mentse a zenekönyvtárba, akkor ezeket a helyi beállítások "
 "szerinti könyvtárba menti - és csak te érheted el.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:824
-#. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:457 rc.cpp:457
+#. i18n: file: gui/initialsettingswizard.ui:784
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:521 rc.cpp:521
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. i.e. 'Artist/Album/Tracks'."
+"</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b>A Cantata csak a zenekönyvtár szerkezetén belül, "
+"legfeljebb 2 szint mélységig képes háttereket és előadói képeket menteni, "
+"azaz 'Előadó/Album/szám'.</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:810
+#. i18n: ectx: property (text), widget (StateLabel, httpNote)
+#: po/rc.cpp:524 rc.cpp:524
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata "
 "currently cannot upload files to external HTTP servers. Therefore, the above "
-"settings should be left disabled.</i>"
+"settings should be left un-checked.</i>"
 msgstr ""
-"<i><b>Megjegyzés:</b> aA 'Zenekönyvtár' HTTP címre mutat, miközben a Cantata "
-"pillanatnyilag nem tud fájlokat feltölteni külső HTTP szerverekre. Emiatt a "
-"fenti beállításokat ki kell kapcsolni.</i>"
+"<i><b>Megjegyzés:</b>A 'Zenekönyvtár' HTTP címre mutat, miközben a Cantata "
+"pillanatnyilag nem tud fájlokat feltölteni külső HTTP szerverekre. Ezért a "
+"fenti beállítások maradjanak kijelöletlenül.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:857
+#. i18n: file: gui/initialsettingswizard.ui:843
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:460 rc.cpp:460
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Finished!"
 msgstr "Befejezve!"
 
-#. i18n: file: gui/initialsettingswizard.ui:880
+#. i18n: file: gui/initialsettingswizard.ui:866
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:463 rc.cpp:463
+#: po/rc.cpp:530 rc.cpp:530
 msgid ""
 "Cantata is now configured! If you wish to further configure Cantata (to add "
 "extra MPD hosts, etc) then Canta's configuration dialog may be accessed from "
@@ -4747,9 +5058,9 @@ msgstr ""
 "képernyőjét a menüjéből éred el, a Cantata fő képernyőjének jobb felső "
 "sarkában."
 
-#. i18n: file: gui/initialsettingswizard.ui:918
+#. i18n: file: gui/initialsettingswizard.ui:904
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:466 rc.cpp:466
+#: po/rc.cpp:533 rc.cpp:533
 msgid ""
 "<b>Warning:</b> You are not currently a member of the 'users' group. Cantata "
 "will function better (saving of album covers, lyrics, etc. with the correct "
@@ -4763,207 +5074,306 @@ msgstr ""
 "ehhez a csoporthoz. Ha te adod magad hozzá, akkor ki, és be kell "
 "jelentkezned ezek életbe léptetéséhez."
 
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:36
+#. i18n: ectx: attribute (title), widget (QWidget, sidebarTab)
+#: po/rc.cpp:536 rc.cpp:536
+msgid "Sidebar"
+msgstr "Oldalsáv"
+
+#. i18n: file: gui/interfacesettings.ui:42
+#. i18n: ectx: property (title), widget (QGroupBox, viewsGroup)
+#: po/rc.cpp:539 rc.cpp:539
+msgid "Views"
+msgstr "Nézetek"
+
+#. i18n: file: gui/interfacesettings.ui:48
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:542 rc.cpp:542
+msgid "Use the checkboxes below to configure the list of active views."
+msgstr "Az aktív nézetek beállítására használd a lenti jelölő gombokat."
+
+#. i18n: file: gui/interfacesettings.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, sbPlayQueueLabel)
+#: po/rc.cpp:545 rc.cpp:545
+msgid ""
+"<i><b>NOTE:</b> By default, the play queue appears to the side of the other "
+"views. If you enable the option above, then it will be merged into the "
+"sidebar as per other views.</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b>Alapbeállításban a lejátszási sor a többi nézet mellett "
+"jelenik meg. Ha a fenti opciót engedélyezed, akkor a többi nézethez "
+"hasonlóan bekerül az oldalsávba.</i>"
+
+#. i18n: file: gui/interfacesettings.ui:106
+#. i18n: ectx: property (text), widget (StateLabel, sbInfoLabel)
+#: po/rc.cpp:548 rc.cpp:548
+msgid ""
+"<i><b>NOTE:</b> By default, the 'Info' (current song information) view is "
+"accessible by pressing its icon in the main toolbar. If you enable the "
+"option above, then it will be merged into the sidebar as per other views.</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b> Alapbeállításban az 'Infó'-nézet (aktuális szám "
+"információi) a fő eszközsávon lévő ikon lenyomása után válik elérhetővé. Ha "
+"az opciót aktiválod, akkor a többi nézethez hasonlóan belekerül az "
+"oldalsávba.</i>"
+
+#. i18n: file: gui/interfacesettings.ui:144
+#. i18n: ectx: property (text), widget (BuddyLabel, sbPositionLabel)
+#: po/rc.cpp:557 rc.cpp:557
+msgid "Position:"
+msgstr "Pozíció:"
+
+#. i18n: file: gui/interfacesettings.ui:157
+#. i18n: ectx: property (text), widget (QCheckBox, sbIconsOnly)
+#: po/rc.cpp:560 rc.cpp:560
+msgid "Only show icons, no text"
+msgstr "Csak ikonok mutatása, szöveg nélkül"
+
+#. i18n: file: gui/interfacesettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, sbMonoIcons)
+#: po/rc.cpp:563 rc.cpp:563
+msgid "Use monochrome icons"
+msgstr "Fekete-fehér ikonok alkalmazása"
+
+#. i18n: file: gui/interfacesettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, sbAutoHide)
+#: po/rc.cpp:566 rc.cpp:566
+msgid "Auto-hide"
+msgstr "Automatikus elrejtés"
+
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#: po/rc.cpp:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
+#: po/rc.cpp:575 po/rc.cpp:594 rc.cpp:575 rc.cpp:594
 msgid "Covers:"
 msgstr "Borítók:"
 
-#. i18n: file: gui/interfacesettings.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:478 rc.cpp:478
-msgid "Show artist images:"
-msgstr "Mutassa a művész képeit:"
+#. i18n: file: gui/interfacesettings.ui:219
+#. i18n: ectx: property (text), widget (QCheckBox, libraryArtistImage)
+#: po/rc.cpp:578 rc.cpp:578
+msgid "Show artist images"
+msgstr "Mutassa a művész képeit"
 
-#. i18n: file: gui/interfacesettings.ui:81
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:481 rc.cpp:481
-msgid "Show album year:"
-msgstr "Mutassa az album évét:"
+#. i18n: file: gui/interfacesettings.ui:226
+#. i18n: ectx: property (text), widget (QCheckBox, libraryYear)
+#: po/rc.cpp:581 rc.cpp:581
+msgid "Show album year"
+msgstr "Mutassa az album évét"
 
-#. i18n: file: gui/interfacesettings.ui:123
+#. i18n: file: gui/interfacesettings.ui:258
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:484 rc.cpp:484
+#: po/rc.cpp:584 rc.cpp:584
 msgid ""
 "<i><b>NOTE:</b> When looking for artist images, Cantata will look for either "
 "artist.jpg, artist.png, 'Artist'.jpg, or 'Artist'.png,\n"
 "within the folder of the current track, or within its parent folder. If no "
-"image is found, Cantata will attempt to download one. When the image is "
-"displayed, it will be cropped (either top/bottom, or left/right) to provide "
-"a square image.</i>"
+"image is found, Cantata will attempt to download one.</i>"
 msgstr ""
-"<i><b>Megjegyzés:</b> amikor előadó képét keresi, Cantata előadó.jpg,-t és "
-"előadó.png-t, vagy 'Előadó.jpg',-t illetve 'Előadó.png'-t egyaránt keres.\n"
+"<i><b>Megjegyzés:</b> amikor előadó képét keresi, a Cantata előadó.jpg,-t, "
+"'Előadó'.jpg-t, vagy 'Előadó.png',-t keres \n"
 "a jelenlegi szám könyvtárában, vagy annak szülő könyvtárában. Ha nem talál "
-"képet, a Cantata megpróbál letölteni egyet. A megjelenített kép le lesz "
-"vágva (vagy lent/fent, vagy bal/jobb oldalon), hogy megfelelő kép jelenjen "
-"meg.</i>"
+"képet, a Cantata megpróbál letölteni egyet.</i>"
 
-#. i18n: file: gui/interfacesettings.ui:172
+#. i18n: file: gui/interfacesettings.ui:307
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:497 rc.cpp:497
+#: po/rc.cpp:597 rc.cpp:597
 msgid "Sort albums:"
 msgstr "Albumok rendezése:"
 
-#. i18n: file: gui/interfacesettings.ui:183
+#. i18n: file: gui/interfacesettings.ui:318
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:500 rc.cpp:500
+#: po/rc.cpp:600 rc.cpp:600
 msgid "Album/Artist"
 msgstr "Album/Előadó"
 
-#. i18n: file: gui/interfacesettings.ui:188
+#. i18n: file: gui/interfacesettings.ui:323
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:503 rc.cpp:503
+#: po/rc.cpp:603 rc.cpp:603
 msgid "Artist/Album"
 msgstr "Előadó/Album"
 
-#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: file: gui/interfacesettings.ui:328
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:506 rc.cpp:506
+#: po/rc.cpp:606 rc.cpp:606
 msgid "Artist/Year/Album"
 msgstr "Előadó/Év/Album"
 
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#: po/rc.cpp:515 po/rc.cpp:545 rc.cpp:515 rc.cpp:545
-msgid "Initially collapse albums:"
-msgstr "Induláskor az albumok becsukása:"
-
-#. i18n: file: gui/interfacesettings.ui:242
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#: po/rc.cpp:615 po/rc.cpp:645 rc.cpp:615 rc.cpp:645
+msgid "Initially collapse albums"
+msgstr "Induláskor az albumok becsukása"
+
+#. i18n: file: gui/interfacesettings.ui:367
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:518 rc.cpp:518
+#: po/rc.cpp:618 rc.cpp:618
 msgid "Other Views"
 msgstr "Egyéb nézetek"
 
-#. i18n: file: gui/interfacesettings.ui:251
+#. i18n: file: gui/interfacesettings.ui:376
 #. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
-#: po/rc.cpp:521 rc.cpp:521
+#: po/rc.cpp:621 rc.cpp:621
 msgid "Folder view style:"
 msgstr "Könyvtárnézet stílusa"
 
-#. i18n: file: gui/interfacesettings.ui:264
+#. i18n: file: gui/interfacesettings.ui:389
 #. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
-#: po/rc.cpp:524 rc.cpp:524
+#: po/rc.cpp:624 rc.cpp:624
 msgid "Streams view style:"
 msgstr "Hangfolyam-nézet stílusa:"
 
-#. i18n: file: gui/interfacesettings.ui:277
+#. i18n: file: gui/interfacesettings.ui:402
 #. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
-#: po/rc.cpp:527 rc.cpp:527
+#: po/rc.cpp:627 rc.cpp:627
 msgid "Online view style:"
 msgstr "Online-nézet stílusa:"
 
-#. i18n: file: gui/interfacesettings.ui:290
+#. i18n: file: gui/interfacesettings.ui:415
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:530 rc.cpp:530
+#: po/rc.cpp:630 rc.cpp:630
 msgid "Devices view style:"
 msgstr "Eszköznézet stílusa:"
 
-#. i18n: file: gui/interfacesettings.ui:324
-#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:539 rc.cpp:539
-msgid "Table"
-msgstr "Táblázat"
-
-#. i18n: file: gui/interfacesettings.ui:354
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueAutoExpandLabel)
-#: po/rc.cpp:548 rc.cpp:548
-msgid "Automatically expand current album:"
-msgstr "Aktuális album automatikus kinyitása:"
-
-#. i18n: file: gui/interfacesettings.ui:371
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueScrollLabel)
-#: po/rc.cpp:551 rc.cpp:551
-msgid "Scroll to current track:"
-msgstr "Aktuális számhoz görgetés:"
-
-#. i18n: file: gui/interfacesettings.ui:384
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueBackgroundLabel)
-#: po/rc.cpp:554 rc.cpp:554
-msgid "Use current album cover as background:"
-msgstr "Haználja az aktuális album borítóját háttérként:"
-
-#. i18n: file: gui/interfacesettings.ui:397
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueConfirmClearLabel)
-#: po/rc.cpp:557 rc.cpp:557
-msgid "Prompt before clearing:"
-msgstr "Törlés előtt jelezzen:"
-
-#. i18n: file: gui/interfacesettings.ui:411
+#. i18n: file: gui/interfacesettings.ui:469
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueAutoExpand)
+#: po/rc.cpp:648 rc.cpp:648
+msgid "Automatically expand current album"
+msgstr "Aktuális album automatikus megnyitása"
+
+#. i18n: file: gui/interfacesettings.ui:476
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueScroll)
+#: po/rc.cpp:651 rc.cpp:651
+msgid "Scroll to current track"
+msgstr "Aktuális számhoz görgetés"
+
+#. i18n: file: gui/interfacesettings.ui:483
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueConfirmClear)
+#: po/rc.cpp:654 rc.cpp:654
+msgid "Prompt before clearing"
+msgstr "Törlés előtt jelezzen"
+
+#. i18n: file: gui/interfacesettings.ui:509
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_cover)
+#: po/rc.cpp:663 rc.cpp:663
+msgid "Current album cover"
+msgstr "Aktuális album borítója"
+
+#. i18n: file: gui/interfacesettings.ui:638
 #. i18n: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:560 rc.cpp:560
+#: po/rc.cpp:682 rc.cpp:682
 msgid "External"
 msgstr "Külső"
 
-#. i18n: file: gui/interfacesettings.ui:417
-#. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:563 rc.cpp:563
-msgid "Show icon in notification area:"
-msgstr "Ikonok mutatása az értesítési területen:"
-
-#. i18n: file: gui/interfacesettings.ui:437
-#. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:566 rc.cpp:566
-msgid "Minimize to notification area when closed:"
-msgstr "Bezárás az értesítési területre:"
-
-#. i18n: file: gui/interfacesettings.ui:457
-#. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:569 rc.cpp:569
-msgid "Show popup messages when changing tracks:"
-msgstr "Számváltáskor felugró üzenetek mutatása:"
-
-#. i18n: file: gui/interfacesettings.ui:475
+#. i18n: file: gui/interfacesettings.ui:644
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayPopup)
+#: po/rc.cpp:685 rc.cpp:685
+msgid "Show popup messages when changing tracks"
+msgstr "A számok váltáskor legyen felugró üzenet"
+
+#. i18n: file: gui/interfacesettings.ui:654
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayCheckBox)
+#: po/rc.cpp:688 rc.cpp:688
+msgid "Show icon in notification area"
+msgstr "Ikon megjelenítése az értesítési területen"
+
+#. i18n: file: gui/interfacesettings.ui:664
+#. i18n: ectx: property (text), widget (QCheckBox, minimiseOnClose)
+#: po/rc.cpp:691 rc.cpp:691
+msgid "Minimize to notification area when closed"
+msgstr "Bezáráskor az értesítési területre csukja össze"
+
+#. i18n: file: gui/interfacesettings.ui:671
+#. i18n: ectx: property (title), widget (QGroupBox, startupState)
+#: po/rc.cpp:694 rc.cpp:694
+msgid "On Start-up:"
+msgstr "Indításkor:"
+
+#. i18n: file: gui/interfacesettings.ui:677
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateShow)
+#: po/rc.cpp:697 rc.cpp:697
+msgid "Show main window"
+msgstr "A fő menüt mutassa"
+
+#. i18n: file: gui/interfacesettings.ui:684
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateHide)
+#: po/rc.cpp:700 rc.cpp:700
+msgid "Hide main window"
+msgstr "A fő ablak elrejtése"
+
+#. i18n: file: gui/interfacesettings.ui:691
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateRestore)
+#: po/rc.cpp:703 rc.cpp:703
+msgid "Restore previous state"
+msgstr "Az előző állapot helyreállítása"
+
+#. i18n: file: gui/interfacesettings.ui:715
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:572 rc.cpp:572
+#: po/rc.cpp:706 rc.cpp:706
 msgid "General"
 msgstr "Általános:"
 
-#. i18n: file: gui/interfacesettings.ui:486
-#. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:575 rc.cpp:575
-msgid "Group single track albums:"
-msgstr "Az egyszámos albumok csoportosítása:"
-
-#. i18n: file: gui/interfacesettings.ui:503
-#. i18n: ectx: property (text), widget (BuddyLabel, useComposerLabel)
-#: po/rc.cpp:578 rc.cpp:578
-msgid "Group albums by composer:"
-msgstr "Albumok csoportosítása zeneszerző szerint:"
-
-#. i18n: file: gui/interfacesettings.ui:520
-#. i18n: ectx: property (text), widget (BuddyLabel, groupMultipleLabel)
-#: po/rc.cpp:581 rc.cpp:581
-msgid "Multiple artist albums:"
-msgstr "Több előadós albumok:"
-
-#. i18n: file: gui/interfacesettings.ui:533
-#. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:584 rc.cpp:584
-msgid "Show delete action in context menus:"
-msgstr "Törlési művelet megjelenítése a helyi menükben:"
-
-#. i18n: file: gui/interfacesettings.ui:550
-#. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:587 rc.cpp:587
-msgid "Enforce single-click activation of items:"
-msgstr "Elemek egy-kattintásos aktiválása:"
-
-#. i18n: file: gui/interfacesettings.ui:591
+#. i18n: file: gui/interfacesettings.ui:726
+#. i18n: ectx: property (text), widget (QCheckBox, groupSingle)
+#: po/rc.cpp:709 rc.cpp:709
+msgid "Group single track albums"
+msgstr "Az egyszámos albumokat csoportosítsa"
+
+#. i18n: file: gui/interfacesettings.ui:733
+#. i18n: ectx: property (text), widget (QCheckBox, useComposer)
+#: po/rc.cpp:712 rc.cpp:712
+msgid "Group albums by composer"
+msgstr "Albumok csoportosítása zeneszerző szerint"
+
+#. i18n: file: gui/interfacesettings.ui:740
+#. i18n: ectx: property (text), widget (QCheckBox, groupMultiple)
+#: po/rc.cpp:715 rc.cpp:715
+msgid "Group multiple artist albums under 'Various Artists'"
+msgstr "A vegyes előadói albumokat a 'Válogatások' alatt csoportosítsa"
+
+#. i18n: file: gui/interfacesettings.ui:747
+#. i18n: ectx: property (text), widget (QCheckBox, fetchCovers)
+#: po/rc.cpp:718 rc.cpp:718
+msgid "Fetch missing covers from Last.fm"
+msgstr "A hiányzó borítók letöltése a Last.fm-ről"
+
+#. i18n: file: gui/interfacesettings.ui:754
+#. i18n: ectx: property (text), widget (QCheckBox, cacheScaledCovers)
+#: po/rc.cpp:721 rc.cpp:721
+msgid "Cache scaled covers"
+msgstr "Méretarányos borítók cache-be"
+
+#. i18n: file: gui/interfacesettings.ui:761
+#. i18n: ectx: property (text), widget (QCheckBox, showDeleteAction)
+#: po/rc.cpp:724 rc.cpp:724
+msgid "Show delete action in context menus"
+msgstr "Törlési művelet megjelenítése a helyi menükben"
+
+#. i18n: file: gui/interfacesettings.ui:768
+#. i18n: ectx: property (text), widget (QCheckBox, forceSingleClick)
+#: po/rc.cpp:727 rc.cpp:727
+msgid "Enforce single-click activation of items"
+msgstr "Elemek egy-kattintásos aktiválását alkalmazza"
+
+#. i18n: file: gui/interfacesettings.ui:775
+#. i18n: ectx: property (text), widget (BuddyLabel, langLabel)
+#: po/rc.cpp:730 rc.cpp:730
+msgid "Language:"
+msgstr "Nyelv:"
+
+#. i18n: file: gui/interfacesettings.ui:806
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:590 rc.cpp:590
+#: po/rc.cpp:733 rc.cpp:733
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
@@ -4971,87 +5381,103 @@ msgstr ""
 "<i><b>Megjegyzés:</b> az 'Elemek egy-kattintásos aktiválása' "
 "engedélyezésekor a Cantata újraindítása szükséges.</i>"
 
-#. i18n: file: gui/mainwindow.ui:287
+#. i18n: file: gui/interfacesettings.ui:835
+#. i18n: ectx: property (text), widget (StateLabel, langNoteLabel)
+#: po/rc.cpp:736 rc.cpp:736
+msgid ""
+"<i><b>NOTE:</b> Changing the language setting will require a re-start of "
+"Cantata.</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b>a nyelvi beállítások változtatása esetén a Cantata "
+"újraindítása szükséges.</i>"
+
+#. i18n: file: gui/mainwindow.ui:298
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:593 rc.cpp:593
+#: po/rc.cpp:739 rc.cpp:739
 msgid "[Dynamic]"
 msgstr "[Dinamikus]"
 
-#. i18n: file: gui/playbacksettings.ui:20
+#. i18n: file: gui/playbacksettings.ui:38
+#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
+#: po/rc.cpp:745 rc.cpp:745
+msgid "Fadeout on stop:"
+msgstr "Megálláskor lekeverés:"
+
+#. i18n: file: gui/playbacksettings.ui:48
+#. i18n: ectx: property (suffix), widget (QSpinBox, stopFadeDuration)
+#: po/rc.cpp:748 rc.cpp:748
+msgid " ms"
+msgstr " ms"
+
+#. i18n: file: gui/playbacksettings.ui:58
+#. i18n: ectx: property (text), widget (QCheckBox, stopOnExit)
+#: po/rc.cpp:754 rc.cpp:754
+msgid "Stop playback on exit"
+msgstr "Kilépéskor a lejátszás megállítása"
+
+#. i18n: file: gui/playbacksettings.ui:65
+#. i18n: ectx: property (text), widget (QCheckBox, stopDynamizerOnExit)
+#: po/rc.cpp:757 rc.cpp:757
+msgid "Stop dynamizer on exit"
+msgstr "Kilépéskor a dinamizáló leállítása"
+
+#. i18n: file: gui/playbacksettings.ui:72
+#. i18n: ectx: property (text), widget (QCheckBox, inhibitSuspend)
+#: po/rc.cpp:760 rc.cpp:760
+msgid "Inhibit suspend whilst playing"
+msgstr "Lejátszás közbeni felfüggesztés megakadályozás"
+
+#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:763 rc.cpp:763
+msgid ""
+"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
+"shown allowing you to choose whether to stop playback now, or after the "
+"current track.</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b> ha a Stop gombotlenyomod és tartod, megjelenik a menü, "
+"lehetővé téve, hogy válassz, azonnal megállítod a lejátszást, vagy az "
+"aktuális szám után.</i>"
+
+#. i18n: file: gui/playbacksettings.ui:108
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:596 rc.cpp:596
+#: po/rc.cpp:766 rc.cpp:766
 msgid "Output"
 msgstr "Kimenet"
 
-#. i18n: file: gui/playbacksettings.ui:41
+#. i18n: file: gui/playbacksettings.ui:129
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:602 rc.cpp:602
-msgid "Crossfading:"
-msgstr "Kereszt-átúsztatás:"
+#: po/rc.cpp:772 rc.cpp:772
+msgid "Crossfade between tracks:"
+msgstr "Átúsztatás a számok között"
 
-#. i18n: file: gui/playbacksettings.ui:51
-#. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:605 rc.cpp:605
-msgid " seconds"
-msgstr " másodperc"
+#. i18n: file: gui/playbacksettings.ui:139
+#. i18n: ectx: property (suffix), widget (QSpinBox, crossfading)
+#: po/rc.cpp:775 rc.cpp:775
+msgid " s"
+msgstr "s"
 
-#. i18n: file: gui/playbacksettings.ui:61
+#. i18n: file: gui/playbacksettings.ui:152
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:608 rc.cpp:608
+#: po/rc.cpp:781 rc.cpp:781
 msgid "Replay gain:"
 msgstr "Lejátszási szint:"
 
-#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: file: gui/playbacksettings.ui:195
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:611 rc.cpp:611
+#: po/rc.cpp:784 rc.cpp:784
 msgid "About replay gain"
 msgstr "A lejátszási szintről"
 
-#. i18n: file: gui/playbacksettings.ui:104
+#. i18n: file: gui/playbacksettings.ui:204
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:614 rc.cpp:614
-msgid "Devices:"
-msgstr "Eszközök:"
-
-#. i18n: file: gui/playbacksettings.ui:141
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:620 rc.cpp:620
-msgid "Fadeout on stop:"
-msgstr "Megálláskor lekeverés:"
-
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:623 rc.cpp:623
-msgid "Stop playback on exit:"
-msgstr "Kilépéskor a lejátszás megállítása:"
-
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:626 rc.cpp:626
-msgid "Stop dynamizer on exit:"
-msgstr "Kilépéskor a dinamizáló leállítása:"
-
-#. i18n: file: gui/playbacksettings.ui:184
-#. i18n: ectx: property (text), widget (BuddyLabel, inhibitSuspendLabel)
-#: po/rc.cpp:629 rc.cpp:629
-msgid "Inhibit suspend whilst playing:"
-msgstr "Lejátszás közbeni felfüggesztés megakadályozás:"
-
-#. i18n: file: gui/playbacksettings.ui:217
-#. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:632 rc.cpp:632
-msgid ""
-"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
-"shown allowing you to choose whether to stop playback now, or after the "
-"current track.</i>"
-msgstr ""
-"<i><b>Megjegyzés:</b> ha a Stop gombotlenyomod és tartod, megjelenik a menü, "
-"lehetővé téve, hogy válassz, azonnal megállítod a lejátszást, vagy az "
-"aktuális szám után.</i>"
+#: po/rc.cpp:787 rc.cpp:787
+msgid "Use the checkboxes below to control the active outputs."
+msgstr "Az aktív kimenet beállítására használd az lenti kijelölő gombokat."
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:635 rc.cpp:635
+#: po/rc.cpp:790 rc.cpp:790
 msgid "Collection:"
 msgstr "Gyűjtemény:"
 
@@ -5063,25 +5489,25 @@ msgstr "Gyűjtemény:"
 #. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
 #. i18n: file: gui/serversettings.ui:338
 #. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
-#: po/rc.cpp:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
+#: po/rc.cpp:808 po/rc.cpp:829 rc.cpp:808 rc.cpp:829
 msgid "Cover filename:"
 msgstr "Borító fájlneve:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:656 rc.cpp:656
+#: po/rc.cpp:811 rc.cpp:811
 msgid "Dynamizer port:"
 msgstr "Dinamizáló port:"
 
 #. i18n: file: gui/serversettings.ui:168
 #. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
-#: po/rc.cpp:659 rc.cpp:659
+#: po/rc.cpp:814 rc.cpp:814
 msgid "HTTP stream URL:"
 msgstr "HTTP hangfolyam URL:"
 
 #. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:662 rc.cpp:662
+#: po/rc.cpp:817 rc.cpp:817
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art "
 "(either the value specified above, or <code>cover.jpg / cover.png</code> if "
@@ -5097,7 +5523,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:277
 #. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
-#: po/rc.cpp:668 rc.cpp:668
+#: po/rc.cpp:823 rc.cpp:823
 msgid ""
 "<i><b>NOTE:</b> 'HTTP Stream URL' is only of use if you have MPD configured "
 "to output to a HTTP stream, and you wish Cantata to be able to play that "
@@ -5109,7 +5535,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:677 rc.cpp:677
+#: po/rc.cpp:832 rc.cpp:832
 msgid ""
 "<i><b>NOTE:</b> If you change the 'Music folder' setting, then you will need "
 "to manually update the music database. This can be performed by pressing the "
@@ -5121,7 +5547,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:379
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel_2)
-#: po/rc.cpp:680 rc.cpp:680
+#: po/rc.cpp:835 rc.cpp:835
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -5131,19 +5557,13 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:683 rc.cpp:683
+#: po/rc.cpp:838 rc.cpp:838
 msgid "Network interface:"
 msgstr "Hálózati interfész:"
 
-#. i18n: file: http/httpserversettings.ui:38
-#. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:686 rc.cpp:686
-msgid "Current URL:"
-msgstr "Jelenlegi URL:"
-
-#. i18n: file: http/httpserversettings.ui:73
+#. i18n: file: http/httpserversettings.ui:57
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:689 rc.cpp:689
+#: po/rc.cpp:841 rc.cpp:841
 msgid ""
 "<i><b>NOTE:</b> MPD usually only plays songs that are stored within its "
 "folders. Cantata contains a minimal HTTP server that can be used to serve "
@@ -5161,35 +5581,32 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:693 rc.cpp:693
+#: po/rc.cpp:845 rc.cpp:845
 msgid "Mode:"
 msgstr "Mód:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:699 rc.cpp:699
+#: po/rc.cpp:851 rc.cpp:851
 msgid "HTTP Proxy"
 msgstr "HTTP Proxy"
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:702 rc.cpp:702
+#: po/rc.cpp:854 rc.cpp:854
 msgid "SOCKS Proxy"
 msgstr "SOCKS Proxy"
 
 #. i18n: file: online/onlinesettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:717 rc.cpp:717
-msgid ""
-"The following is a list of online providers, to hide a provider simply un-"
-"check its entry in this list."
+#: po/rc.cpp:869 rc.cpp:869
+msgid "Use the checkboxes below to configure the list of active services."
 msgstr ""
-"A következő egy lista az online szolgáltatókról. Szolgáltató elrejtéséhez "
-"vedd ki a jelölést a listaeleme elől."
+"Az aktív szolgáltatások beállítására használd az lenti kijelölő gombokat."
 
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:723 rc.cpp:723
+#: po/rc.cpp:875 rc.cpp:875
 msgid ""
 "You can listen for free without an account, but Premium members can listen "
 "to higher quality streams without advertisements. Visit <a href=\"http://www."
@@ -5203,38 +5620,38 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:726 rc.cpp:726
+#: po/rc.cpp:878 rc.cpp:878
 msgid "Premium Account"
 msgstr "Prémium fiók"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:735 rc.cpp:735
+#: po/rc.cpp:887 rc.cpp:887
 msgid "Stream type:"
 msgstr "Stream típusa:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:738 rc.cpp:738
+#: po/rc.cpp:890 rc.cpp:890
 msgid "Status:"
 msgstr "Státusz:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:109
 #. i18n: ectx: property (text), widget (QPushButton, loginButton)
-#: po/rc.cpp:741 streams/digitallyimportedsettings.cpp:130
-#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
+#: po/rc.cpp:893 streams/digitallyimportedsettings.cpp:131
+#: streams/digitallyimportedsettings.cpp:137 rc.cpp:893
 msgid "Login"
 msgstr "Bejelentkezés"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:747 rc.cpp:747
+#: po/rc.cpp:899 rc.cpp:899
 msgid "Session expiry:"
 msgstr "Munkamenet lejárta:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:151
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:750 rc.cpp:750
+#: po/rc.cpp:902 rc.cpp:902
 msgid ""
 "<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
 "RockRadio.com, and Sky.fm</i>"
@@ -5244,7 +5661,7 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:161
 #. i18n: ectx: property (text), widget (QLabel, note2Label)
-#: po/rc.cpp:753 rc.cpp:753
+#: po/rc.cpp:905 rc.cpp:905
 msgid ""
 "<i><b>NOTE:</b> If you enter account details, then a 'DI' status item will "
 "appear under the list of streams. This will indicate if you are logged in or "
@@ -5256,29 +5673,26 @@ msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:756 rc.cpp:756
-msgid ""
-"The following is a list of the top-level stream categories, to hide a "
-"category simply un-check its entry in this list."
+#: po/rc.cpp:908 rc.cpp:908
+msgid "Use the checkboxes below to configure the list of active providers."
 msgstr ""
-"A következő egy lista a felsőszintű kategóriás stream kategóriákról. "
-"Kategória elrejtéséhez vedd ki a jelölést a listaeleme elől."
+"Az aktív szolgáltatók beállítására használd az lenti kijelölő gombokat."
 
 #. i18n: file: streams/streamssettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: po/rc.cpp:759 rc.cpp:759
+#: po/rc.cpp:911 rc.cpp:911
 msgid "Configure Provider"
 msgstr "Szolgáltató beállítása"
 
 #. i18n: file: streams/streamssettings.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, installButton)
-#: po/rc.cpp:762 rc.cpp:762
+#: po/rc.cpp:914 rc.cpp:914
 msgid "Install"
 msgstr "Telepítés"
 
 #. i18n: file: streams/streamssettings.ui:80
 #. i18n: ectx: property (text), widget (QLabel, note)
-#: po/rc.cpp:768 rc.cpp:768
+#: po/rc.cpp:920 rc.cpp:920
 msgid ""
 "<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
 "removed.</i>"
@@ -5288,123 +5702,117 @@ msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:771 rc.cpp:771
+#: po/rc.cpp:923 rc.cpp:923
 msgid "Search:"
 msgstr "Keresés:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:65
 #. i18n: ectx: property (title), widget (QGroupBox, actionBox)
-#: po/rc.cpp:774 rc.cpp:774
+#: po/rc.cpp:926 rc.cpp:926
 msgid "Shortcut for Selected Action"
 msgstr "Billentyűparancs a kiválasztott művelethez"
 
 #. i18n: file: support/shortcutssettingswidget.ui:71
 #. i18n: ectx: property (text), widget (QRadioButton, useDefault)
-#: po/rc.cpp:777 rc.cpp:777
+#: po/rc.cpp:929 rc.cpp:929
 msgid "Default:"
 msgstr "Alapbeállítás:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:85
 #. i18n: ectx: property (text), widget (QRadioButton, useCustom)
-#: po/rc.cpp:783 rc.cpp:783
+#: po/rc.cpp:935 rc.cpp:935
 msgid "Custom:"
 msgstr "Egyéni:"
 
-#. i18n: file: tags/tageditor.ui:25
-#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:786 rc.cpp:786
-msgid "Track:"
-msgstr "Szám:"
-
 #. i18n: file: tags/tageditor.ui:64
 #. i18n: ectx: property (text), widget (StateLabel, albumArtistLabel)
-#: po/rc.cpp:795 rc.cpp:795
+#: po/rc.cpp:947 rc.cpp:947
 msgid "Album artist:"
 msgstr "Album előadója:"
 
 #. i18n: file: tags/tageditor.ui:103
 #. i18n: ectx: property (text), widget (StateLabel, trackLabel)
-#: po/rc.cpp:804 rc.cpp:804
+#: po/rc.cpp:956 rc.cpp:956
 msgid "Track number:"
 msgstr "Szám sorszáma:"
 
 #. i18n: file: tags/tageditor.ui:116
 #. i18n: ectx: property (text), widget (StateLabel, discLabel)
-#: po/rc.cpp:807 rc.cpp:807
+#: po/rc.cpp:959 rc.cpp:959
 msgid "Disc number:"
 msgstr "Lemez száma:"
 
-#. i18n: file: tags/trackorganiser.ui:155
+#. i18n: file: tags/trackorganiser.ui:115
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:834 rc.cpp:834
+#: po/rc.cpp:989 rc.cpp:989
 msgid "Original Name"
 msgstr "Eredeti név"
 
-#. i18n: file: tags/trackorganiser.ui:160
+#. i18n: file: tags/trackorganiser.ui:120
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:837 rc.cpp:837
+#: po/rc.cpp:992 rc.cpp:992
 msgid "New Name"
 msgstr "Új név"
 
-#: po/rc.cpp:838 rc.cpp:838
+#: po/rc.cpp:996 rc.cpp:996
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "Török Árpád"
 
-#: po/rc.cpp:839 rc.cpp:839
+#: po/rc.cpp:997 rc.cpp:997
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "torar at freemail.hu"
 
-#: replaygain/rgdialog.cpp:121
+#: replaygain/rgdialog.cpp:116
 msgid "Show All Tracks"
 msgstr "Összes szám mutatása"
 
-#: replaygain/rgdialog.cpp:122
+#: replaygain/rgdialog.cpp:117
 msgid "Show Untagged Tracks"
 msgstr "A címke nélküli számok mutatása"
 
-#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:124 tags/trackorganiser.cpp:79
 msgid "Remove From List"
 msgstr "Listából eltávolít"
 
-#: replaygain/rgdialog.cpp:136
+#: replaygain/rgdialog.cpp:131
 msgid "Album Gain"
 msgstr "Album hangereje"
 
-#: replaygain/rgdialog.cpp:137
+#: replaygain/rgdialog.cpp:132
 msgid "Track Gain"
 msgstr "Szám hangereje"
 
-#: replaygain/rgdialog.cpp:138
+#: replaygain/rgdialog.cpp:133
 msgid "Album Peak"
 msgstr "Album csúcs"
 
-#: replaygain/rgdialog.cpp:139
+#: replaygain/rgdialog.cpp:134
 msgid "Track Peak"
 msgstr "Szám csúcs"
 
-#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
+#: replaygain/rgdialog.cpp:154 replaygain/rgdialog.cpp:283
 msgid "Scan"
 msgstr "Átnéz"
 
-#: replaygain/rgdialog.cpp:238
+#: replaygain/rgdialog.cpp:233
 msgid "Update ReplayGain tags in tracks?"
 msgstr "A számokban a lejátszási színt címkéket frissíted?"
 
-#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
+#: replaygain/rgdialog.cpp:233 replaygain/rgdialog.cpp:234
 msgid "Update Tags"
 msgstr "Címkék frissítése"
 
-#: replaygain/rgdialog.cpp:252
+#: replaygain/rgdialog.cpp:247
 msgid "Abort scanning of tracks?"
 msgstr "Számok átnézését felfüggeszted?"
 
-#: replaygain/rgdialog.cpp:261
+#: replaygain/rgdialog.cpp:256
 msgid "Abort reading of existing tags?"
 msgstr "A beállított címkék beolvasását beszakítod?"
 
-#: replaygain/rgdialog.cpp:287
+#: replaygain/rgdialog.cpp:282
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
@@ -5412,62 +5820,62 @@ msgstr ""
 "Az <b>összes</b> számot átnézzem?<br><br><i>Megjegyzés: minden szám "
 "rendelkezik lejátszási szint címkével.</i>"
 
-#: replaygain/rgdialog.cpp:289
+#: replaygain/rgdialog.cpp:284
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr "Átnézzem az összes számot, vagy csak azokat, amiknek nincs címkéjük?"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "Untagged Tracks"
 msgstr "Címke nélküli számok"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "All Tracks"
 msgstr "Minden szám"
 
-#: replaygain/rgdialog.cpp:300
+#: replaygain/rgdialog.cpp:295
 msgid "Scanning tracks..."
 msgstr "Számok átnézése..."
 
-#: replaygain/rgdialog.cpp:367
+#: replaygain/rgdialog.cpp:362
 msgid "Reading existing tags..."
 msgstr "Létező címkék beolvasása..."
 
-#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+#: replaygain/rgdialog.cpp:414 tags/tageditor.cpp:798
 msgctxt "filename (Timeout)"
 msgid "%1 (Timeout)"
 msgstr "%1 (Időtúllépés)"
 
-#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:802
 msgctxt "filename (Corrupt tags?)"
 msgid "%1 (Corrupt tags?)"
 msgstr "%1 (Hibás címkék?)"
 
-#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
+#: replaygain/rgdialog.cpp:432 tags/tageditor.cpp:812
 msgid "Failed to update the tags of the following tracks:"
 msgstr "A következő számok címkéit nem sikerült frissíteni:"
 
-#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
-#: tags/trackorganiser.cpp:451
+#: replaygain/rgdialog.cpp:473 tags/tageditor.cpp:885
+#: tags/trackorganiser.cpp:483
 msgid "Device is not connected."
 msgstr "Az eszköz nem csatlakozik."
 
-#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
-#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
+#: replaygain/rgdialog.cpp:513 replaygain/rgdialog.cpp:520
+#: replaygain/rgdialog.cpp:599 replaygain/rgdialog.cpp:601
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:520 replaygain/rgdialog.cpp:521
-#: replaygain/rgdialog.cpp:527 replaygain/rgdialog.cpp:528
-#: replaygain/rgdialog.cpp:579 replaygain/rgdialog.cpp:580
-#: replaygain/rgdialog.cpp:581 replaygain/rgdialog.cpp:582
+#: replaygain/rgdialog.cpp:516 replaygain/rgdialog.cpp:517
+#: replaygain/rgdialog.cpp:523 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:575 replaygain/rgdialog.cpp:576
+#: replaygain/rgdialog.cpp:577 replaygain/rgdialog.cpp:578
 msgid "Failed"
 msgstr "Sikertelen"
 
-#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
+#: replaygain/rgdialog.cpp:651 tags/trackorganiser.cpp:428
 msgid "Remove the selected tracks from the list?"
 msgstr "A kiválasztott számokat eltávolítsam a listából?"
 
-#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
+#: replaygain/rgdialog.cpp:652 tags/trackorganiser.cpp:429
 msgid "Remove Tracks"
 msgstr "Számok eltávolítása"
 
@@ -5487,19 +5895,19 @@ msgstr "AAC 64k"
 msgid "AAC 128k"
 msgstr "AAC 128k"
 
-#: streams/digitallyimportedsettings.cpp:109
+#: streams/digitallyimportedsettings.cpp:110
 msgid "Logged out"
 msgstr "Kijelentkezve"
 
-#: streams/digitallyimportedsettings.cpp:112
+#: streams/digitallyimportedsettings.cpp:113
 msgid "Logging in..."
 msgstr "Bejelentkezés..."
 
-#: streams/digitallyimportedsettings.cpp:136
+#: streams/digitallyimportedsettings.cpp:137
 msgid "Logout"
 msgstr "Kijelentkezés"
 
-#: streams/streamdialog.cpp:71
+#: streams/streamdialog.cpp:72
 msgid "URL:"
 msgstr "URL:"
 
@@ -5523,7 +5931,7 @@ msgstr "Stream szerkesztése"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>Hiba:</b> érvénytelen protokoll</i>"
 
-#: streams/streamfetcher.cpp:205
+#: streams/streamfetcher.cpp:209
 msgid "Fetching %1"
 msgstr "Leszedés %1"
 
@@ -5539,91 +5947,91 @@ msgstr "Kedvenc stream-ek exportálása"
 msgid "Add New Stream To Favorites"
 msgstr "Új stream hozzáadása a kedvencekhez"
 
-#: streams/streamspage.cpp:124
+#: streams/streamspage.cpp:125
 msgctxt "Service name"
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:243
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|XML Stream-ek"
 
-#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
+#: streams/streamspage.cpp:243 streams/streamspage.cpp:245
 msgid "Import Streams"
 msgstr "Stream-ek importálása"
 
-#: streams/streamspage.cpp:245
+#: streams/streamspage.cpp:246
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "XML stream-ek (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:253
+#: streams/streamspage.cpp:254
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr ""
 "Importálás sikertelen <b>%1</b>!<br/>Kérlek ellenőrizd, megfelelő típust "
 "adtál-e meg."
 
-#: streams/streamspage.cpp:265
+#: streams/streamspage.cpp:266
 msgid "*.xml|XML Streams"
 msgstr "*.xml|XML Stream-ek"
 
-#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
+#: streams/streamspage.cpp:266 streams/streamspage.cpp:268
 msgid "Export Streams"
 msgstr "Stream-ek exportálása"
 
-#: streams/streamspage.cpp:267
+#: streams/streamspage.cpp:268
 msgid "XML Streams (*.xml)"
 msgstr "XML Stream-ek (*.xml)"
 
-#: streams/streamspage.cpp:279
+#: streams/streamspage.cpp:280
 msgid "Failed to create <b>%1</b>!"
 msgstr "Létrehozás sikertelen <b>%1</b>!"
 
-#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
+#: streams/streamspage.cpp:297 streams/streamspage.cpp:493
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "Létező stream!<br/><b>%1</b>"
 
-#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
+#: streams/streamspage.cpp:299 streams/streamspage.cpp:495
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "A nevezett stream <b>%1</b> már létezik!"
 
-#: streams/streamspage.cpp:318
+#: streams/streamspage.cpp:319
 msgid "Bookmark added"
 msgstr "Könyvjelző hozzáadva"
 
-#: streams/streamspage.cpp:320
+#: streams/streamspage.cpp:321
 msgid "Already bookmarked"
 msgstr "Már van könyvjelzője"
 
-#: streams/streamspage.cpp:366
+#: streams/streamspage.cpp:367
 msgid "Added to favorites"
 msgstr "Kedvencekhez hozzáadva"
 
-#: streams/streamspage.cpp:368
+#: streams/streamspage.cpp:369
 msgid "Already in favorites"
 msgstr "Már szerepel a kedvencek között"
 
-#: streams/streamspage.cpp:393
+#: streams/streamspage.cpp:394
 msgid "Reload <b>%1</b> streams?"
 msgstr "<b>%1</b> stream-ek újratöltése?"
 
-#: streams/streamspage.cpp:411
+#: streams/streamspage.cpp:412
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr "Biztosan eltávolítanád a könyvjelzőjét ennek: <b>%1</b>?"
 
-#: streams/streamspage.cpp:417
+#: streams/streamspage.cpp:418
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr "Biztosan eltávolítanád az összes <b>%1</b> könyvjelzőt?"
 
-#: streams/streamspage.cpp:445
+#: streams/streamspage.cpp:446
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "Biztosan eltávolítanád a kiválasztott %1 stream-eket?"
 
-#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
+#: streams/streamspage.cpp:450 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "Biztosan eltávolítanád ezt <b>%1</b>?"
 
-#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+#: streams/streamspage.cpp:561 streams/streamspage.cpp:577
 msgid "Search %1:"
 msgstr "Keresés %1:"
 
@@ -5663,139 +6071,90 @@ msgstr "Nem sikerült menteni a stream-ek litáját!"
 msgid "Failed to remove streams folder!"
 msgstr "Nem sikerült eltávolítani a stream-ek könyvtárát"
 
-#: support/dialog.cpp:89
+#: support/dialog.cpp:73
 msgid "&OK"
 msgstr "&Ok"
 
-#: support/dialog.cpp:90
+#: support/dialog.cpp:74
 msgid "&Cancel"
 msgstr "Elvet"
 
-#: support/dialog.cpp:91
+#: support/dialog.cpp:75
 msgid "&Yes"
 msgstr "Igen"
 
-#: support/dialog.cpp:92
+#: support/dialog.cpp:76
 msgid "&No"
 msgstr "&Nem"
 
-#: support/dialog.cpp:93
+#: support/dialog.cpp:77
 msgid "&Discard"
 msgstr "Visszavon"
 
-#: support/dialog.cpp:94
+#: support/dialog.cpp:78
 msgid "&Save"
 msgstr "Ment"
 
-#: support/dialog.cpp:95
+#: support/dialog.cpp:79
 msgid "&Apply"
 msgstr "&Alkalmaz"
 
-#: support/dialog.cpp:96
+#: support/dialog.cpp:80
 msgid "&Close"
 msgstr "Bezár"
 
-#: support/dialog.cpp:98
+#: support/dialog.cpp:82
 msgid "&Overwrite"
 msgstr "Felülír"
 
-#: support/dialog.cpp:99
+#: support/dialog.cpp:83
 msgid "&Reset"
 msgstr "&Reset"
 
-#: support/dialog.cpp:100
+#: support/dialog.cpp:84
 msgid "&Continue"
 msgstr "Folytat"
 
-#: support/dialog.cpp:101
+#: support/dialog.cpp:85
 msgid "&Delete"
 msgstr "Töröl"
 
-#: support/dialog.cpp:102
+#: support/dialog.cpp:86
 msgid "&Stop"
 msgstr "Állj"
 
-#: support/dialog.cpp:103
+#: support/dialog.cpp:87
 msgid "&Remove"
 msgstr "Eltávolít"
 
-#: support/dialog.cpp:104
+#: support/dialog.cpp:88
 msgid "&Previous"
 msgstr "Előző"
 
-#: support/dialog.cpp:105
+#: support/dialog.cpp:89
 msgid "&Next"
 msgstr "Következő"
 
-#: support/fancytabwidget.cpp:957
-msgid "Icons Only"
-msgstr "Csak ikonok"
-
-#: support/fancytabwidget.cpp:958
-msgid "Style"
-msgstr "Stílus"
-
-#: support/fancytabwidget.cpp:959
-msgid "Large Sidebar"
-msgstr "Nagy oldalsáv"
-
-#: support/fancytabwidget.cpp:960
-msgid "Small Sidebar"
-msgstr "Kis oldalsáv"
-
-#: support/fancytabwidget.cpp:961
-msgid "Top Bar"
-msgstr "Felső sáv"
-
-#: support/fancytabwidget.cpp:962
-msgid "Bottom Bar"
-msgstr "Alsó sáv"
-
-#: support/fancytabwidget.cpp:963
-msgid "Tabs On Side"
-msgstr "Sávok oldalt"
-
-#: support/fancytabwidget.cpp:964
-msgid "Tabs On Top"
-msgstr "Sávok fent"
-
-#: support/fancytabwidget.cpp:965
-msgid "Tabs On Bottom"
-msgstr "Sávok alul"
-
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Password"
 msgstr "Jelszó"
 
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Please enter password:"
 msgstr "Kérem a jelszót:"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:123
+#: support/messagebox.cpp:50 support/messagebox.cpp:124
 msgid "Warning"
 msgstr "Figyelem"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:118
+#: support/messagebox.cpp:50 support/messagebox.cpp:119
 msgid "Question"
 msgstr "Kérdés"
 
-#: support/messagebox.cpp:107 support/messagebox.cpp:113
-#: support/messagebox.h:62
-msgid "Error"
-msgstr "Hiba"
-
 #: support/messagebox.h:65
 msgid "Information"
 msgstr "Információ"
 
-#: support/onoffbutton.cpp:47
-msgid "ON"
-msgstr "BE"
-
-#: support/onoffbutton.cpp:48
-msgid "OFF"
-msgstr "KI"
-
 #: support/pathrequester.cpp:50
 msgid "Select Folder"
 msgstr "Könyvtárválasztás"
@@ -5838,33 +6197,33 @@ msgid_plural "%1 days %2"
 msgstr[0] "1 nap %2"
 msgstr[1] "%1 napok %2"
 
-#: tags/tageditor.cpp:134
+#: tags/tageditor.cpp:147
 msgid "Tags"
 msgstr "Címkék"
 
-#: tags/tageditor.cpp:147
+#: tags/tageditor.cpp:160
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr "'Album Előadó' beállítása 'Előadó'-ból"
 
-#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
+#: tags/tageditor.cpp:261 tags/tageditor.cpp:592
 msgid "All tracks"
 msgstr "Minden szám"
 
-#: tags/tageditor.cpp:295
+#: tags/tageditor.cpp:323
 msgid "(Various)"
 msgstr "(Vegyes)"
 
-#: tags/tageditor.cpp:336
+#: tags/tageditor.cpp:368
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr ""
 "\"Válogatott előadók\" munkakörnyezet alkalmazása az <b>összes</b> számra?"
 
-#: tags/tageditor.cpp:378
+#: tags/tageditor.cpp:410
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr ""
 "Visszaállítod a \"Vegyes előadók\" munkakörnyezetet az <b>összes</b> számra? "
 
-#: tags/tageditor.cpp:428
+#: tags/tageditor.cpp:460
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5872,16 +6231,16 @@ msgstr ""
 "'Album Előadó'-t állítasz az 'Előadó' helyett (ha az 'Album Előadó' üres) "
 "<b>az összes</b> számnál?"
 
-#: tags/tageditor.cpp:429
+#: tags/tageditor.cpp:461
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr ""
 "Beállítod 'Album előadót' az 'Előadó' helyett (ha az 'Album Előadó' üres)?"
 
-#: tags/tageditor.cpp:430
+#: tags/tageditor.cpp:462
 msgid "Album Artist from Artist"
 msgstr "Album Előadó-ról Előadóra"
 
-#: tags/tageditor.cpp:463
+#: tags/tageditor.cpp:495
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5889,52 +6248,52 @@ msgstr ""
 "A 'Cím', 'Előadó', 'Album előadó' és 'Album' első betűjének nagyra váltása "
 "az <b>összes</b> számnál?"
 
-#: tags/tageditor.cpp:496
+#: tags/tageditor.cpp:528
 msgid "Adjust the value of each track number by:"
 msgstr "Az összes szám sorszámának módosítása ennyivel:"
 
-#: tags/tageditor.cpp:554
+#: tags/tageditor.cpp:586
 msgid "All tracks [modified]"
 msgstr "Minden szám [módosítva]"
 
-#: tags/tageditor.cpp:556
+#: tags/tageditor.cpp:588
 msgid "%1 [modified]"
 msgstr "%1 [módosítva]"
 
-#: tags/tageditor.cpp:783
+#: tags/tageditor.cpp:827
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr "Átnevezed a dalok fájljait is, hogy egyezzenek a címkéiddel?"
 
-#: tags/tageditor.cpp:784
+#: tags/tageditor.cpp:828
 msgid "Rename Files"
 msgstr "Fájlok átnevezése"
 
-#: tags/trackorganiser.cpp:150
+#: tags/trackorganiser.cpp:164
 msgid "Abort renaming of files?"
 msgstr "Fájlátnevezés megszakítása?"
 
-#: tags/trackorganiser.cpp:263
+#: tags/trackorganiser.cpp:279
 msgid "Source file does not exist!<br/>%1"
 msgstr "Forrásfájl nem létezik!<br/>%1"
 
-#: tags/trackorganiser.cpp:282
+#: tags/trackorganiser.cpp:298
 msgid "Destination file already exists!<br/>%1"
 msgstr "A célfájl már létezik! <br/>"
 
-#: tags/trackorganiser.cpp:304
+#: tags/trackorganiser.cpp:320
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "Nem sikerült létrehozni a könyvtárat!<br/>%1"
 
-#: tags/trackorganiser.cpp:325
+#: tags/trackorganiser.cpp:341
 msgid "Failed to rename %1 to %2"
 msgstr "Nem sikerült %1 átnevezése %2-re"
 
-#: widgets/coverwidget.cpp:267
+#: widgets/coverwidget.cpp:280
 msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
 msgstr "<tr><td align=\"right\">Zeneszerző:</td><td>%1</td></tr>"
 
-#: widgets/coverwidget.cpp:269
+#: widgets/coverwidget.cpp:282
 msgid ""
 "<tr><td align=\"right\"><b>Artist:</b></td><td>%1</td></tr><tr><td align="
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Year:"
@@ -5944,37 +6303,41 @@ msgstr ""
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Év:</"
 "b></td><td>%3</td></tr>"
 
-#: widgets/genrecombo.cpp:54
+#: widgets/genrecombo.cpp:44
+msgid "Filter On Genre"
+msgstr "Műfaj szerinti szűrés"
+
+#: widgets/genrecombo.cpp:66
 msgid "All Genres"
 msgstr "Minden műfaj"
 
-#: widgets/groupedview.cpp:267
+#: widgets/groupedview.cpp:265
 msgctxt "album (albumYear)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: widgets/groupedview.cpp:269
+#: widgets/groupedview.cpp:267
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: widgets/itemview.cpp:480
+#: widgets/itemview.cpp:561
 msgid "Go Back"
 msgstr "Visszalépés"
 
-#: widgets/itemview.cpp:485
+#: widgets/itemview.cpp:566
 msgid "Go Home"
 msgstr "Vissza a kiinduláshoz"
 
-#: widgets/menubutton.cpp:36
+#: widgets/menubutton.cpp:39
 msgid "Menu"
 msgstr "Menü"
 
-#: widgets/searchwidget.cpp:62
+#: widgets/searchwidget.cpp:63
 msgid "Search..."
 msgstr "Keresés..."
 
-#: widgets/searchwidget.cpp:66
+#: widgets/searchwidget.cpp:67
 msgid "Close Search Bar"
 msgstr "Keresősáv bezárása"
 
@@ -5986,7 +6349,7 @@ msgstr "Bejelentkezve ide: %1"
 msgid "<b>NOT</b> logged into %1"
 msgstr "<b>NEM VAGY</b> bejelentkezve a ide: %1"
 
-#: widgets/songdialog.cpp:48
+#: widgets/songdialog.cpp:49
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
 "\" setting, and MPD's \"music_directory\" setting.</p>"
@@ -5995,7 +6358,7 @@ msgstr ""
 "\"Zenekönyvtárát\" és az MPD \"music_directory\" (zenekönyvtár) beállításait."
 "</p>"
 
-#: widgets/songdialog.cpp:51
+#: widgets/songdialog.cpp:52
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check that the device is still "
 "attached.</p>"
@@ -6003,28 +6366,24 @@ msgstr ""
 "<p>Nem tudom elérni a dalok fájljait!<br/><br/>Ellenőrizd, hogy az eszköz "
 "csatlakozik-e még.</p>"
 
-#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:115 widgets/volumeslider.cpp:230
+#: widgets/volumeslider.cpp:237
 msgid "Mute"
 msgstr "Némít"
 
-#: widgets/volumeslider.cpp:199
+#: widgets/volumeslider.cpp:198
 msgid "Muted"
 msgstr "Némítva"
 
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:237
 msgid "Unmute"
 msgstr "Némítás kikapcsolása"
 
-#: widgets/volumeslider.cpp:276
-msgid "Volume Disabled"
-msgstr "Hangerőszabályozó kikapcsolva"
-
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1% (Muted)"
 msgstr "Hangerő %1% (Némítva)"
 
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1%"
 msgstr "Hangerő %1%"
 
@@ -6128,6 +6487,184 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Episodes"
 msgstr "%1 Részek"
 
+#~ msgid "Transcoding failed.<br/><br/<hr/>%1"
+#~ msgstr "Az átkódolás nem sikerült. <br><br/<hr/>%1"
+
+#~ msgid "Failed to download track.<br/><br/<hr/>%1"
+#~ msgstr "Nem sikerül letölteni a számot.<br/><br/<hr/>%1"
+
+#~ msgid "<b>Error</b><br/>"
+#~ msgstr "<b>Hiba</b><br/>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
+#~ "td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Előadó:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Szám:</td><td>%3</"
+#~ "td></tr>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Destination file:</td><td>%2</td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Forrásfájl:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Célfájl:</td><td>%2</td></tr>"
+
+#~ msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
+#~ msgstr "<tr><td align=\"right\">Fájl:</td><td>%1</td></tr>"
+
+#~ msgid ""
+#~ "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
+#~ "i></tr>"
+#~ msgstr ""
+#~ "<tr><i><td align=\"right\"><i>Hátralévő idő:</i></td><td><i>%5</i></td></"
+#~ "i></tr>"
+
+#~ msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
+#~ msgstr "<tr><td>%album%</td><td>%1</td><td>Az album címe.</td></tr>"
+
+#~ msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
+#~ msgstr "<tr><td>%composer%</td><td>%1</td><td>A zeneszerző.</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
+#~ msgstr ""
+#~ "<tr><td>%artist%</td><td>%1</td><td>Az egyes számok előadója.</td></tr>"
+
+#~ msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
+#~ msgstr "<tr><td>%track%</td><td>%1</td><td>A szám sorszáma.</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></"
+#~ "tr>"
+#~ msgstr ""
+#~ "<tr><td>%year%</td><td>%1</td><td>Az album kiadásának éve.</td></tr>"
+
+#~ msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
+#~ msgstr "<tr><td>%genre%</td><td>%1</td><td>Az album műfaja.</td></tr>"
+
+#~ msgctxt ""
+#~ "Google\n"
+#~ "width x height (file size)"
+#~ msgid ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+#~ msgstr ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+
+#~ msgctxt ""
+#~ "Discogs\n"
+#~ "width x height"
+#~ msgid ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+#~ msgstr ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+
+#~ msgid "Grouped by 'Album Artist'"
+#~ msgstr "'Album Előadó' szerint csoportosítva"
+
+#~ msgid "Search Play Queue"
+#~ msgstr "Lejátszási sor keresése"
+
+#~ msgid "Do not fadeout"
+#~ msgstr "Nem úsztasson ki"
+
+#~ msgid "Inactive"
+#~ msgstr "Inaktív"
+
+#~ msgctxt "Track Number (#)"
+#~ msgid "#"
+#~ msgstr "#"
+
+#~ msgid "Search For Podcasts"
+#~ msgstr "Podcast keresése"
+
+#~ msgid "Subscribe to Podcast"
+#~ msgstr "Feliratkozás a podcast-ra"
+
+#~ msgid "You are already subscribed to this URL!"
+#~ msgstr "Már feliratkoztál erre az URL-re!"
+
+#~ msgid "Already downloading this URL!"
+#~ msgstr "Már folyik az URL letöltése!"
+
+#~ msgid "Use backdrop"
+#~ msgstr "Háttér használata"
+
+#~ msgid "Automatically lookup"
+#~ msgstr "Automatikus áttekintés"
+
+#~ msgid "<html><head/><body><p>Cancel current query</p></body></html>"
+#~ msgstr ""
+#~ "<html><head/><body><p>Jelenlegi keresés megszakítása</p></body></html>"
+
+#~ msgid "<html><head/><body><p>Add a local file</p></body></html>"
+#~ msgstr "<html><head/><body><p>Helyi fájl hozzáadása</p></body></html>"
+
+#~ msgid "Use current album cover as background:"
+#~ msgstr "Haználja az aktuális album borítóját háttérként:"
+
+#~ msgid "Multiple artist albums:"
+#~ msgstr "Több előadós albumok:"
+
+#~ msgid "Crossfading:"
+#~ msgstr "Kereszt-átúsztatás:"
+
+#~ msgid " seconds"
+#~ msgstr " másodperc"
+
+#~ msgid "Devices:"
+#~ msgstr "Eszközök:"
+
+#~ msgid "Current URL:"
+#~ msgstr "Jelenlegi URL:"
+
+#~ msgid ""
+#~ "The following is a list of online providers, to hide a provider simply un-"
+#~ "check its entry in this list."
+#~ msgstr ""
+#~ "A következő egy lista az online szolgáltatókról. Szolgáltató elrejtéséhez "
+#~ "vedd ki a jelölést a listaeleme elől."
+
+#~ msgid ""
+#~ "The following is a list of the top-level stream categories, to hide a "
+#~ "category simply un-check its entry in this list."
+#~ msgstr ""
+#~ "A következő egy lista a felsőszintű kategóriás stream kategóriákról. "
+#~ "Kategória elrejtéséhez vedd ki a jelölést a listaeleme elől."
+
+#~ msgid "Icons Only"
+#~ msgstr "Csak ikonok"
+
+#~ msgid "Style"
+#~ msgstr "Stílus"
+
+#~ msgid "Small Sidebar"
+#~ msgstr "Kis oldalsáv"
+
+#~ msgid "Tabs On Side"
+#~ msgstr "Sávok oldalt"
+
+#~ msgid "Tabs On Top"
+#~ msgstr "Sávok fent"
+
+#~ msgid "Tabs On Bottom"
+#~ msgstr "Sávok alul"
+
+#~ msgid "ON"
+#~ msgstr "BE"
+
+#~ msgid "OFF"
+#~ msgstr "KI"
+
+#~ msgid "Volume Disabled"
+#~ msgstr "Hangerőszabályozó kikapcsolva"
+
 #~ msgid ""
 #~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
 #~ msgstr ""
diff --git a/po/ko.po b/po/ko.po
index 4033505..a6c5086 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Cantata 1.2.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-14 20:26+0000\n"
+"POT-Creation-Date: 2014-02-02 20:02+0000\n"
 "PO-Revision-Date: 2012-10-24 20:00+0900\n"
 "Last-Translator: Minho Park <parkmino at gmail.com>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -21,14 +21,13 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "음반정보 새로 읽기"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:307
-#: gui/cachesettings.cpp:262
+#: context/albumview.cpp:71 gui/cachesettings.cpp:269
 msgid "Album Information"
 msgstr "음반정보"
 
-#. i18n: file: devices/albumdetails.ui:143
+#. i18n: file: devices/albumdetails.ui:136
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
+#: context/albumview.cpp:175 po/rc.cpp:107 rc.cpp:107
 msgid "Tracks"
 msgstr "곡"
 
@@ -36,22 +35,22 @@ msgstr "곡"
 msgid "Refresh Artist Information"
 msgstr "연주자정보 새로 읽기"
 
-#: context/artistview.cpp:92 context/contextwidget.cpp:306
-#: gui/cachesettings.cpp:260
+#: context/artistview.cpp:92 gui/cachesettings.cpp:267
 msgid "Artist Information"
 msgstr "연주자정보"
 
-#. i18n: file: gui/interfacesettings.ui:137
+#. i18n: file: gui/interfacesettings.ui:272
 #. i18n: ectx: attribute (title), widget (QWidget, tab_2)
-#: context/artistview.cpp:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
+#: context/artistview.cpp:314 gui/interfacesettings.cpp:106
+#: gui/mainwindow.cpp:308 po/rc.cpp:588 rc.cpp:588
 msgid "Albums"
 msgstr "음반"
 
-#: context/artistview.cpp:333
+#: context/artistview.cpp:337
 msgid "Web Links"
 msgstr "웹 연결"
 
-#: context/artistview.cpp:419
+#: context/artistview.cpp:424
 msgid "Similar Artists"
 msgstr "비슷한 연주자"
 
@@ -59,23 +58,30 @@ msgstr "비슷한 연주자"
 msgid "Lyrics Providers"
 msgstr "가사 제공"
 
-#: context/contextsettings.cpp:37
+#: context/contextsettings.cpp:37 gui/cachesettings.cpp:278
 msgid "Wikipedia Languages"
 msgstr "위키피디아 언어"
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
-#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1388
+#: models/streamsmodel.cpp:1434 models/streamsmodel.cpp:1642
 msgid "Other"
 msgstr "기타"
 
-#: context/contextwidget.cpp:98
+#: context/contextwidget.cpp:293
 msgid "Reset Spacing"
 msgstr "간격 새로 맞추기"
 
-#: context/contextwidget.cpp:308 context/songview.cpp:105
-#: gui/cachesettings.cpp:259
-msgid "Lyrics"
-msgstr "가사"
+#: context/contextwidget.cpp:506
+msgid "&Artist"
+msgstr "연주자(&A)"
+
+#: context/contextwidget.cpp:507
+msgid "Al&bum"
+msgstr "음반(&b)"
+
+#: context/contextwidget.cpp:508
+msgid "&Lyrics"
+msgstr "가사(&L)"
 
 #: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
@@ -98,37 +104,38 @@ msgstr ""
 "만약 이 검색이 새로운 가사를 찾는다면, 원곡 이름이나 연주자와 여전히 연관이 "
 "있을 수 있습니다."
 
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#: context/lyricsdialog.cpp:64 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
-#: rc.cpp:61 rc.cpp:304 rc.cpp:789
+#: context/lyricsdialog.cpp:64 gui/searchpage.cpp:204 po/rc.cpp:92
+#: po/rc.cpp:377 po/rc.cpp:941 rc.cpp:92 rc.cpp:377 rc.cpp:941
 msgid "Title:"
 msgstr "제목:"
 
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#: context/lyricsdialog.cpp:66 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
-#: rc.cpp:55 rc.cpp:292 rc.cpp:792
+#: context/lyricsdialog.cpp:66 devices/actiondialog.cpp:800
+#: gui/searchpage.cpp:197 po/rc.cpp:86 po/rc.cpp:362 po/rc.cpp:944 rc.cpp:86
+#: rc.cpp:362 rc.cpp:944
 msgid "Artist:"
 msgstr "연주자:"
 
@@ -140,95 +147,123 @@ msgstr "가사 찾기"
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "가사를 찾을 때 사용할 웹사이트를 선택합니다."
 
-#: context/lyricsettings.cpp:66
-msgid "(Polish Translations)"
-msgstr "(폴란드어 번역)"
+#: context/othersettings.cpp:45 gui/coverdialog.cpp:877
+#: gui/interfacesettings.cpp:174
+msgid "Images (*.png *.jpg)"
+msgstr "이미지 (*.png *.jpg)"
 
-#: context/lyricsettings.cpp:67
-msgid "(Portuguese Translations)"
-msgstr "(포르투갈어 번역)"
+#: context/othersettings.cpp:47 gui/interfacesettings.cpp:176
+msgctxt "pixels"
+msgid "10px"
+msgstr "10픽셀"
+
+#: context/othersettings.cpp:102 gui/interfacesettings.cpp:524
+msgctxt "value%"
+msgid "%1%"
+msgstr "%1%"
+
+#: context/othersettings.cpp:107 gui/interfacesettings.cpp:529
+#, c-format
+msgctxt "pixels"
+msgid "%1px"
+msgstr "%1px"
 
-#: context/songview.cpp:89
+#: context/songview.cpp:90
 msgid "Refresh Lyrics"
 msgstr "가사 새로 읽기"
 
-#: context/songview.cpp:90
+#: context/songview.cpp:91
 msgid "Edit Lyrics"
 msgstr "가사수정"
 
-#: context/songview.cpp:91
+#: context/songview.cpp:92
 msgid "Save Lyrics"
 msgstr "가사저장"
 
-#: context/songview.cpp:92
+#: context/songview.cpp:93
 msgid "Cancel Editing Lyrics"
 msgstr "가사수정 취소"
 
-#: context/songview.cpp:93
+#: context/songview.cpp:94
 msgid "Delete Lyrics File"
 msgstr "가사파일 지우기"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:106 gui/cachesettings.cpp:266
+msgid "Lyrics"
+msgstr "가사"
+
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort editing of lyrics?"
 msgstr "가사수정을 취소할까요?"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort Editing"
 msgstr "수정 취소"
 
-#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
-#: replaygain/rgdialog.cpp:252 replaygain/rgdialog.cpp:253
-#: replaygain/rgdialog.cpp:261 replaygain/rgdialog.cpp:262
-#: tags/trackorganiser.cpp:150
+#: context/songview.cpp:120 context/songview.cpp:139 context/songview.cpp:198
+#: replaygain/rgdialog.cpp:247 replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:256 replaygain/rgdialog.cpp:257
+#: tags/trackorganiser.cpp:164
 msgid "Abort"
 msgstr "취소"
 
-#: context/songview.cpp:121
+#: context/songview.cpp:122
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr "저장된 가사를 지우고 다시 받을까요?"
 
-#: context/songview.cpp:121 context/songview.cpp:122
-#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
+#: context/songview.cpp:122 context/songview.cpp:123
+#: online/onlineservicespage.cpp:458 online/onlineservicespage.cpp:459
 msgid "Re-download"
 msgstr "다시 내려받기"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Current playing song has changed, still perform search?"
 msgstr "지금 연주되는 곡이 바뀌었는데도 여전히 찾을까요?"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Song Changed"
 msgstr "곡 바뀜"
 
-#: context/songview.cpp:148
+#: context/songview.cpp:149
 msgid "Perform Search"
 msgstr "찾기"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save updated lyrics?"
 msgstr "업데이트된 가사를 저장할까요?"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save"
 msgstr "저장"
 
-#: context/songview.cpp:185
+#: context/songview.cpp:186
 msgid "Failed to save lyrics."
 msgstr "가사를 저장할 수 없음."
 
-#: context/songview.cpp:207
+#: context/songview.cpp:208
 msgid "Delete lyrics file?"
 msgstr "가사를 지울까요?"
 
-#: context/songview.cpp:207 gui/mainwindow.cpp:292
-#: widgets/messageoverlay.cpp:43
-msgid "Cancel"
-msgstr "취소"
+#: context/songview.cpp:208
+msgid "Delete File"
+msgstr "파일 삭제"
 
-#: context/songview.cpp:431
+#: context/songview.cpp:462
 msgid "Fetching lyrics via %1"
 msgstr "%1에서 가사 가져옴"
 
+#: context/ultimatelyricsprovider.cpp:200
+msgid "(Polish Translations)"
+msgstr "(폴란드어 번역)"
+
+#: context/ultimatelyricsprovider.cpp:201
+msgid "(Portuguese Translations)"
+msgstr "(포르투갈어 번역)"
+
+#: context/view.cpp:91 gui/mainwindow.cpp:328 widgets/messageoverlay.cpp:44
+msgid "Cancel"
+msgstr "취소"
+
 #: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "곡 목록"
@@ -251,14 +286,14 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "음반|평점|사운드트랙"
 
-#: context/wikipediasettings.cpp:99
+#: context/wikipediasettings.cpp:114
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
 msgstr "연주자와 음반정보를 찾을 때 사용할 언어를 선택합니다."
 
-#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
-#: online/podcastsearchdialog.cpp:393
+#: context/wikipediasettings.cpp:115 models/streamsmodel.cpp:598
+#: online/podcastsearchdialog.cpp:404
 msgid "Reload"
 msgstr "다시 읽기"
 
@@ -266,37 +301,52 @@ msgstr "다시 읽기"
 msgid "Cantata is playing a track"
 msgstr "칸타타가 곡을 연주하고 있습니다"
 
-#: devices/actiondialog.cpp:76
+#: devices/actiondialog.cpp:83
 msgid "Songs To Be Copied"
 msgstr "복사할 곡"
 
-#: devices/actiondialog.cpp:146
+#: devices/actiondialog.cpp:153
 msgid "<b>INVALID</b>"
 msgstr "<b>무효</b>"
 
-#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
+#: devices/actiondialog.cpp:167 devices/actiondialog.cpp:170
 msgid "<i>(When different)</i>"
 msgstr "<i>(다를 때)</i>"
 
-#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:185 tags/tageditor.cpp:713
+#: tags/trackorganiser.cpp:444
+msgid ""
+"Cantata has detected that you are connected to a Mopidy server.\n"
+"\n"
+"Currently it is not possible for Cantata to force Mopidy to refresh its "
+"local music listing. Therefore, you will need to stop Cantata, manually "
+"refresh Mopidy's database, and restart Cantata for any changes to be active."
+msgstr ""
+"Mopidy 서버에 연결된 것으로 보입니다.\n"
+"\n"
+"현재로는 칸타타에서 Mopidy 서버의 데이터베이스를 업데이트하는 것이 불가능"
+"합니다. 따라서, 칸타타를 중지하고 수동으로 데이터베이스를 읽은 다음에 "
+"다시 실행하시기 바랍니다."
+
+#: devices/actiondialog.cpp:211 devices/synccollectionwidget.cpp:274
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "연주자:%1, 음반:%2, 곡:%3"
 
-#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
-#: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
+#: devices/actiondialog.cpp:271 devices/mtpdevice.cpp:1622
+#: devices/remotefsdevice.cpp:571 devices/umsdevice.cpp:103
 msgid "%1 free"
 msgstr "%1 남음"
 
-#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
+#: devices/actiondialog.cpp:284 devices/actiondialog.cpp:288
 msgid "Local Music Library"
 msgstr "로컬 음악라이브러리"
 
-#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
+#: devices/actiondialog.cpp:286 devices/albumdetailsdialog.cpp:104
+#: gui/preferencesdialog.cpp:115 widgets/groupedview.cpp:251
 msgid "Audio CD"
 msgstr "오디오 CD"
 
-#: devices/actiondialog.cpp:293
+#: devices/actiondialog.cpp:309
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -307,7 +357,7 @@ msgstr ""
 "선택된 곡에 필요한 공간은 %1이지만, 남은 공간은 %2입니다.\n"
 "선택된 곡을 복사하려면, 더 작은 파일 크기로 변환해야 합니다."
 
-#: devices/actiondialog.cpp:300
+#: devices/actiondialog.cpp:316
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -315,248 +365,257 @@ msgstr ""
 "사용하고자 하는 장치에 여유 공간이 부족합니다.\n"
 "선택된 곡에 필요한 공간은 %1이지만, 남은 공간은 %2입니다."
 
-#: devices/actiondialog.cpp:349
+#: devices/actiondialog.cpp:365
 msgid "Copy Songs"
 msgstr "곡 복사"
 
-#: devices/actiondialog.cpp:349 devices/devicespage.cpp:503
-#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: devices/actiondialog.cpp:365 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:214 gui/folderpage.cpp:270 gui/librarypage.cpp:257
 #: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "곡 지우기"
 
-#: devices/actiondialog.cpp:380
+#: devices/actiondialog.cpp:402
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
 msgstr "<p>대상 장치가 설정되지 않았습니다.<br/>기본 설정으로 계속할까요?</p>"
 
-#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
+#: devices/actiondialog.cpp:403 devices/actiondialog.cpp:407
 msgid "Not Configured"
 msgstr "설정 안 됨"
 
-#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
+#: devices/actiondialog.cpp:404 devices/actiondialog.cpp:408
 msgid "Use Defaults"
 msgstr "기본값 사용"
 
-#: devices/actiondialog.cpp:384
+#: devices/actiondialog.cpp:406
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
 msgstr "<p>원본 장치가 설정되지 않았습니다.<br/>기본 설정으로 계속할까요?</p>"
 
-#: devices/actiondialog.cpp:446
+#: devices/actiondialog.cpp:468
 msgid "Are you sure you wish to stop?"
 msgstr "정지할까요?"
 
-#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
+#: devices/actiondialog.cpp:468 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "정지"
 
-#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
-#: tags/trackorganiser.cpp:446
+#: devices/actiondialog.cpp:513 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:468 tags/tageditor.cpp:880
+#: tags/trackorganiser.cpp:478
 msgid "Device has been removed!"
 msgstr "장치가 제거되었습니다!"
 
-#: devices/actiondialog.cpp:491
+#: devices/actiondialog.cpp:515
 msgid "Device is not connected!"
 msgstr "장치가 연결되지 않았습니다!"
 
-#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
-#: tags/trackorganiser.cpp:456
+#: devices/actiondialog.cpp:517 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:478 tags/tageditor.cpp:890
+#: tags/trackorganiser.cpp:488
 msgid "Device is busy?"
 msgstr "장치가 사용 중입니까?"
 
-#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:519 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "장치가 바뀌었습니까?"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:586
 msgid "Clearing unused folders"
 msgstr "사용되지 않는 폴더 지우기"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "리핑된 곡의 리플레이게인을 계산할까요?"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "ReplyGain"
 msgstr "리플레이게인"
 
-#: devices/actiondialog.cpp:578
+#: devices/actiondialog.cpp:602
 msgid "Calculate"
 msgstr "계산"
 
-#: devices/actiondialog.cpp:634
-msgid "The destination filename already exists!<hr/>%1"
-msgstr "대상 파일이름이 이미 있습니다!<hr/>%1"
+#: devices/actiondialog.cpp:661
+msgid "The destination filename already exists!"
+msgstr "대상 파일이름이 이미 있습니다!"
 
-#: devices/actiondialog.cpp:637
-msgid "Song already exists!<hr/>%1"
-msgstr "곡이 이미 있습니다!<hr/>%1"
+#: devices/actiondialog.cpp:664
+msgid "Song already exists!"
+msgstr "곡이 이미 있습니다!"
 
-#: devices/actiondialog.cpp:640
-msgid "Song does not exist!<hr/>%1"
-msgstr "곡이 없습니다!<hr/>%1"
+#: devices/actiondialog.cpp:667
+msgid "Song does not exist!"
+msgstr "곡이 없습니다!"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:670
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
-"permissions.<hr/>%1"
-msgstr "대상 폴더를 만들 수 없음!<br/>권한이 있는지 확인 바랍니다.<hr/>%1"
+"permissions."
+msgstr "대상 폴더를 만들 수 없음!<br/>권한이 있는지 확인 바랍니다."
 
-#: devices/actiondialog.cpp:646
-msgid "Source file no longer exists?<br/><br/<hr/>%1"
-msgstr "원본 파일이 더 이상 존재하지 않습니까?<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:673
+msgid "Source file no longer exists?"
+msgstr "원본 파일이 더 이상 존재하지 않습니까?"
 
-#: devices/actiondialog.cpp:649
-msgid "Failed to copy.<hr/>%1"
-msgstr "복사할 수 없음.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to copy."
+msgstr "복사할 수 없음."
 
-#: devices/actiondialog.cpp:650
-msgid "Failed to delete.<hr/>%1"
-msgstr "지울 수 없음.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to delete."
+msgstr "지울 수 없음."
 
-#: devices/actiondialog.cpp:653
-msgid "Not connected to device.<hr/>%1"
-msgstr "장치에 연결되어 있지 않음.<hr/>%1"
+#: devices/actiondialog.cpp:679
+msgid "Not connected to device."
+msgstr "장치에 연결되어 있지 않음."
 
-#: devices/actiondialog.cpp:656
-msgid "Selected codec is not available.<hr/>%1"
-msgstr "선택된 코덱을 사용할 수 없습니다.<hr/>%1"
+#: devices/actiondialog.cpp:682
+msgid "Selected codec is not available."
+msgstr "선택된 코덱을 사용할 수 없습니다."
 
-#: devices/actiondialog.cpp:659
-msgid "Transcoding failed.<br/><br/<hr/>%1"
-msgstr "변환할 수 없음.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:685
+msgid "Transcoding failed."
+msgstr "변환 실패."
 
-#: devices/actiondialog.cpp:662
+#: devices/actiondialog.cpp:688
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
-"devices.)<hr/>%1"
-msgstr "임시 파일을 만들 수 없음.<br/>(MTP 장치로 변환에 필요)<hr/>%1"
+"devices.)"
+msgstr "임시 파일을 만들 수 없음.<br/>(MTP 장치로 변환에 필요.)"
 
-#: devices/actiondialog.cpp:665
-msgid "Failed to read source file.<br/><br/<hr/>%1"
-msgstr "원본 파일을 읽을 수 없음.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:691
+msgid "Failed to read source file."
+msgstr "원본 파일을 읽을 수 없음."
 
-#: devices/actiondialog.cpp:668
-msgid "Failed to write to destination file.<br/><br/<hr/>%1"
-msgstr "대상 파일을 쓸 수 없음.<br/>%1"
+#: devices/actiondialog.cpp:694
+msgid "Failed to write to destination file."
+msgstr "대상 파일을 쓸 수 없음."
 
-#: devices/actiondialog.cpp:671
-msgid "No space left on device.<br/><br/<hr/>%1"
-msgstr "장치에 여유 공간이 없음.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:697
+msgid "No space left on device."
+msgstr "장치에 여유 공간이 없음."
 
-#: devices/actiondialog.cpp:674
-msgid "Failed to update metadata.<br/><br/<hr/>%1"
-msgstr "메타데이터를 업데이트할 수 없음.<hr/>%1"
+#: devices/actiondialog.cpp:700
+msgid "Failed to update metadata."
+msgstr "메타데이터를 업데이트할 수 없음."
 
-#: devices/actiondialog.cpp:677
-msgid "Failed to download track.<br/><br/<hr/>%1"
-msgstr "곡을 내려받을 수 없음.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:703
+msgid "Failed to download track."
+msgstr "곡을 내려받을 수 없음."
 
-#: devices/actiondialog.cpp:680
-msgid "Failed to lock device.<hr/>%1"
-msgstr "장치를 잠글 수 없음.<hr/>%1"
+#: devices/actiondialog.cpp:706
+msgid "Failed to lock device."
+msgstr "장치를 잠글 수 없음."
 
-#: devices/actiondialog.cpp:709
+#: devices/actiondialog.cpp:735
 msgid "Local Music Library Properties"
 msgstr "로컬 음악라이브러리 속성"
 
-#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
-msgid "<b>Error</b><br/>"
-msgstr "<b>오류</b><br/>"
+#: devices/actiondialog.cpp:776 devices/actiondialog.cpp:790
+#: support/messagebox.cpp:108 support/messagebox.cpp:114
+#: support/messagebox.h:62
+msgid "Error"
+msgstr "오류"
 
-#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:780 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Skip"
 msgstr "건너뜀"
 
-#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:781 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Auto Skip"
 msgstr "자동 건너뜀"
 
-#: devices/actiondialog.cpp:759
+#: devices/actiondialog.cpp:785
 msgid "Retry"
 msgstr "다시 시도"
 
-#: devices/actiondialog.cpp:774
-msgid ""
-"<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
-"td></tr>"
-msgstr ""
-"<tr><td align=\"right\">연주자:</td><td>%1</td></tr><tr><td align=\"right\">"
-"음반:</td><td>%2</td></tr><tr><td align=\"right\">곡:</td><td>%3</td></tr>"
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#: devices/actiondialog.cpp:801 gui/searchpage.cpp:203 po/rc.cpp:374
+#: po/rc.cpp:953 rc.cpp:374 rc.cpp:953
+msgid "Album:"
+msgstr "음반:"
 
-#: devices/actiondialog.cpp:781
-msgid ""
-"<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
-"\"right\">Destination file:</td><td>%2</td></tr>"
-msgstr ""
-"<tr><td align=\"right\">원본 파일:</td><td>%1</td></tr><tr><td align=\"right"
-"\">대상 파일:</td><td>%2</td></tr>"
+#. i18n: file: tags/tageditor.ui:25
+#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
+#: devices/actiondialog.cpp:802 po/rc.cpp:938 rc.cpp:938
+msgid "Track:"
+msgstr "곡:"
 
-#: devices/actiondialog.cpp:786
-msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
-msgstr "<tr><td align=\"right\">파일:</td><td>%1</td></tr>"
+#: devices/actiondialog.cpp:806
+msgid "Source file:"
+msgstr "원본:"
 
-#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
-#: gui/cachesettings.cpp:230
+#: devices/actiondialog.cpp:807
+msgid "Destination file:"
+msgstr "대상 파일:"
+
+#: devices/actiondialog.cpp:809 gui/searchpage.cpp:207
+msgid "File:"
+msgstr "파일:"
+
+#: devices/actiondialog.cpp:815 gui/cachesettings.cpp:179
+#: gui/cachesettings.cpp:235
 msgid "Calculating..."
 msgstr "계산 중..."
 
-#: devices/actiondialog.cpp:799
+#: devices/actiondialog.cpp:822
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (예상)"
 
-#: devices/actiondialog.cpp:802
-msgid ""
-"<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
-"i></tr>"
-msgstr ""
-"<tr><i><td align=\"right\"><i>남은 시간:</i></td><td><i>%5</i></td></i></tr>"
+#: devices/actiondialog.cpp:824
+msgid "Time remaining:"
+msgstr "남은 시간:"
 
-#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: devices/actiondialog.cpp:847 devices/fsdevice.cpp:762
 #: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "캐시 저장"
 
-#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
+#: devices/albumdetailsdialog.cpp:139 devices/albumdetailsdialog.cpp:236
+#: tags/tageditor.cpp:158 tags/tageditor.cpp:373
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "\"여러 연주자\" 해결 적용"
 
-#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
+#: devices/albumdetailsdialog.cpp:140 devices/albumdetailsdialog.cpp:260
+#: tags/tageditor.cpp:159 tags/tageditor.cpp:418
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "\"여러 연주자\" 해결 되돌리기"
 
-#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
-#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
+#: devices/albumdetailsdialog.cpp:141 devices/albumdetailsdialog.cpp:278
+#: tags/tageditor.cpp:161 tags/tageditor.cpp:499
 msgid "Capitalize"
 msgstr "대문자로"
 
-#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
-#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
+#: devices/albumdetailsdialog.cpp:142 devices/albumdetailsdialog.cpp:295
+#: tags/tageditor.cpp:162 tags/tageditor.cpp:528
 msgid "Adjust Track Numbers"
 msgstr "곡 번호 조정"
 
-#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
+#: devices/albumdetailsdialog.cpp:144 tags/tageditor.cpp:156
 msgid "Tools"
 msgstr "도구"
 
-#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:369
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "\"여러 연주자\" 해결을 적용할까요?"
 
-#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
+#: devices/albumdetailsdialog.cpp:234 tags/tageditor.cpp:371
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -564,11 +623,11 @@ msgstr ""
 "<i>'음반연주자'와 '연주자'를 \"여러 연주자\"로 설정하고, '제목'을 \"곡 연주"
 "자 - 곡 제목\"으로 바꿉니다.</i>"
 
-#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:411
 msgid "Revert \"Various Artists\" workaround"
 msgstr "\"여러 연주자\" 해결을 되돌림"
 
-#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
+#: devices/albumdetailsdialog.cpp:255 tags/tageditor.cpp:413
 msgid ""
 "<i>Where the 'Album artist' is the same as 'Artist' and the 'Title' is of "
 "the format \"TrackArtist - TrackTitle\", 'Artist' will be taken from 'Title' "
@@ -581,36 +640,26 @@ msgstr ""
 "><br/>'제목'이 \"유재하 - 내 마음에 비친 내 모습\"이고 '연주자'가 \"유재하"
 "\"로 설정되면, '제목'은 \"내 마음에 비친 내 모습\"이 됩니다.</i>"
 
-#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
+#: devices/albumdetailsdialog.cpp:261 tags/tageditor.cpp:419
 msgid "Revert"
 msgstr "되돌림"
 
-#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
+#: devices/albumdetailsdialog.cpp:277 tags/tageditor.cpp:497
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr "'제목', '연주자', '음반연주자', '음반'의 첫 글자를 대문자로 만듬"
 
-#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
+#: devices/albumdetailsdialog.cpp:295 tags/tageditor.cpp:529
 msgid "Adjust track number by:"
 msgstr "곡 번호 조정:"
 
-#: devices/albumdetailsdialog.cpp:335 devices/cddbinterface.cpp:143
-#: devices/deviceoptions.cpp:358 devices/musicbrainz.cpp:202
-#: devices/musicbrainz.cpp:324 gui/mainwindow.cpp:1771 gui/mainwindow.cpp:1784
-#: models/musiclibraryitemroot.cpp:362 models/musiclibraryitemroot.cpp:520
-#: models/playqueuemodel.cpp:325 mpd/mpdparseutils.cpp:249
-#: mpd/mpdparseutils.cpp:409 mpd/song.cpp:228 mpd/song.cpp:233
-#: mpd/song.cpp:272 mpd/song.cpp:299 widgets/groupedview.cpp:260
-msgid "Unknown"
-msgstr "알 수 없음"
-
 #: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "디스크 읽음"
 
-#: devices/audiocddevice.cpp:353 gui/mainwindow.cpp:2199
-#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
-#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
+#: devices/audiocddevice.cpp:358 gui/mainwindow.cpp:2345
+#: gui/searchpage.cpp:220 models/albumsmodel.cpp:245 models/musicmodel.cpp:217
+#: models/playlistsmodel.cpp:309 models/playlistsmodel.cpp:324
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "한 곡 (%2)"
@@ -633,9 +682,9 @@ msgid "Failed to open CD device"
 msgstr "CD 장치를 읽을 수 없음"
 
 #: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
-#: devices/musicbrainz.cpp:217
+#: devices/musicbrainz.cpp:216
 msgid "Track %1"
-msgstr "곡 %1"
+msgstr "%1 곡"
 
 #: devices/cddbinterface.cpp:291
 msgid "Failed to create CDDB connection"
@@ -653,19 +702,19 @@ msgstr "CDDB 오류: %1"
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr "여러 자료가 있으니, 아래에서 하나를 고르시기 바랍니다:"
 
-#. i18n: file: devices/albumdetails.ui:170
+#. i18n: file: devices/albumdetails.ui:163
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:66
-#: models/playqueuemodel.cpp:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
-#: rc.cpp:82
+#: models/playqueuemodel.cpp:106 po/rc.cpp:113 replaygain/rgdialog.cpp:128
+#: rc.cpp:113
 msgid "Artist"
 msgstr "연주자"
 
-#. i18n: file: devices/albumdetails.ui:175
+#. i18n: file: devices/albumdetails.ui:168
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:76
-#: models/playqueuemodel.cpp:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
-#: rc.cpp:85
+#: models/playqueuemodel.cpp:105 po/rc.cpp:116 replaygain/rgdialog.cpp:130
+#: rc.cpp:116
 msgid "Title"
 msgstr "제목"
 
@@ -740,7 +789,7 @@ msgstr ""
 "두 '여러 연주자'로 설정되어 있으면 '제목' 태그로부터 실제 연주자를 추출하고 "
 "'제목' 태그에서 연주자 이름을 지웁니다.</p>"
 
-#: devices/devicepropertieswidget.cpp:99
+#: devices/devicepropertieswidget.cpp:98
 msgid ""
 "<p>If you enable this, then Cantata will create a cache of the device's "
 "music library. This will help to speed up subsequent library scans (as the "
@@ -757,19 +806,19 @@ msgstr ""
 "결하려면, 장치 리스트의 새로 읽기 단추를 눌러 캐시 파일을 지우고 장치를 다시 "
 "읽습니다.</p>"
 
-#: devices/devicepropertieswidget.cpp:204
+#: devices/devicepropertieswidget.cpp:209
 msgid "Do not transcode"
 msgstr "변환 안 함"
 
-#: devices/devicepropertieswidget.cpp:212
+#: devices/devicepropertieswidget.cpp:216
 msgid "Encoder"
 msgstr "인코더"
 
-#: devices/devicepropertieswidget.cpp:228
+#: devices/devicepropertieswidget.cpp:231
 msgid "Transcode to %1"
 msgstr "%1로 변환"
 
-#: devices/devicepropertieswidget.cpp:259
+#: devices/devicepropertieswidget.cpp:262
 msgctxt "name (size free)"
 msgid "%1 (%2 free)"
 msgstr "%1 (%2 남음)"
@@ -782,11 +831,11 @@ msgstr "라이브러리로 복사"
 msgid "Sync"
 msgstr "동기화"
 
-#: devices/devicespage.cpp:71
+#: devices/devicespage.cpp:70
 msgid "Forget Device"
 msgstr "장치 잃음"
 
-#: devices/devicespage.cpp:114 devices/remotedevicepropertiesdialog.cpp:60
+#: devices/devicespage.cpp:113 devices/remotedevicepropertiesdialog.cpp:60
 msgid "Add Device"
 msgstr "장치 추가"
 
@@ -795,7 +844,7 @@ msgid "Lookup album and track details?"
 msgstr "음반과 곡의 상세정보를 찾습니까?"
 
 #: devices/devicespage.cpp:433 devices/devicespage.cpp:445
-#: devices/devicespage.cpp:455
+#: devices/devicespage.cpp:455 gui/mainwindow.cpp:589
 msgid "Refresh"
 msgstr "새로 읽기"
 
@@ -824,8 +873,8 @@ msgstr "부분"
 msgid "Full"
 msgstr "전체"
 
-#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
-#: gui/librarypage.cpp:257
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:213 gui/folderpage.cpp:269
+#: gui/librarypage.cpp:256
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -853,11 +902,11 @@ msgstr "<b>%1</b>을 끊을까요?"
 msgid "Disconnect"
 msgstr "연결 끊음"
 
-#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1220
 msgid "Please close other dialogs first."
 msgstr "다른 대화창을 먼저 닫으시기 바랍니다."
 
-#: devices/encoders.cpp:77
+#: devices/encoders.cpp:78
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -872,7 +921,7 @@ msgstr ""
 "은 손실 코덱입니다.<br>AAC는 일반적으로 비슷한 비트레이트에서 MP3보다 나은 음"
 "질을 들려줍니다. iPod나 다른 휴대용 음악 연주기에서는 좋은 선택입니다."
 
-#: devices/encoders.cpp:82
+#: devices/encoders.cpp:83
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>AAC</b> encoder used by Cantata supports a <a "
@@ -901,21 +950,21 @@ msgstr ""
 "><b>120kb/s 이하</b>는 음악이 만족스럽지 않을 수 있습니다. <b>200kb/s</b>는 "
 "너무 높을 수 있습니다."
 
-#: devices/encoders.cpp:100 devices/encoders.cpp:140
+#: devices/encoders.cpp:101 devices/encoders.cpp:141
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr "가변 비트레이트 인코딩에서의 평균 기댓값"
 
-#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
-#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:293 devices/encoders.cpp:329
 msgid "Smaller file"
 msgstr "더 작은 파일"
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:233 devices/encoders.cpp:329
+#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
+#: devices/encoders.cpp:234 devices/encoders.cpp:330
 msgid "Better sound quality"
 msgstr "더 좋은 음악 품질"
 
-#: devices/encoders.cpp:119
+#: devices/encoders.cpp:120
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -930,7 +979,7 @@ msgstr ""
 "에도 불구하고, 소비자 오디오의 범용 저장 포맷으로 휴대용 음악 연주기에 널리 "
 "쓰입니다."
 
-#: devices/encoders.cpp:123
+#: devices/encoders.cpp:124
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>MP3</b> encoder used by Cantata supports a <a "
@@ -955,11 +1004,11 @@ msgstr ""
 "생기에서 음악 듣기에 좋은 선택입니다.<br/><b>120kb/s 이하</b>는 음악이 불만족"
 "스러울 수 있습니다.<b>205kb/s 이상</b>은 너무 높을 수 있습니다."
 
-#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
+#: devices/encoders.cpp:156 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:158
+#: devices/encoders.cpp:159
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -974,7 +1023,7 @@ msgstr ""
 "서 MP3보다 더 작은 파일을 만듭니다. Ogg Vorbis는 전반적으로, 특히 지원하는 휴"
 "대용 음악 연주기에는 아주 좋은 선택입니다."
 
-#: devices/encoders.cpp:163
+#: devices/encoders.cpp:164
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Vorbis</b> encoder used by Cantata supports a "
@@ -1004,15 +1053,15 @@ msgstr ""
 "이하</b>는 음악이 불만족스러울 수 있습니다.<b>8이상</b>은 너무 높을 수 있습니"
 "다."
 
-#: devices/encoders.cpp:183
+#: devices/encoders.cpp:184
 msgid "Quality rating"
 msgstr "품질 순위"
 
-#: devices/encoders.cpp:200
+#: devices/encoders.cpp:201
 msgid "Opus"
 msgstr "오푸스(Opus)"
 
-#: devices/encoders.cpp:203
+#: devices/encoders.cpp:204
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1021,10 +1070,10 @@ msgid ""
 "patent-free digital audio codec using a form of lossy data compression."
 msgstr ""
 "<a href=http://ko.wikipedia.org/wiki/%EC%98%A4%ED%91%B8%EC%8A%A4_%28%EC"
-"%98%A4%EB%94%94%EC%98%A4_%ED%8F%AC%EB%A7%B7%29>Opus</a>는 손실 데이터 "
-"압축을 이용하는 사용료가 없는 오디오 코덱입니다."
+"%98%A4%EB%94%94%EC%98%A4_%ED%8F%AC%EB%A7%B7%29>Opus</a>는 손실 데이터 압축을 "
+"이용하는 사용료가 없는 오디오 코덱입니다."
 
-#: devices/encoders.cpp:205
+#: devices/encoders.cpp:206
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Opus</b> encoder used by Cantata supports a <a "
@@ -1040,25 +1089,25 @@ msgid ""
 "anything above <b>256kb/s</b> is probably overkill."
 msgstr ""
 "비트레이트는 오디오 트랙의 초당 데이터를 나타내는 양을 수치화한 것입니다.<br>"
-"칸타타에 쓰인 <b>오푸스</b> 인코더는 <a href=http:http://ko.wikipedia.org"
-"/wiki/%EA%B0%80%EB%B3%80_%EB%B9%84%ED%8A%B8%EB%A0%88%EC%9D%B4%ED%8A%B8>"
-"가변 비트레이트</a> 설정을 지원하는데, 이는 오디오 정보의 복잡"
-"성에 따라 트랙의 비트레이트가 가변적임을 의미합니다. 복잡한 데이터는 단순한 "
-"것보다 높은 비트레이트로 인코딩이 되며, 이 방식은 트랙에서 전반적으로 높은 품"
-"질과 작은 파일을 만듭니다. <br>이런 이유로 이 슬라이더에서 측정된 비트레이트"
-"는 인코딩된 트랙의 평균 비트레이트일 뿐입니다.<br><b>128kb/s</b>은 휴대용 재"
-"생기에서 음악 듣기에 좋은 선택입니다.<br/><b>100kb/s 이하</b>는 음악이 불만족"
-"스러울 수 있습니다.<b>256kb/s 이상</b>은 너무 높을 수 있습니다."
+"칸타타에 쓰인 <b>오푸스</b> 인코더는 <a href=http:http://ko.wikipedia.org/"
+"wiki/%EA%B0%80%EB%B3%80_%EB%B9%84%ED%8A%B8%EB%A0%88%EC%9D%B4%ED%8A%B8>가변 비"
+"트레이트</a> 설정을 지원하는데, 이는 오디오 정보의 복잡성에 따라 트랙의 비트"
+"레이트가 가변적임을 의미합니다. 복잡한 데이터는 단순한 것보다 높은 비트레이트"
+"로 인코딩이 되며, 이 방식은 트랙에서 전반적으로 높은 품질과 작은 파일을 만듭"
+"니다. <br>이런 이유로 이 슬라이더에서 측정된 비트레이트는 인코딩된 트랙의 평"
+"균 비트레이트일 뿐입니다.<br><b>128kb/s</b>은 휴대용 재생기에서 음악 듣기에 "
+"좋은 선택입니다.<br/><b>100kb/s 이하</b>는 음악이 불만족스러울 수 있습니다."
+"<b>256kb/s 이상</b>은 너무 높을 수 있습니다."
 
-#: devices/encoders.cpp:222 devices/encoders.cpp:319
+#: devices/encoders.cpp:223 devices/encoders.cpp:320
 msgid "Bitrate"
 msgstr "비트레이트"
 
-#: devices/encoders.cpp:241
+#: devices/encoders.cpp:242
 msgid "Apple Lossless"
 msgstr "애플 무손실"
 
-#: devices/encoders.cpp:244
+#: devices/encoders.cpp:245
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1072,11 +1121,11 @@ msgstr ""
 "%8B%A4>애플 무손실</a> (ALAC)은 디지털 음악의 무손실 압축을 위한 오디오 코덱"
 "입니다.<br>애플 제품이나 FLAC을 지원하지 않는 연주기에서만 추천합니다."
 
-#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:260 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:262
+#: devices/encoders.cpp:263
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1090,7 +1139,7 @@ msgstr ""
 "(FLAC)은 무손실 디지털 음악을 위해서 공개된, 사용료가 없는 코덱입니다.<br>오"
 "디오 품질을 손상시키지 않고 음악을 저장하려면, FLAC은 훌륭한 선택입니다."
 
-#: devices/encoders.cpp:266
+#: devices/encoders.cpp:267
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1112,19 +1161,19 @@ msgstr ""
 "므로 압축률에 상관없이 음악 출력품질은 동일합니다.<br/>또한, <b>5</b>이상의 "
 "값은 압축 시간을 늘이지만 파일 크기는 약간만 작아지므로 추천하지 않습니다."
 
-#: devices/encoders.cpp:281
+#: devices/encoders.cpp:282
 msgid "Compression level"
 msgstr "압축률"
 
-#: devices/encoders.cpp:291
+#: devices/encoders.cpp:292
 msgid "Faster compression"
 msgstr "더 빠른 압축"
 
-#: devices/encoders.cpp:298
+#: devices/encoders.cpp:299
 msgid "Windows Media Audio"
 msgstr "윈도 미디어 오디오 (WMA)"
 
-#: devices/encoders.cpp:301
+#: devices/encoders.cpp:302
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1139,7 +1188,7 @@ msgstr ""
 "을 위해 마이크로소프트에 의해 개발된 독점 코덱입니다.<br>Ogg Vorbis를 지원하"
 "지 않는 휴대용 음악 연주기에만 추천됩니다."
 
-#: devices/encoders.cpp:305
+#: devices/encoders.cpp:306
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>Due to the limitations of the proprietary <b>WMA</b> "
@@ -1161,173 +1210,108 @@ msgstr ""
 "><b>112kb/s 이하</b>는 음악이 불만족스러울 수 있습니다.<b>182kb/s 이상</b>은 "
 "너무 높을 수 있습니다."
 
-#: devices/filenameschemedialog.cpp:33
+#: devices/filenameschemedialog.cpp:34
 msgid "Filename Scheme"
 msgstr "파일이름 구성"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:62
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "유재하"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:63
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "유재하"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:64
 msgctxt "Example composer"
 msgid "Vivaldi"
 msgstr "유재하"
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:65
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "사랑하기 때문에"
 
-#: devices/filenameschemedialog.cpp:56
+#: devices/filenameschemedialog.cpp:66
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "내 마음에 비친 내 모습"
 
-#: devices/filenameschemedialog.cpp:57
+#: devices/filenameschemedialog.cpp:67
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Ballad"
 
-#: devices/filenameschemedialog.cpp:101
+#: devices/filenameschemedialog.cpp:121
 msgid ""
 "<p>The following variables will be replaced with their corresponding meaning "
 "for each track name.</p>"
-msgstr ""
-"<p>아래 변수는 각 곡명의 해당되는 의미에 따라 바뀝니다.</p>"
+msgstr "<p>아래 변수는 각 곡명의 해당되는 의미에 따라 바뀝니다.</p>"
 
-#: devices/filenameschemedialog.cpp:103
+#: devices/filenameschemedialog.cpp:123
 msgid ""
-"<tr><th><em>Button</em></th><th><em>Variable</em></th><th><em>Description</"
+"<tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</"
 "em></th></tr>"
 msgstr ""
-"<tr><th><em>단추</em></th><th><em>변수</em></th><th><em>설명</em></th></tr>"
-
-#: devices/filenameschemedialog.cpp:104
-msgid ""
-"<tr><td>%albumartist%</td><td>%1</td><td>The artist of the album. For most "
-"albums, this will be the same as the <i>Track Artist.</i> For compilations, "
-"this will often be <i>Various Artists.</i> </td></tr>"
-msgstr ""
-"<tr><td>%albumartist%</td><td>%1</td><td>음반의 연주자. 대부분의 경우, "
-"<i>곡의 연주자</i>와 동일합니다. 편집음반의 경우, 대게 <i>여러 연주자</i>"
-"입니다. </td></tr>"
-
-#: devices/filenameschemedialog.cpp:106
-msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
-msgstr "<tr><td>%album%</td><td>%1</td><td>음반의 이름.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:107
-msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
-msgstr "<tr><td>%composer%</td><td>%1</td><td>작곡가.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:108
-msgid "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
-msgstr "<tr><td>%artist%</td><td>%1</td><td>각 곡의 연주자.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:109
-msgid ""
-"<tr><td>%title%</td><td>%1</td><td>The track title (without <i>Track Artist</"
-"i>).</td></tr>"
-msgstr ""
-"<tr><td>%title%</td><td>%1</td><td>곡명 (<i>곡 연주자</i>없이).</td></tr>"
-
-#: devices/filenameschemedialog.cpp:110
-msgid ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>The track title (with <i>Track "
-"Artist</i>, if different to <i>Album Artist</i>).</td></tr>"
-msgstr ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>곡명 (만약 <i>음반연주자</i>와 "
-"다르다면, <i>곡 연주자</i>와 함께.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:111
-msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
-msgstr "<tr><td>%track%</td><td>%1</td><td>곡 번호.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:112
-msgid ""
-"<tr><td>%discnumber%</td><td>%1</td><td>The album number of a multi-album "
-"album. Often compilations consist of several albums.</td></tr>"
-msgstr ""
-"<tr><td>%discnumber%</td><td>%1</td><td>다수 음반의 음반 수."
-"편집음반의 경우 대게 여러 장으로 구성됩니다.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:113
-msgid ""
-"<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></tr>"
-msgstr "<tr><td>%year%</td><td>%1</td><td>음반발매연도.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:114
-msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
-msgstr "<tr><td>%genre%</td><td>%1</td><td>음반의 장르.</td></tr>"
+"<tr><th><em>변수</em></th><th><em>단추</em></th><th><em>설명</em></th></tr>"
 
-#: devices/fsdevice.cpp:668
+#: devices/fsdevice.cpp:675 gui/albumspage.cpp:287 gui/folderpage.cpp:304
+#: gui/librarypage.cpp:414
 msgid "Updating..."
 msgstr "업데이트 중..."
 
-#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: devices/fsdevice.cpp:757 online/onlineservice.cpp:94
 #: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "캐시 읽음"
 
-#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
+#: devices/fsdevice.cpp:769 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
 
-#: devices/mtpdevice.cpp:137
+#: devices/mtpdevice.cpp:153
 msgid "Connecting to device..."
 msgstr "장치 연결 중..."
 
-#: devices/mtpdevice.cpp:139 devices/mtpdevice.cpp:161
+#: devices/mtpdevice.cpp:155 devices/mtpdevice.cpp:202
 msgid "No devices found"
 msgstr "장치가 없음"
 
-#: devices/mtpdevice.cpp:173
+#: devices/mtpdevice.cpp:217
 msgid "Connected to device"
 msgstr "장치에 연결됨"
 
-#: devices/mtpdevice.cpp:183
+#: devices/mtpdevice.cpp:230
 msgid "Disconnected from device"
 msgstr "장치와 분리됨"
 
-#: devices/mtpdevice.cpp:250
+#: devices/mtpdevice.cpp:304
 msgid "Updating folders..."
 msgstr "폴더 업데이트 중..."
 
-#: devices/mtpdevice.cpp:257
+#: devices/mtpdevice.cpp:320
 msgid "Updating files..."
 msgstr "파일 업데이트 중..."
 
-#: devices/mtpdevice.cpp:262 devices/remotefsdevice.cpp:465
-#: devices/remotefsdevice.cpp:485
+#: devices/mtpdevice.cpp:334 devices/remotefsdevice.cpp:461
+#: devices/remotefsdevice.cpp:481
 msgid "Updating tracks..."
 msgstr "곡 업데이트 중..."
 
-#: devices/mtpdevice.cpp:281 devices/mtpdevice.cpp:383
-#: models/musiclibraryitemroot.cpp:78 models/musiclibraryitemroot.cpp:117
-#: models/musiclibraryitemroot.cpp:171 models/musiclibraryitemroot.cpp:833
-#: models/musiclibraryitemroot.cpp:1012 mpd/song.cpp:371
-msgid "Various Artists"
-msgstr "여러 연주자"
-
-#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
-#: models/devicesmodel.cpp:140
+#: devices/mtpdevice.cpp:1619 devices/remotefsdevice.cpp:564
+#: devices/umsdevice.cpp:100 gui/initialsettingswizard.cpp:57
+#: models/devicesmodel.cpp:157
 msgid "Not Connected"
 msgstr "연결 안 됨"
 
-#: devices/musicbrainz.cpp:320
+#: devices/musicbrainz.cpp:319
 msgid "%1 (Disc %2)"
 msgstr "%1 (디스크 %2)"
 
-#: devices/musicbrainz.cpp:408
+#: devices/musicbrainz.cpp:407
 msgid "No matches found in MusicBrainz"
 msgstr "MusicBrainz에서 찾을 수 없음"
 
@@ -1335,7 +1319,7 @@ msgstr "MusicBrainz에서 찾을 수 없음"
 msgid "Connection"
 msgstr "연결"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:261
 msgid "Music Library"
 msgstr "음악라이브러리"
 
@@ -1363,30 +1347,30 @@ msgstr "보안 셸 (sshfs)"
 msgid "Locally Mounted Folder"
 msgstr "로컬 마운트 폴더"
 
-#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:612
+#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:608
 msgid "Available"
 msgstr "사용 가능"
 
-#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:610
+#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:606
 msgid "Not Available"
 msgstr "사용 불가"
 
-#: devices/remotefsdevice.cpp:315
+#: devices/remotefsdevice.cpp:313
 msgid "Failed to resolve connection details for %1"
 msgstr "%1의 상세정보에 연결 안 됨"
 
-#: devices/remotefsdevice.cpp:330 devices/remotefsdevice.cpp:345
-#: devices/remotefsdevice.cpp:403
+#: devices/remotefsdevice.cpp:328 devices/remotefsdevice.cpp:343
+#: devices/remotefsdevice.cpp:399
 msgid "Connecting..."
 msgstr "연결 중..."
 
-#: devices/remotefsdevice.cpp:358
+#: devices/remotefsdevice.cpp:356
 msgid ""
 "Password prompting does not work when cantata is started from the "
 "commandline."
 msgstr "칸타타가 명령어라인에서 실행되면 비밀번호 입력이 안됩니다."
 
-#: devices/remotefsdevice.cpp:379
+#: devices/remotefsdevice.cpp:375
 msgid ""
 "No suitable ssh-askpass application installed! This is required for entering "
 "passwords."
@@ -1394,50 +1378,50 @@ msgstr ""
 "적당한 ssh-askpass 응용프로그램이 설치되지 않았습니다! 이는 패스워드 입력에 "
 "필요합니다."
 
-#: devices/remotefsdevice.cpp:386
+#: devices/remotefsdevice.cpp:382
 msgid "Mount point (\"%1\") is not empty!"
 msgstr "마운트 포인트 (\"%1\")가 비어있지 않습니다!"
 
-#: devices/remotefsdevice.cpp:398
+#: devices/remotefsdevice.cpp:394
 msgid "\"sshfs\" is not installed!"
 msgstr "\"sshfs\"가 설치되지 않았습니다!"
 
-#: devices/remotefsdevice.cpp:426 devices/remotefsdevice.cpp:446
+#: devices/remotefsdevice.cpp:422 devices/remotefsdevice.cpp:442
 msgid "Disconnecting..."
 msgstr "연결해제 중..."
 
-#: devices/remotefsdevice.cpp:440
+#: devices/remotefsdevice.cpp:436
 msgid "\"fusermount\" is not installed!"
 msgstr "\"fusermount\"가 설치되지 않았습니다!"
 
-#: devices/remotefsdevice.cpp:461 devices/remotefsdevice.cpp:482
+#: devices/remotefsdevice.cpp:457 devices/remotefsdevice.cpp:478
 msgid "Failed to connect to \"%1\""
 msgstr "\"%1\"에 연결 안 됨"
 
-#: devices/remotefsdevice.cpp:462 devices/remotefsdevice.cpp:497
+#: devices/remotefsdevice.cpp:458 devices/remotefsdevice.cpp:493
 msgid "Failed to disconnect from \"%1\""
 msgstr "\"%1\"로부터 연결 해제 안 됨"
 
-#: devices/remotefsdevice.cpp:573
+#: devices/remotefsdevice.cpp:569
 msgid "Capacity Unknown"
 msgstr "용량을 알 수 없음"
 
-#. i18n: file: gui/coverdialog.ui:30
+#. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (text), widget (QPushButton, search)
-#: devices/synccollectionwidget.cpp:53 gui/stdactions.cpp:92
-#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
+#: devices/synccollectionwidget.cpp:54 gui/mainwindow.cpp:323
+#: online/podcastsearchdialog.cpp:334 po/rc.cpp:404 rc.cpp:404
 msgid "Search"
 msgstr "찾기"
 
-#: devices/synccollectionwidget.cpp:62
+#: devices/synccollectionwidget.cpp:63
 msgid "Check Items"
 msgstr "항목 확인"
 
-#: devices/synccollectionwidget.cpp:64
+#: devices/synccollectionwidget.cpp:65
 msgid "Uncheck Items"
 msgstr "항목 확인 안 함"
 
-#: devices/synccollectionwidget.cpp:266
+#: devices/synccollectionwidget.cpp:272
 msgid "Nothing selected"
 msgstr "선택 안 됨"
 
@@ -1461,7 +1445,7 @@ msgstr "동기화"
 msgid "Device and library are in sync."
 msgstr "장치와 라이브러리가 동기화됨."
 
-#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:190
+#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:188
 msgid "Not Scanned"
 msgstr "검색 안 됨"
 
@@ -1469,91 +1453,91 @@ msgstr "검색 안 됨"
 msgid " (recommended)"
 msgstr " (추천)"
 
-#: dynamic/dynamic.cpp:208
+#: dynamic/dynamic.cpp:215
 msgid "Start Dynamic Playlist"
 msgstr "동적 연주목록 시작"
 
-#: dynamic/dynamic.cpp:209
+#: dynamic/dynamic.cpp:216
 msgid "Stop Dynamic Mode"
 msgstr "동적 방식 중지"
 
-#: dynamic/dynamic.cpp:257
+#: dynamic/dynamic.cpp:264
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "한 규정"
 msgstr[1] "%1 규정"
 
-#: dynamic/dynamic.cpp:396
+#: dynamic/dynamic.cpp:403
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr "칸타타의 동적 모드를 작동하려면 \"perl\"을 시스템에 설치해야 합니다."
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:410
 msgid "Failed to locate rules file - %1"
 msgstr "규정 파일을 찾을 수 없음 - %1"
 
-#: dynamic/dynamic.cpp:411
+#: dynamic/dynamic.cpp:418
 msgid "Failed to remove previous rules file - %1"
 msgstr "이전 규정 파일을 지울 수 없음 - %1"
 
-#: dynamic/dynamic.cpp:416
+#: dynamic/dynamic.cpp:423
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "규정 파일을 설치할 수 없음 - %1 -> %2"
 
-#: dynamic/dynamic.cpp:729
+#: dynamic/dynamic.cpp:736
 msgid "Dynamizer has been terminated."
 msgstr "활동이 중지됨."
 
-#: dynamic/dynamic.cpp:816
+#: dynamic/dynamic.cpp:823 mpd/mpdconnection.cpp:150
 msgid "Uknown"
 msgstr "알 수 없음"
 
-#: dynamic/dynamic.cpp:818
+#: dynamic/dynamic.cpp:825
 msgid "Loading list of rules"
 msgstr "규정 리스트를 읽음"
 
-#: dynamic/dynamic.cpp:819
+#: dynamic/dynamic.cpp:826
 msgid "Saving rule"
 msgstr "규정 저장"
 
-#: dynamic/dynamic.cpp:820
+#: dynamic/dynamic.cpp:827
 msgid "Deleting rule"
 msgstr "규정 지우기"
 
-#: dynamic/dynamic.cpp:821
+#: dynamic/dynamic.cpp:828
 msgid "Setting active rule"
-msgstr "활성화 규정 설정"
+msgstr "선택 규정 설정"
 
-#: dynamic/dynamic.cpp:822
+#: dynamic/dynamic.cpp:829
 msgid "Stopping dynamizer"
 msgstr "활동 중지"
 
-#: dynamic/dynamic.cpp:823
+#: dynamic/dynamic.cpp:830
 msgid "Requesting ID details"
 msgstr "ID 상세정보 요청 중"
 
-#: dynamic/dynamic.cpp:826
+#: dynamic/dynamic.cpp:833
 msgid "Awaiting response for previous command. (%1)"
 msgstr "이전 명령어 응답 대기 중. (%1)"
 
-#: dynamic/dynamic.cpp:981
+#: dynamic/dynamic.cpp:988
 msgid "Dynamizer is not active"
-msgstr "활동 활성화 안 됨"
+msgstr "활동 선택 안 됨"
 
-#: dynamic/dynamic.cpp:989
+#: dynamic/dynamic.cpp:996
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "동적 규정 리스트 읽기 안 됨. (%1)"
 
-#: dynamic/dynamic.cpp:1020
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to delete rules file. (%1)"
 msgstr "규정 파일 지워지지 않음. (%1)"
 
-#: dynamic/dynamic.cpp:1027
+#: dynamic/dynamic.cpp:1034
 msgid "Failed to control dynamizer state. (%1)"
-msgstr "활동 활성화 상태 관리 안 됨. (%1)"
+msgstr "활동 상태 관리 안 됨. (%1)"
 
-#: dynamic/dynamic.cpp:1036
+#: dynamic/dynamic.cpp:1043
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "현재 동적 규정 설정 안 됨. (%1)"
 
@@ -1569,11 +1553,11 @@ msgstr "동적 규정 추가"
 msgid "Edit Dynamic Rules"
 msgstr "동적 규정 수정"
 
-#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:151
+#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:150
 msgid "Remove Dynamic Rules"
 msgstr "동적 규정 지우기"
 
-#: dynamic/dynamicpage.cpp:150
+#: dynamic/dynamicpage.cpp:149
 msgid ""
 "Are you sure you wish to remove the selected rules?\n"
 "This cannot be undone."
@@ -1587,15 +1571,15 @@ msgstr "동적 규정"
 
 #. i18n: file: dynamic/dynamicrules.ui:53
 #. i18n: ectx: property (text), widget (QPushButton, addBtn)
-#: dynamic/dynamicruledialog.cpp:136 po/rc.cpp:280 rc.cpp:280
+#: dynamic/dynamicruledialog.cpp:145 po/rc.cpp:341 rc.cpp:341
 msgid "Add"
 msgstr "추가"
 
-#: dynamic/dynamicruledialog.cpp:202
+#: dynamic/dynamicruledialog.cpp:211
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr "<i><b>오류</b>: '시작 연도'는 '마지막 연도'보다 작아야 합니다</i>"
 
-#: dynamic/dynamicruledialog.cpp:205
+#: dynamic/dynamicruledialog.cpp:214
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1610,27 +1594,27 @@ msgstr "비슷한 연주자"
 msgid "AlbumArtist"
 msgstr "음반연주자"
 
-#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: file: devices/filenameschemedialog.ui:102
 #. i18n: ectx: property (text), widget (QPushButton, composer)
-#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:212 rc.cpp:212
 msgid "Composer"
 msgstr "작곡가"
 
-#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:48
+#: models/playqueuemodel.cpp:107 replaygain/rgdialog.cpp:129
 msgid "Album"
 msgstr "음반"
 
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:106
-#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:112
+#: po/rc.cpp:254 po/rc.cpp:380 rc.cpp:254 rc.cpp:380
 msgid "Genre"
 msgstr "장르"
 
@@ -1699,86 +1683,85 @@ msgstr "규정 덮어쓰기"
 msgid "Saving %1"
 msgstr "%1로 저장함"
 
-#: gui/cachesettings.cpp:168
+#: gui/cachesettings.cpp:173
 msgid "Deleting..."
 msgstr "지우는 중..."
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Name"
 msgstr "이름"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Item Count"
 msgstr "항목 수"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Space Used"
 msgstr "사용 공간"
 
-#: gui/cachesettings.cpp:234
+#: gui/cachesettings.cpp:239
 msgid "Total space used: %1"
 msgstr "전체사용공간: %1"
 
-#: gui/cachesettings.cpp:245
+#: gui/cachesettings.cpp:250
 msgid ""
-"To speed up loading of the music library, Cantata caches a local copy of the "
-"MPD listing. Cantata might also have cached covers, or lyrics, if these have "
-"been downloaded and could not be saved into the MPD folder (because Cantata "
-"cannot access it, or you have configured Cantata to not save these items "
-"there). Below is a summary of Cantata's cache usage."
+"Cantata caches a local copy of the MPD listing to speed up loading of the "
+"music library. Cantata might also have cached covers, lyrics, or artist "
+"images, if these have been downloaded and could not be saved into the MPD "
+"folder (because Cantata cannot access it, or you have configured Cantata to "
+"not save these items there). Below is a summary of Cantata's current cache "
+"usage."
 msgstr ""
-"음악라이브러리를 빨리 읽기 위해서, 칸타타는 MPD 목록의 로컬 복사본을 캐시에 "
-"저장합니다. 저장된 음반표지나 가사를 캐시에 저장할 수도 있는데, 저장하였으나 "
-"MPD 폴더에 저장되지 않은 경우입니다 (이것은 접근할 수 없거나, MPD 폴더에 저장"
-"하지 않도록 설정한 경우입니다). 아래는 캐시를 사용한 내역입니다."
+"칸타타가 음악라이브러리를 빨리 읽기 위해서, MPD 목록의 로컬 복사본을 캐시에 "
+"저장합니다. 또한 음반표지나 가사, 연주자 이미지도 캐시에 저장할 수 있는데, "
+"이는 내려받았으나 MPD 폴더에 저장되지 못한 경우입니다 (접근할 수 없거나, 저장"
+"하지 않도록 설정해서입니다). 아래는 캐시를 사용한 내역입니다."
 
-#: gui/cachesettings.cpp:257
+#: gui/cachesettings.cpp:263
 msgid "Covers"
 msgstr "음반표지"
 
-#: gui/cachesettings.cpp:258
+#: gui/cachesettings.cpp:264
+msgid "Scaled Covers"
+msgstr "비율표지"
+
+#: gui/cachesettings.cpp:265
 msgid "Backdrops"
 msgstr "배경"
 
-#: gui/cachesettings.cpp:263 gui/interfacesettings.cpp:167
-#: gui/mainwindow.cpp:283 gui/preferencesdialog.cpp:85
-#: widgets/groupedview.cpp:256
-msgid "Streams"
-msgstr "스트림"
+#: gui/cachesettings.cpp:271
+msgid "Stream Listings"
+msgstr "스트림 목록"
 
-#: gui/cachesettings.cpp:264
+#: gui/cachesettings.cpp:274
 msgid "Jamendo"
 msgstr "자멘도(Jamendo)"
 
-#: gui/cachesettings.cpp:265
+#: gui/cachesettings.cpp:275
 msgid "Magnatune"
 msgstr "매그나튠(Magnatune)"
 
-#: gui/cachesettings.cpp:266
+#: gui/cachesettings.cpp:276
 msgid "Podcast Directories"
 msgstr "팟캐스트 디렉터리"
 
-#: gui/cachesettings.cpp:273
+#: gui/cachesettings.cpp:285
 msgid "Delete All"
 msgstr "모두 지우기"
 
-#: gui/cachesettings.cpp:312
+#: gui/cachesettings.cpp:324
 msgid "Delete all '%1' items?"
 msgstr "'%1' 항목을 모두 지울까요?"
 
-#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
+#: gui/cachesettings.cpp:325 gui/cachesettings.cpp:335
 msgid "Delete Cache Items"
 msgstr "캐시항목을 지웁니다"
 
-#: gui/cachesettings.cpp:322
+#: gui/cachesettings.cpp:334
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr "<p>아래 전부를 지웁니까?<ul>%1</ul></p>"
 
-#: gui/coverdialog.cpp:151 gui/main.cpp:231
-msgid "Last.fm"
-msgstr "Last.fm"
-
-#: gui/coverdialog.cpp:165
+#: gui/coverdialog.cpp:124
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1789,53 +1772,39 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:184
-msgctxt ""
-"Google\n"
-"width x height (file size)"
-msgid ""
-"Google\n"
-"%1 x %2 (%3)"
-msgstr ""
-"Google\n"
-"%1 x %2 (%3)"
-
-#: gui/coverdialog.cpp:204
+#: gui/coverdialog.cpp:126
 msgctxt ""
-"Discogs\n"
+"name\n"
 "width x height"
 msgid ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 msgstr ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 
-#: gui/coverdialog.cpp:238
-msgctxt ""
-"Current Cover\n"
-"width x height"
-msgid ""
-"Current Cover\n"
-"%1 x %2"
-msgstr ""
-"현재 표지\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:162
+msgid "Current Cover"
+msgstr "현재 표지"
+
+#: gui/coverdialog.cpp:211 gui/coverdialog.cpp:411
+msgid "CoverArt Archive"
+msgstr "음반표지 보관"
 
-#: gui/coverdialog.cpp:256
+#: gui/coverdialog.cpp:242
 msgid "Image"
 msgstr "이미지"
 
-#: gui/coverdialog.cpp:259
+#: gui/coverdialog.cpp:245
 msgid "Downloading..."
 msgstr "내려받는 중..."
 
-#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
+#: gui/coverdialog.cpp:290 gui/coverdialog.cpp:325
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "이미지 (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:446
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
@@ -1843,20 +1812,23 @@ msgstr ""
 "<p>이 연주자의 이미지가 이미 존재하므로 파일 쓰기가 되지 않습니다.<p></p><i>"
 "%1</i></p>"
 
-#: gui/coverdialog.cpp:433
+#: gui/coverdialog.cpp:447
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
 msgstr ""
 "<p>이 음반의 표지가 이미 있는데, 쓰기가 되지 않습니다.<p></p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:440 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:234
-msgctxt "Album by Artist"
-msgid "%1 by %2"
-msgstr "%2의 %1"
+#: gui/coverdialog.cpp:452
+msgid "'%1' Artist Image"
+msgstr "%1 연주자 이미지"
+
+#: gui/coverdialog.cpp:454
+msgctxt "'Artist - Album' Album Cover"
+msgid "'%1 - %2' Album Cover"
+msgstr "'%1 - %2' 음반표지"
 
-#: gui/coverdialog.cpp:579
+#: gui/coverdialog.cpp:582
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1864,27 +1836,23 @@ msgstr ""
 "표지 설정에 실패함!\n"
 "임시 파일에 내려받을 수 없음!"
 
-#: gui/coverdialog.cpp:607
+#: gui/coverdialog.cpp:616
 msgid "Failed to download image!"
 msgstr "이미지를 내려받을 수 없음!"
 
-#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
+#: gui/coverdialog.cpp:875 gui/coverdialog.cpp:877
 msgid "Load Local Cover"
 msgstr "로컬 표지 읽음"
 
-#: gui/coverdialog.cpp:795
-msgid "Images (*.png *.jpg)"
-msgstr "이미지 (*.png *.jpg)"
-
-#: gui/coverdialog.cpp:800
+#: gui/coverdialog.cpp:882
 msgid "File is already in list!"
 msgstr "파일이 이미 목록에 있음!"
 
-#: gui/coverdialog.cpp:804
+#: gui/coverdialog.cpp:886
 msgid "Failed to read image!"
 msgstr "이미지를 읽을 수 없음!"
 
-#: gui/coverdialog.cpp:817
+#: gui/coverdialog.cpp:899
 msgid "Display"
 msgstr "보이기"
 
@@ -1896,12 +1864,12 @@ msgstr "보이기"
 #. i18n: ectx: property (text), widget (QPushButton, removeBtn)
 #. i18n: file: streams/streamssettings.ui:73
 #. i18n: ectx: property (text), widget (QPushButton, removeButton)
-#: gui/coverdialog.cpp:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
-#: rc.cpp:286 rc.cpp:765
+#: gui/coverdialog.cpp:900 gui/stdactions.cpp:90 po/rc.cpp:347 po/rc.cpp:917
+#: rc.cpp:347 rc.cpp:917
 msgid "Remove"
 msgstr "지우기"
 
-#: gui/coverdialog.cpp:1181
+#: gui/coverdialog.cpp:1333
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1909,7 +1877,7 @@ msgstr ""
 "표지를 설정할 수 없음!\n"
 "복사할 수 수 없음!"
 
-#: gui/coverdialog.cpp:1190
+#: gui/coverdialog.cpp:1342
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1917,7 +1885,7 @@ msgstr ""
 "표지를 설정할 수 없음!\n"
 "원본을 백업할 수 없음!"
 
-#: gui/coverdialog.cpp:1239
+#: gui/coverdialog.cpp:1391
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1925,263 +1893,354 @@ msgstr ""
 "표지를 설정할 수 없음!\n"
 "'%1'에 복사할 수 없음!"
 
-#: gui/folderpage.cpp:45
+#: gui/coverdialog.cpp:1449 models/onlineservicesmodel.cpp:157
+msgid "Searching..."
+msgstr "찾기..."
+
+#: gui/folderpage.cpp:44
 msgid "Open In File Manager"
 msgstr "파일관리자 열기"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Established"
 msgstr "연결됨"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Failed"
 msgstr "연결 안 됨"
 
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
+#. i18n: file: support/shortcutssettingswidget.ui:78
+#. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
 #. i18n: file: support/shortcutssettingswidget.ui:78
 #. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
-#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
-#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
+#: gui/interfacesettings.cpp:48 gui/playbacksettings.cpp:46
+#: online/magnatuneservice.cpp:159 po/rc.cpp:6 po/rc.cpp:660 po/rc.cpp:751
+#: po/rc.cpp:778 po/rc.cpp:932 rc.cpp:6 rc.cpp:660 rc.cpp:751 rc.cpp:778
+#: rc.cpp:932
 msgid "None"
 msgstr "없음"
 
-#: gui/interfacesettings.cpp:40
+#: gui/interfacesettings.cpp:49 gui/interfacesettings.cpp:160
 msgid "Small"
 msgstr "작게"
 
-#: gui/interfacesettings.cpp:41
+#: gui/interfacesettings.cpp:50
 msgid "Medium"
 msgstr "보통"
 
-#: gui/interfacesettings.cpp:42
+#: gui/interfacesettings.cpp:51 gui/interfacesettings.cpp:159
 msgid "Large"
 msgstr "크게"
 
-#: gui/interfacesettings.cpp:43
+#: gui/interfacesettings.cpp:52
 msgid "Extra Large"
 msgstr "아주 크게"
 
-#: gui/interfacesettings.cpp:48
+#: gui/interfacesettings.cpp:57
+msgid "Basic Tree (No Icons)"
+msgstr "기본 나무 모양 (아이콘 없음)"
+
+#: gui/interfacesettings.cpp:58
 msgid "Simple Tree"
 msgstr "단순 나무 모양"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:59
 msgid "Detailed Tree"
 msgstr "상세 나무 모양"
 
-#. i18n: file: gui/interfacesettings.ui:329
+#. i18n: file: gui/interfacesettings.ui:449
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
+#: gui/interfacesettings.cpp:61 po/rc.cpp:639 rc.cpp:639
 msgid "Grouped Albums"
 msgstr "앨범으로 묶음"
 
-#: gui/interfacesettings.cpp:53
+#: gui/interfacesettings.cpp:63
 msgid "List"
 msgstr "목록"
 
-#: gui/interfacesettings.cpp:55
+#: gui/interfacesettings.cpp:65
 msgid "Icon/List"
 msgstr "아이콘/목록"
 
-#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+#. i18n: file: gui/interfacesettings.ui:454
+#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
+#: gui/interfacesettings.cpp:68 po/rc.cpp:642 rc.cpp:642
+msgid "Table"
+msgstr "항목으로 따로"
+
+#: gui/interfacesettings.cpp:104
+msgid "Play queue"
+msgstr "연주순서"
+
+#. i18n: file: gui/interfacesettings.ui:182
+#. i18n: ectx: attribute (title), widget (QWidget, tab)
+#: gui/interfacesettings.cpp:105 gui/mainwindow.cpp:307 po/rc.cpp:569
+#: rc.cpp:569
+msgid "Artists"
+msgstr "연주자"
+
+#: gui/interfacesettings.cpp:107 gui/interfacesettings.cpp:138
+#: gui/mainwindow.cpp:309
 msgid "Folders"
 msgstr "폴더"
 
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:337
+#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
+#: gui/interfacesettings.cpp:108 gui/mainwindow.cpp:310 po/rc.cpp:609
+#: rc.cpp:609
+msgid "Playlists"
+msgstr "연주목록"
+
+#: gui/interfacesettings.cpp:110
+msgid "Dynamic Playlists"
+msgstr "동적 연주목록"
+
+#: gui/interfacesettings.cpp:114
+msgid "Streams (e.g. Radio Stations)"
+msgstr "스트림 (예, 라디오 방송국)"
+
+#: gui/interfacesettings.cpp:121
+msgid "Online Services - Jamendo, Maganatune, SoundCloud, and Podcasts"
+msgstr "온라인 서비스 - Jamendo, Maganatune, SoundCloud, Podcasts"
+
+#: gui/interfacesettings.cpp:128
+msgid "Devices - UMS, MTP (e.g. Android), and AudioCDs"
+msgstr "장치 - UMS, MTP (예, 안드로이드), 오디오CD"
+
+#: gui/interfacesettings.cpp:134
+msgid "Search (via MPD)"
+msgstr "찾기 (MPD를 통해서)"
+
+#: gui/interfacesettings.cpp:135
+msgid "Info - Current song information (artist, album, and lyrics)"
+msgstr "정보 - 현재 곡 정보 (연주자, 음반, 가사)"
+
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#: gui/interfacesettings.cpp:165 gui/interfacesettings.cpp:168
-#: gui/interfacesettings.cpp:171 gui/interfacesettings.cpp:174 po/rc.cpp:472
-#: po/rc.cpp:491 po/rc.cpp:512 po/rc.cpp:536 rc.cpp:472 rc.cpp:491 rc.cpp:512
-#: rc.cpp:536
+#: gui/interfacesettings.cpp:139 po/rc.cpp:554 po/rc.cpp:572 po/rc.cpp:591
+#: po/rc.cpp:612 po/rc.cpp:636 rc.cpp:554 rc.cpp:572 rc.cpp:591 rc.cpp:612
+#: rc.cpp:636
 msgid "Style:"
 msgstr "방식:"
 
-#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
-#: gui/preferencesdialog.cpp:89
-msgid "Online"
-msgstr "온라인"
+#: gui/interfacesettings.cpp:161
+msgid "Tab-bar"
+msgstr "꼬리표"
 
-#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
-msgid "Devices"
-msgstr "장치"
+#: gui/interfacesettings.cpp:162
+msgid "Left"
+msgstr "왼쪽"
 
-#: gui/interfacesettings.cpp:178
-msgid "Grouped by 'Album Artist'"
-msgstr "'음반연주자'로 묶음"
+#: gui/interfacesettings.cpp:162
+msgid "Right"
+msgstr "오른쪽"
 
-#: gui/interfacesettings.cpp:179
-msgid "Grouped under 'Various Artists'"
-msgstr "'여러 연주자'로 묶음"
+#: gui/interfacesettings.cpp:163
+msgid "Top"
+msgstr "위"
+
+#: gui/interfacesettings.cpp:164
+msgid "Bottom"
+msgstr "아래"
+
+#: gui/interfacesettings.cpp:391
+msgid "System default"
+msgstr "시스템 기본값"
 
-#: gui/main.cpp:213 gui/mainwindow.cpp:1941 gui/trayitem.cpp:98
-#: gui/trayitem.cpp:100 gui/trayitem.cpp:135 gui/trayitem.cpp:199
-#: gui/trayitem.cpp:209 gui/trayitem.cpp:212 gui/trayitem.cpp:215
-#: gui/trayitem.cpp:228 gui/trayitem.cpp:230
+#: gui/main.cpp:224 gui/mainwindow.cpp:2075 gui/trayitem.cpp:112
+#: gui/trayitem.cpp:118 gui/trayitem.cpp:153 gui/trayitem.cpp:217
+#: gui/trayitem.cpp:227 gui/trayitem.cpp:230 gui/trayitem.cpp:233
+#: gui/trayitem.cpp:246 gui/trayitem.cpp:248
 msgid "Cantata"
 msgstr "칸타타"
 
-#: gui/main.cpp:214
+#: gui/main.cpp:225
 msgid "A KDE client for MPD"
 msgstr "MPD의 KDE 클라이언트"
 
-#: gui/main.cpp:216
-msgid "Copyright (c) 2011–2013 Craig Drummond"
-msgstr "Copyright (c) 2011–2013 Craig Drummond"
+#: gui/main.cpp:227
+msgid "© 2011-2014 Craig Drummond"
+msgstr "© 2011-2014 Craig Drummond"
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Maintainer"
 msgstr "유지"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "UI Improvements"
 msgstr "사용자 인터페이스 개선"
 
-#: gui/main.cpp:222
+#: gui/main.cpp:233
 msgid "Sander Knopper"
 msgstr "Sander Knopper"
 
-#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
+#: gui/main.cpp:233 gui/main.cpp:234 gui/main.cpp:235 gui/main.cpp:236
 msgid "QtMPC author"
 msgstr "QtMPC 개발자"
 
-#: gui/main.cpp:223
+#: gui/main.cpp:234
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:224
+#: gui/main.cpp:235
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:225
+#: gui/main.cpp:236
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr "찾아보기 배경 (나만의 음악 팬아트를 fanart.tv에 올려주셔요)"
 
-#: gui/main.cpp:230
+#: gui/main.cpp:238
 msgid "Wikipedia"
 msgstr "위키피디아"
 
-#: gui/main.cpp:230 gui/main.cpp:231
+#: gui/main.cpp:238 gui/main.cpp:239
 msgid "Context view metadata"
 msgstr "찾아보기 자료"
 
-#: gui/main.cpp:235
+#: gui/main.cpp:239
+msgid "Last.fm"
+msgstr "Last.fm"
+
+#: gui/main.cpp:243
 msgid "URL to open"
 msgstr "URL 열기"
 
-#: gui/mainwindow.cpp:238
+#: gui/mainwindow.cpp:269
 msgid "Quit"
 msgstr "나가기"
 
-#: gui/mainwindow.cpp:242
+#: gui/mainwindow.cpp:273
 msgid "Show Window"
 msgstr "창 보기"
 
 #. i18n: file: gui/initialsettingswizard.ui:469
 #. i18n: ectx: property (text), widget (QPushButton, connectButton)
-#: gui/mainwindow.cpp:245 po/rc.cpp:418 rc.cpp:418
+#: gui/mainwindow.cpp:276 po/rc.cpp:482 rc.cpp:482
 msgid "Connect"
 msgstr "연결"
 
-#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
+#: gui/mainwindow.cpp:277 gui/preferencesdialog.cpp:83
 msgid "Collection"
 msgstr "음원"
 
-#: gui/mainwindow.cpp:247
+#: gui/mainwindow.cpp:278
 msgid "Outputs"
 msgstr "출력"
 
-#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
+#: gui/mainwindow.cpp:279 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "곡 다음 정지"
 
-#: gui/mainwindow.cpp:249
+#: gui/mainwindow.cpp:280
 msgid "Add To Stored Playlist"
 msgstr "저장된 연주목록에 추가"
 
-#: gui/mainwindow.cpp:250
+#: gui/mainwindow.cpp:281
 msgid "Remove From Play Queue"
 msgstr "연주순서 지우기"
 
-#: gui/mainwindow.cpp:251
+#: gui/mainwindow.cpp:282
 msgid "Copy Track Info"
 msgstr "곡 정보복사"
 
-#: gui/mainwindow.cpp:252
+#: gui/mainwindow.cpp:283
 msgid "Crop"
 msgstr "잘라내기"
 
-#: gui/mainwindow.cpp:253
+#: gui/mainwindow.cpp:284
 msgid "Shuffle Tracks"
 msgstr "곡 섞기"
 
-#: gui/mainwindow.cpp:254
+#: gui/mainwindow.cpp:285
 msgid "Shuffle Albums"
 msgstr "음반 섞기"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:286
 msgid "Add Stream URL"
 msgstr "스트림 URL 추가"
 
-#: gui/mainwindow.cpp:256
+#: gui/mainwindow.cpp:287
 msgid "Clear"
 msgstr "지우기"
 
-#: gui/mainwindow.cpp:257
+#: gui/mainwindow.cpp:288
 msgid "Expanded Interface"
 msgstr "넓게 보기"
 
-#: gui/mainwindow.cpp:258
+#: gui/mainwindow.cpp:289
 msgid "Show Current Song Information"
 msgstr "지금 곡 정보보기"
 
-#: gui/mainwindow.cpp:261
+#: gui/mainwindow.cpp:292
 msgid "Full Screen"
 msgstr "전체화면"
 
-#: gui/mainwindow.cpp:263
+#: gui/mainwindow.cpp:294
 msgid "Random"
 msgstr "무작위"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:295
 msgid "Repeat"
 msgstr "반복"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid "Single"
 msgstr "단일"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
@@ -2189,116 +2248,117 @@ msgstr ""
 "'단일'이 선택되면, 지금 곡 다음에 연주를 멈춥니다. '반복'이 선택되면, 곡은 반"
 "복됩니다."
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid "Consume"
 msgstr "소비"
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
-msgstr "소비가 활성화되면, 곡은 연주 후에 연주순서에서 없어집니다."
+msgstr "소비가 선택되면, 곡은 연주 후에 연주순서에서 없어집니다."
 
-#: gui/mainwindow.cpp:267
-msgid "Search Play Queue"
-msgstr "연주순서 찾기"
-
-#: gui/mainwindow.cpp:269
+#: gui/mainwindow.cpp:298
 msgid "Set Priority"
 msgstr "우선순위 설정"
 
-#: gui/mainwindow.cpp:271
+#: gui/mainwindow.cpp:300
 msgid "Play Stream"
 msgstr "스트림 연주"
 
-#: gui/mainwindow.cpp:273
+#: gui/mainwindow.cpp:302
 msgid "Locate In Library"
 msgstr "라이브러리 위치 찾기"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:304
 msgid "Edit Song Tags"
 msgstr "곡 태그수정"
 
-#. i18n: file: gui/interfacesettings.ui:304
+#. i18n: file: gui/interfacesettings.ui:429
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
+#: gui/mainwindow.cpp:306 po/rc.cpp:633 rc.cpp:633
 msgid "Play Queue"
 msgstr "연주순서"
 
-#. i18n: file: gui/interfacesettings.ui:27
-#. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
-msgid "Artists"
-msgstr "연주자"
-
-#. i18n: file: gui/interfacesettings.ui:202
-#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
-#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
-msgid "Playlists"
-msgstr "연주목록"
-
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:312
 msgid "Dynamic"
 msgstr "동적"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:315 gui/preferencesdialog.cpp:89
+#: widgets/groupedview.cpp:251
+msgid "Streams"
+msgstr "스트림"
+
+#: gui/mainwindow.cpp:318 gui/preferencesdialog.cpp:94
+msgid "Online"
+msgstr "온라인"
+
+#: gui/mainwindow.cpp:321
+msgid "Devices"
+msgstr "장치"
+
+#: gui/mainwindow.cpp:324
 msgid "Expand All"
 msgstr "전체확장"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:325
 msgid "Collapse All"
 msgstr "전체축소"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:326
 msgid "Remove All Songs"
 msgstr "모든 곡을 지움"
 
-#: gui/mainwindow.cpp:398
+#: gui/mainwindow.cpp:456
 msgid "Info"
 msgstr "정보"
 
-#: gui/mainwindow.cpp:405
-msgid "Auto Hide"
-msgstr "자동 숨김"
-
-#: gui/mainwindow.cpp:411
-msgid "Monochrome Icons"
-msgstr "단색 아이콘"
-
-#: gui/mainwindow.cpp:541
+#: gui/mainwindow.cpp:585
 msgid "Server information..."
 msgstr "서버정보..."
 
-#: gui/mainwindow.cpp:552
+#: gui/mainwindow.cpp:588
+msgid "Refresh Database"
+msgstr "데이터베이스 새로 읽기"
+
+#: gui/mainwindow.cpp:602
 msgid "Configure Cantata..."
 msgstr "칸타타 설정..."
 
-#: gui/mainwindow.cpp:559
+#: gui/mainwindow.cpp:612
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "칸타타에 대하여..."
 
-#: gui/mainwindow.cpp:571
+#: gui/mainwindow.cpp:624
 msgid "&File"
 msgstr "파일(&F)"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:628
+msgid "&Edit"
+msgstr "수정(&E)"
+
+#: gui/mainwindow.cpp:631
 msgid "&Settings"
 msgstr "설정(&S)"
 
-#: gui/mainwindow.cpp:589 support/dialog.cpp:97
+#: gui/mainwindow.cpp:646 support/dialog.cpp:81
 msgid "&Help"
 msgstr "도움말(&H)"
 
-#: gui/mainwindow.cpp:948
+#: gui/mainwindow.cpp:1035
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr "동적 연주목록 규정에 맞는 음악을 찾지 못했습니다."
 
-#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
+#: gui/mainwindow.cpp:1157 mpd/mpdconnection.cpp:401
 msgid "Connecting to %1"
 msgstr "%1에 연결"
 
-#: gui/mainwindow.cpp:1151
+#: gui/mainwindow.cpp:1189
+msgid "Refresh MPD Database?"
+msgstr "MPD 데이터베이스를 새로 읽을까요?"
+
+#: gui/mainwindow.cpp:1257
 msgid ""
 "Podcasts are currently being downloaded\n"
 "\n"
@@ -2308,42 +2368,42 @@ msgstr ""
 "\n"
 "지금 취소하면 모든 내려받기를 그만둡니다."
 
-#: gui/mainwindow.cpp:1152
+#: gui/mainwindow.cpp:1258
 msgid "Abort downloads and quit"
 msgstr "내려받기를 그만두고 취소"
 
-#: gui/mainwindow.cpp:1447
+#: gui/mainwindow.cpp:1577
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "칸타타에 대하여"
 
-#: gui/mainwindow.cpp:1448
+#: gui/mainwindow.cpp:1578
 msgctxt "Qt-only"
 msgid ""
-"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html"
-"\">GPLv3</a>"
+"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl."
+"html\">GPLv3</a>"
 msgstr ""
-"<b>칸타타 %1</b><br/><br/>MPD 클라이언트.<br/><br/>(c) Craig Drummond "
-"2011-2013.<br/><a href=\"http://www.gnu.org/licenses/gpl.html\">GPLv3</a>에 "
-"따라 배포"
+"<b>칸타타 %1</b><br/><br/>MPD 클라이언트.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/><a href=\"http://www.gnu.org/licenses/gpl.html\">GPLv3</a>에 따"
+"라 배포"
 
-#: gui/mainwindow.cpp:1450
+#: gui/mainwindow.cpp:1580
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
-"QtMPC Authors<br/>"
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"The QtMPC Authors<br/>"
 msgstr ""
-"<a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> 기반 - (c) 2007-2010 QtMPC 개발자"
-"<br/>"
+"<a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> 기반 - © 2007-2010 QtMPC "
+"개발자<br/>"
 
-#: gui/mainwindow.cpp:1451
+#: gui/mainwindow.cpp:1581
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 msgstr "찾아보기 배경 도움은 <a href=\"http://www.fanart.tv\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1452
+#: gui/mainwindow.cpp:1582
 msgctxt "Qt-only"
 msgid ""
 "Context view metadata courtesy of <a href=\"http://www.wikipedia.org"
@@ -2352,7 +2412,7 @@ msgstr ""
 "찾아보기 자료 도움은 <a href=\"http://www.wikipedia.org\">위키피디아</a> 와 "
 "<a href=\"http://www.last.fm\">Last.fm</a>"
 
-#: gui/mainwindow.cpp:1453
+#: gui/mainwindow.cpp:1583
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
@@ -2360,135 +2420,147 @@ msgstr ""
 "나만의 음악 팬아트를 올려주실 곳은 <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1594
 msgid ""
-"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Uptime:</td><td>%4</td></"
-"tr><tr><td align=\"right\">Time playing:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right"
+"\">Protocol version: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Uptime: </td><td>%4</td></tr><tr><td align=\"right"
+"\">Time playing: </td><td>%5</td></tr>"
 msgstr ""
-"<tr><td colspan=\"2\"><b>서버</b></td></tr><tr><td align=\"right\">버전:</"
-"td><td>%1.%2.%3</td></tr><tr><td align=\"right\">가동시간:</td><td>%4</td></"
-"tr><tr><td align=\"right\">연주시간:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>서버</b></td></tr><tr><td align=\"right"
+"\">프로토콜 버전: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">가동시간: </td><td>%4</td></tr><tr><td align=\"right"
+"\">연주시간: </td><td>%5</td></tr>"
 
-#: gui/mainwindow.cpp:1472
+#: gui/mainwindow.cpp:1602
 msgid ""
 "<tr><td colspan=\"2\"><b>Database</b></td></tr><tr><td align=\"right"
-"\">Artists:</td><td>%1</td></tr><tr><td align=\"right\">Albums:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Songs:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL handlers:</td><td>%4</td></tr><tr><td align=\"right\">Total "
-"duration:</td><td>%5</td></tr><tr><td align=\"right\">Last update:</td><td>"
-"%6</td></tr></table></p>"
+"\">Artists: </td><td>%1</td></tr><tr><td align=\"right\">Albums: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Songs: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Total duration: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Last update: </td><td>%6</td></tr></"
+"table></p>"
 msgstr ""
-"<tr><td colspan=\"2\"><b>데이터베이스</b></td></tr><tr><td align=\"right\">연"
-"주자:</td><td>%1</td></tr><tr><td align=\"right\">음반:</td><td>%2</td></"
-"tr><tr><td align=\"right\">곡:</td><td>%3</td></tr><tr><td align=\"right\">사"
-"용 URL:</td><td>%4</td></tr><tr><td align=\"right\">총 지속시간:</td><td>%5</"
-"td></tr><tr><td align=\"right\">최근 업데이트:</td><td>%6</td></tr></table></"
-"p>"
-
-#: gui/mainwindow.cpp:1481
+"<tr><td colspan=\"2\"><b>데이터베이스</b></td></tr><tr><td align=\"right"
+"\">연주자: </td><td>%1</td></tr><tr><td align=\"right\">음반: </"
+"td><td>%2</td></tr><tr><td align=\"right\">곡: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL 사용: </td><td>%4</td></"
+"tr><tr><td align=\"right\">총 지속시간: </td><td>%5</td></"
+"tr><tr><td align=\"right\">최근 업데이트: </td><td>%6</td></tr></"
+"table></p>"
+
+#: gui/mainwindow.cpp:1611
 msgid "Server Information"
 msgstr "서버정보"
 
-#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
+#: gui/mainwindow.cpp:1859 gui/mainwindow.cpp:1866
 msgid "Cantata (%1)"
 msgstr "칸타타 (%1)"
 
-#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
+#: gui/mainwindow.cpp:1862 gui/mainwindow.cpp:1869
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: 칸타타 (%2)"
 
-#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
+#: gui/mainwindow.cpp:1863 gui/mainwindow.cpp:1870
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: 칸타타"
 
-#: gui/mainwindow.cpp:1728
+#: gui/mainwindow.cpp:1874
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: 칸타타 (%3)"
 
-#: gui/mainwindow.cpp:1730
+#: gui/mainwindow.cpp:1876
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: 칸타타"
 
-#: gui/mainwindow.cpp:1773
+#: gui/mainwindow.cpp:1919
 msgid "(Stream)"
 msgstr "(스트림)"
 
-#: gui/mainwindow.cpp:1775
+#: gui/mainwindow.cpp:1921
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
+#: gui/mainwindow.cpp:1939 widgets/groupedview.cpp:278
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1843
+#: gui/mainwindow.cpp:1989 mpd/mpdconnection.cpp:543 mpd/mpdconnection.cpp:550
 msgid "MPD reported the following error: %1"
 msgstr "MPD가 다음 오류를 보고함: %1"
 
-#: gui/mainwindow.cpp:1990
+#: gui/mainwindow.cpp:2119
 msgid "Remove all songs from play queue?"
 msgstr "연주순서의 모든 곡을 지울까요?"
 
-#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
+#: gui/mainwindow.cpp:2210 models/playqueuemodel.cpp:113
 msgid "Priority"
 msgstr "우선순위"
 
-#: gui/mainwindow.cpp:2080
+#: gui/mainwindow.cpp:2210
 msgid "Enter priority (0..255):"
 msgstr "우선순위 입력 (0..255):"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Playlist Name"
 msgstr "연주목록 이름"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Enter a name for the playlist:"
 msgstr "연주목록 이름을 입력합니다:"
 
-#: gui/mainwindow.cpp:2106
+#: gui/mainwindow.cpp:2236
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr "연주목록 이름 <b>%1</b>이 이미 있습니다!<br/>연주목록에 추가할까요?"
 
-#: gui/mainwindow.cpp:2107
+#: gui/mainwindow.cpp:2237
 msgid "Existing Playlist"
 msgstr "이미 있는 연주목록"
 
-#: gui/playbacksettings.cpp:42
-msgid "Do not fadeout"
-msgstr "페이드아웃 안 함"
+#: gui/mainwindow.cpp:2303
+msgid "Stream URL"
+msgstr "스트림 URL"
 
-#: gui/playbacksettings.cpp:43
-msgid " ms"
-msgstr " ms"
+#: gui/mainwindow.cpp:2303
+msgid "Enter URL of stream:"
+msgstr "스트림 URL 입력:"
+
+#: gui/mainwindow.cpp:2306
+msgid "Invalid, or unsupported, URL!"
+msgstr "사용할 수 없거나, 지원하지 않는 URL!"
 
-#. i18n: file: devices/albumdetails.ui:165
+#: gui/mainwindow.cpp:2889
+msgid "Can only edit tags of songs within MPD's music collection."
+msgstr "MPD 음원에 있는 곡의 태그만 수정할 수 있습니다."
+
+#. i18n: file: devices/albumdetails.ui:158
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
-#: gui/playbacksettings.cpp:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
-#: rc.cpp:79
+#: gui/playbacksettings.cpp:47 models/playqueuemodel.cpp:108 po/rc.cpp:110
+#: rc.cpp:110
 msgid "Track"
 msgstr "곡"
 
-#: gui/playbacksettings.cpp:51
+#: gui/playbacksettings.cpp:49
 msgid "Auto"
 msgstr "자동"
 
-#: gui/playbacksettings.cpp:164
+#: gui/playbacksettings.cpp:161
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
 msgstr ""
 "<i><b>%1에 연결</b><br/>아래 목록들은 지금 연결된 MPD 음원에 적용됩니다.</i>"
 
-#. i18n: file: gui/playbacksettings.ui:26
+#. i18n: file: gui/playbacksettings.ui:114
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
+#: gui/playbacksettings.cpp:164 po/rc.cpp:769 rc.cpp:769
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
@@ -2496,7 +2568,7 @@ msgstr ""
 "<i><b>연결 안 됨!</b><br/>칸타타가 MPD에 연결되지 않았으므로 아래 목록은 수정"
 "되지 않습니다.</i>"
 
-#: gui/playbacksettings.cpp:174
+#: gui/playbacksettings.cpp:171
 msgid ""
 "<p>Replay Gain is a proposed standard published in 2001 to normalize the "
 "perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It "
@@ -2517,11 +2589,19 @@ msgstr ""
 "이용하여 음량을 조정함.</li><li><i>자동</i> - 무작위연주는 곡의 리플레이게인 "
 "태그를, 그 밖은 음반의 태그를 이용하여 음량을 조정함.</li></ul></p>"
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:95 widgets/playqueueview.cpp:160
+msgid "Stretch Columns To Fit Window"
+msgstr "칸을 늘려 윈도에 맞추기"
+
+#: gui/playlistspage.cpp:146 tags/tageditor.cpp:828 tags/trackorganiser.cpp:72
 msgid "Rename"
 msgstr "이름 바꾸기"
 
-#: gui/playlistspage.cpp:190
+#: gui/playlistspage.cpp:147 models/playqueuemodel.cpp:156
+msgid "Remove Duplicates"
+msgstr "중복 지우기"
+
+#: gui/playlistspage.cpp:309
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2529,129 +2609,187 @@ msgstr ""
 "선택된 연주목록을 지울까요?\n"
 "돌이킬 수 없습니다."
 
-#: gui/playlistspage.cpp:191
+#: gui/playlistspage.cpp:310
 msgid "Remove Playlists"
 msgstr "연주목록 지움"
 
-#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
+#: gui/playlistspage.cpp:330 gui/playlistspage.cpp:357
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr "연주목록 이름 <b>%1</b>은 이미 있습니다!<br/>덮어쓸까요?"
 
-#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
+#: gui/playlistspage.cpp:331 gui/playlistspage.cpp:358
 msgid "Overwrite Playlist"
 msgstr "연주목록을 덮어씀"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Rename Playlist"
 msgstr "연주목록 이름 바꾸기"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Enter new name for playlist:"
 msgstr "새로운 연주목록을 입력합니다:"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/playlistspage.cpp:446
+msgid "Cannot add songs from '%1' to '%2'"
+msgstr "'%1'에서 '%2'로 곡을 추가할 수 없음"
+
+#: gui/preferencesdialog.cpp:83
 msgid "Collection Settings"
 msgstr "음원 설정"
 
-#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: file: gui/playbacksettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
+#: gui/preferencesdialog.cpp:84 po/rc.cpp:742 rc.cpp:742
 msgid "Playback"
 msgstr "연주"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:84
 msgid "Playback Settings"
 msgstr "연주 설정"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "Files"
 msgstr "파일"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "File Settings"
 msgstr "파일 설정"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface"
 msgstr "인터페이스"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface Settings"
 msgstr "인터페이스 설정"
 
-#: gui/preferencesdialog.cpp:85
+#: gui/preferencesdialog.cpp:89
 msgid "Streams Settings"
 msgstr "스트림 설정"
 
-#: gui/preferencesdialog.cpp:89
+#: gui/preferencesdialog.cpp:94
 msgid "Online Providers"
-msgstr "온라인제공자"
+msgstr "온라인서비스제공자"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context"
 msgstr "찾아보기"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context View Settings"
 msgstr "찾아보기 설정"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server"
 msgstr "HTTP 서버"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server Settings"
 msgstr "HTTP 서버 설정"
 
-#: gui/preferencesdialog.cpp:103
+#: gui/preferencesdialog.cpp:115
 msgid "Audio CD Settings"
 msgstr "오디오 CD 설정"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgid "Proxy"
 msgstr "프락시"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "프락시 설정"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "단축키"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "키보드 단축키 설정"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cache"
 msgstr "캐시"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cached Items"
 msgstr "캐시항목"
 
-#: gui/preferencesdialog.cpp:116
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#: gui/preferencesdialog.cpp:128 po/rc.cpp:53 po/rc.cpp:65 po/rc.cpp:410
+#: rc.cpp:53 rc.cpp:65 rc.cpp:410
 msgid "Configure"
 msgstr "설정"
 
-#: gui/serversettings.cpp:87
-msgid ""
-"<i> This folder will also be used to locate music files for transferring to "
-"(and from) devices.</i>"
-msgstr ""
-"<i> 이 폴더는 장치로(부터) 전송하는 음악파일을 찾는데에도 사용됩니다.</i>"
-
-#: gui/serversettings.cpp:100
-msgid "Not used"
-msgstr "사용 안 됨"
-
-#. i18n: file: devices/remotedevicepropertieswidget.ui:75
-#. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2)
-#. i18n: file: devices/remotedevicepropertieswidget.ui:292
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#: gui/searchpage.cpp:200 po/rc.cpp:89 po/rc.cpp:371 po/rc.cpp:950 rc.cpp:89
+#: rc.cpp:371 rc.cpp:950
+msgid "Composer:"
+msgstr "작곡가:"
+
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#: gui/searchpage.cpp:205 po/rc.cpp:95 po/rc.cpp:962 rc.cpp:95 rc.cpp:962
+msgid "Genre:"
+msgstr "장르:"
+
+#: gui/searchpage.cpp:206
+msgid "Date:"
+msgstr "날짜:"
+
+#: gui/searchpage.cpp:208
+msgid "Any:"
+msgstr "모두:"
+
+#: gui/searchpage.cpp:215
+msgid "No tracks found."
+msgstr "곡을 찾지 못함."
+
+#: gui/serversettings.cpp:87
+msgid ""
+"<i> This folder will also be used to locate music files for transferring to "
+"(and from) devices.</i>"
+msgstr ""
+"<i> 이 폴더는 장치로(부터) 전송하는 음악파일을 찾는데에도 사용됩니다.</i>"
+
+#: gui/serversettings.cpp:100
+msgid "Not used"
+msgstr "사용 안 함"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:75
+#. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:292
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
@@ -2661,8 +2799,8 @@ msgstr "사용 안 됨"
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
-#: gui/serversettings.cpp:103 po/rc.cpp:208 po/rc.cpp:247 po/rc.cpp:705
-#: rc.cpp:208 rc.cpp:247 rc.cpp:705
+#: gui/serversettings.cpp:103 po/rc.cpp:269 po/rc.cpp:308 po/rc.cpp:857
+#: rc.cpp:269 rc.cpp:308 rc.cpp:857
 msgid "Host:"
 msgstr "호스트:"
 
@@ -2707,7 +2845,7 @@ msgstr ""
 "됩니다.<br/><br/><i>%artist%은 지금 곡의 음반연주자로, %album%은 음반명으로 "
 "바뀝니다.</i></p>"
 
-#: gui/serversettings.cpp:252
+#: gui/serversettings.cpp:257
 msgid ""
 "Which type of collection do you wish to connect to?<br/><ul><li>Standard - "
 "music collection may be shared, is on another machine, or is already setup</"
@@ -2718,73 +2856,61 @@ msgstr ""
 "미 설정되어, 음원을 공유할 수 있음</li><li>기본 - 음원이 공유되지 않고 MPD만 "
 "설정하고 관리함</li></ul>"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Add Collection"
 msgstr "음원 추가"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Standard"
 msgstr "표준"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Basic"
 msgstr "기본"
 
-#: gui/serversettings.cpp:297
+#: gui/serversettings.cpp:302
 msgid "Delete <b>%1</b>?"
-msgstr "%1을 지울까요?"
+msgstr "<b>%1</b>을 지울까요?"
 
-#: gui/serversettings.cpp:298
+#: gui/serversettings.cpp:303
 msgid "Delete"
 msgstr "지우기"
 
-#: gui/serversettings.cpp:336
+#: gui/serversettings.cpp:341
 msgid "New Collection %1"
 msgstr "새로운 음원 %1"
 
-#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
+#: gui/serversettings.cpp:357 mpd/mpdconnection.cpp:173
 msgid "Default"
 msgstr "기본값"
 
-#: gui/shortcutssettingspage.cpp:74
+#: gui/shortcutssettingspage.cpp:76
 msgid "Multi-Media Keys"
 msgstr "멀티미디어 키"
 
-#: gui/shortcutssettingspage.cpp:80
+#: gui/shortcutssettingspage.cpp:82
 msgid "Do not use media keys to control Cantata"
 msgstr "미디어 키 사용 안 함"
 
-#: gui/shortcutssettingspage.cpp:81
+#: gui/shortcutssettingspage.cpp:83 gui/shortcutssettingspage.cpp:97
 msgid "Use media keys to control Cantata"
 msgstr "미디어 키 사용함"
 
-#: gui/shortcutssettingspage.cpp:84
+#: gui/shortcutssettingspage.cpp:86 gui/shortcutssettingspage.cpp:104
 msgid "Use media keys, as configured in desktop settings, to control Cantata"
 msgstr "데스크톱 환경에서 설정된 미디어 키 사용함"
 
-#: gui/shortcutssettingspage.cpp:85
+#: gui/shortcutssettingspage.cpp:87 gui/shortcutssettingspage.cpp:105
 msgid ""
 "Use media keys, as configured in GNOME/Unity settings, to control Cantata"
 msgstr "그놈/유니티에서 설정된 미디어 키 사용함"
 
-#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
-#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+#: gui/shortcutssettingspage.cpp:90 gui/shortcutssettingspage.cpp:107
+#: online/onlineservicespage.cpp:99 streams/streamspage.cpp:99
+#: support/fancytabwidget.cpp:825
 msgid "Configure..."
 msgstr "설정..."
 
-#: gui/shortcutssettingspage.cpp:95
-msgid "Use media keys to control Cantata:"
-msgstr "미디어 키 사용함:"
-
-#: gui/shortcutssettingspage.cpp:106
-msgid "Use media keys, as configured in desktop settings, to control Cantata:"
-msgstr "데스크톱 환경에서 설정된 미디어 키 사용함:"
-
-#: gui/shortcutssettingspage.cpp:107
-msgid ""
-"Use media keys, as configured in GNOME/Unity settings, to control Cantata:"
-msgstr "그놈/유니티에서 설정된 미디어 키 사용함:"
-
 #: gui/stdactions.cpp:55
 msgid "Previous Track"
 msgstr "이전 곡"
@@ -2857,7 +2983,7 @@ msgstr "사용자 우선순위..."
 msgid "Add To Playlist"
 msgstr "연주목록 추가"
 
-#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:66
 msgid "Organize Files"
 msgstr "파일구성"
 
@@ -2865,7 +2991,7 @@ msgstr "파일구성"
 msgid "Edit Tags"
 msgstr "태그수정"
 
-#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:106
 msgid "ReplayGain"
 msgstr "리플레이게인"
 
@@ -2878,88 +3004,89 @@ msgid "Set Image"
 msgstr "이미지 설정"
 
 #: gui/stdactions.cpp:88
-msgid "Refresh Database"
-msgstr "데이터베이스 새로 읽기"
-
-#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "돌아가기"
 
-#: gui/trayitem.cpp:192
+#: gui/stdactions.cpp:91
+msgid "Find"
+msgstr "찾기"
+
+#: gui/trayitem.cpp:210
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%2의 %1"
 
-#: gui/trayitem.cpp:193
+#: gui/trayitem.cpp:211
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%2의 %1 (%3)"
 
-#: gui/trayitem.cpp:195
+#: gui/trayitem.cpp:213
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%3에서 %2의 %1"
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:214
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr "%3에서 %2의 %1 (%4)"
 
-#: gui/trayitem.cpp:223
+#: gui/trayitem.cpp:241
 msgid "Now playing"
 msgstr "지금 연주 중"
 
-#: http/httpserversettings.cpp:40
+#: http/httpserversettings.cpp:39
 msgid "Local loopback (%1)"
 msgstr "로컬 루프백 (%1)"
 
-#: http/httpserversettings.cpp:43
+#: http/httpserversettings.cpp:42
 msgid "Wired (%1)"
 msgstr "유선 (%1)"
 
-#: http/httpserversettings.cpp:46
+#: http/httpserversettings.cpp:45
 msgid "Wireless (%1)"
 msgstr "무선 (%1)"
 
-#: http/httpserversettings.cpp:53
+#: http/httpserversettings.cpp:52
 msgid "First active interface"
 msgstr "우선 사용되는 연결"
 
-#: http/httpserversettings.cpp:98
-msgid "Inactive"
-msgstr "사용되지 않음"
+#: models/albumsmodel.cpp:260 models/musicmodel.cpp:254
+msgctxt "Album by Artist"
+msgid "%1 by %2"
+msgstr "%2의 %1"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:221
+#: models/musicmodel.cpp:133
 msgid "Cue Sheet"
 msgstr "Cue 시트"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:220
+#: models/musicmodel.cpp:133
 msgid "Playlist"
 msgstr "연주목록"
 
-#: models/devicesmodel.cpp:108
+#: models/devicesmodel.cpp:116
 msgid "Configure Device"
 msgstr "장치 설정"
 
-#: models/devicesmodel.cpp:109
+#: models/devicesmodel.cpp:117
 msgid "Refresh Device"
 msgstr "장치 새로 읽기"
 
-#: models/devicesmodel.cpp:110
+#: models/devicesmodel.cpp:118
 msgid "Connect Device"
 msgstr "장치 연결"
 
-#: models/devicesmodel.cpp:111
+#: models/devicesmodel.cpp:119
 msgid "Disconnect Device"
 msgstr "장치 분리"
 
-#: models/devicesmodel.cpp:113
+#: models/devicesmodel.cpp:121
 msgid "Edit CD Details"
 msgstr "CD 상세정보 수정"
 
-#: models/devicesmodel.cpp:690
+#: models/devicesmodel.cpp:730
 msgid "No Devices Attached"
 msgstr "장치 연결 안 됨"
 
@@ -2991,42 +3118,42 @@ msgstr "로그인 됨 (만기:%1)"
 msgid "Session expired"
 msgstr "세션 닫힘"
 
-#: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
+#: models/dirviewmodel.cpp:204 models/dirviewmodel.cpp:212
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:696
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "한 항목"
 msgstr[1] "%1 항목"
 
-#: models/dirviewmodel.cpp:190
+#: models/dirviewmodel.cpp:219
 msgid "Audio File"
 msgstr "음악파일"
 
-#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
-#: models/musiclibraryitemroot.cpp:844
+#: models/musiclibraryitemartist.cpp:248 models/musiclibraryitemartist.cpp:261
+#: models/musiclibraryitemroot.cpp:840
 msgid "Single Tracks"
 msgstr "한 곡들"
 
-#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
-#: widgets/groupedview.cpp:366
+#: models/musicmodel.cpp:190 models/onlineservicesmodel.cpp:167
+#: widgets/groupedview.cpp:364
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "한 곡"
 msgstr[1] "%1 곡"
 
-#: models/musicmodel.cpp:185
+#: models/musicmodel.cpp:196
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "한 연주자"
 msgstr[1] "%1 연주자"
 
-#: models/musicmodel.cpp:192
+#: models/musicmodel.cpp:203
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "한 음반"
 msgstr[1] "%1 음반"
 
-#: models/musicmodel.cpp:198
+#: models/musicmodel.cpp:209
 msgid "1 Episode"
 msgid_plural "%1 Episodes"
 msgstr[0] "한 에피소드"
@@ -3034,208 +3161,215 @@ msgstr[1] "%1 에피소드"
 
 #. i18n: file: online/onlinesettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: models/onlineservicesmodel.cpp:83 po/rc.cpp:720 rc.cpp:720
+#: models/onlineservicesmodel.cpp:91 po/rc.cpp:872 rc.cpp:872
 msgid "Configure Service"
 msgstr "서비스설정"
 
-#: models/onlineservicesmodel.cpp:84
+#: models/onlineservicesmodel.cpp:92
 msgid "Refresh Service"
 msgstr "서비스 새로 읽기"
 
-#: models/onlineservicesmodel.cpp:85
+#: models/onlineservicesmodel.cpp:93
 msgid "Add Subscription"
 msgstr "구독 추가"
 
-#: models/onlineservicesmodel.cpp:86
+#: models/onlineservicesmodel.cpp:94
 msgid "Remove Subscription"
 msgstr "구독 삭제"
 
-#: models/onlineservicesmodel.cpp:87
+#: models/onlineservicesmodel.cpp:95
 msgid "Refresh Subscription"
 msgstr "구독 새로 읽기"
 
-#: models/onlineservicesmodel.cpp:137
+#: models/onlineservicesmodel.cpp:145
 msgid "Last Search:%1"
 msgstr "최근 찾기:%1"
 
-#: models/onlineservicesmodel.cpp:149
-msgid "Searching..."
-msgstr "찾기..."
-
-#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
-#: models/streamsmodel.cpp:670
+#: models/onlineservicesmodel.cpp:160 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:691
 msgid "Not Loaded"
 msgstr "읽지 않음"
 
-#: models/onlineservicesmodel.cpp:155
+#: models/onlineservicesmodel.cpp:163
 msgid "Use search to locate tracks"
 msgstr "곡의 위치는 찾기를 사용"
 
-#: models/onlineservicesmodel.cpp:166
+#: models/onlineservicesmodel.cpp:174
 msgid "1 Podcast"
 msgid_plural "%1 Podcasts"
 msgstr[0] "한 팟캐스트"
 msgstr[1] "%1 팟캐스트"
 
-#: models/onlineservicesmodel.cpp:177
+#: models/onlineservicesmodel.cpp:185
 msgid "(Downloading: %1%)"
 msgstr "(내려받는 중: %1%)"
 
-#: models/onlineservicesmodel.cpp:235
+#: models/onlineservicesmodel.cpp:243
 msgctxt "podcast name (num unplayed episodes)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: models/playlistsmodel.cpp:77
+#: models/playlistsmodel.cpp:105
 msgid "New Playlist..."
 msgstr "새로운 연주목록..."
 
-#: models/playqueuemodel.cpp:102
-msgctxt "Track Number (#)"
-msgid "#"
-msgstr "#"
+#: models/playlistsmodel.cpp:321
+msgid "Smart Playlist"
+msgstr "고급 연주목록"
 
-#: models/playqueuemodel.cpp:103
+#: models/playqueuemodel.cpp:109
 msgid "Length"
 msgstr "길이"
 
-#: models/playqueuemodel.cpp:104
+#: models/playqueuemodel.cpp:110
 msgid "Disc"
 msgstr "디스크"
 
-#. i18n: file: devices/filenameschemedialog.ui:138
+#. i18n: file: devices/filenameschemedialog.ui:174
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
+#: models/playqueuemodel.cpp:111 po/rc.cpp:248 rc.cpp:248
 msgid "Year"
 msgstr "연도"
 
-#: models/playqueuemodel.cpp:360
+#: models/playqueuemodel.cpp:158
+msgid "Undo"
+msgstr "되돌리기"
+
+#: models/playqueuemodel.cpp:160
+msgid "Redo"
+msgstr "다시 돌리기"
+
+#: models/playqueuemodel.cpp:404
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(우선순위: %1)</b>"
 
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:693
 msgid "Loading..."
 msgstr "읽는 중..."
 
-#: models/streamsmodel.cpp:286
+#: models/streamsmodel.cpp:302
 msgid "Bookmarks"
 msgstr "책갈피"
 
-#: models/streamsmodel.cpp:560
+#: models/streamsmodel.cpp:576
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:563
+#: models/streamsmodel.cpp:579
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:564
+#: models/streamsmodel.cpp:580
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:567
+#: models/streamsmodel.cpp:583
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:568
+#: models/streamsmodel.cpp:584
+msgid "Radio GFM"
+msgstr "Radio GFM"
+
+#: models/streamsmodel.cpp:585
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: models/streamsmodel.cpp:569
+#: models/streamsmodel.cpp:586
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:570
+#: models/streamsmodel.cpp:587
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:571
+#: models/streamsmodel.cpp:588
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:572
+#: models/streamsmodel.cpp:589
 msgid "Favorites"
 msgstr "즐겨찾기"
 
-#: models/streamsmodel.cpp:573
+#: models/streamsmodel.cpp:590
 msgid "Listen Live"
 msgstr "Listen Live"
 
-#: models/streamsmodel.cpp:578
+#: models/streamsmodel.cpp:595
 msgid "Bookmark Category"
 msgstr "카테고리를 책갈피에 추가"
 
-#: models/streamsmodel.cpp:579
+#: models/streamsmodel.cpp:596
 msgid "Add Stream To Favorites"
 msgstr "스트림을 즐겨찾기에 추가"
 
-#: models/streamsmodel.cpp:580
+#: models/streamsmodel.cpp:597
 msgid "Configure Streams"
 msgstr "스트림 설정"
 
-#: models/streamsmodel.cpp:660
+#: models/streamsmodel.cpp:681
 msgid "%1 (Read-Only)"
 msgstr "%1 (읽기만)"
 
-#: models/streamsmodel.cpp:1241
+#: models/streamsmodel.cpp:1261
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr "스트림 항목을 저장할 수 없음. %1에 쓸 수 있는지 확인 바랍니다."
 
-#: models/streamsmodel.cpp:1639
+#: models/streamsmodel.cpp:1659
 msgid "All"
 msgstr "전체"
 
-#: mpd/mpdconnection.cpp:154
+#: mpd/mpdconnection.cpp:179
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "\"%1\""
 
-#: mpd/mpdconnection.cpp:156
+#: mpd/mpdconnection.cpp:181
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr "\"%1\" (%2:%3)"
 
-#: mpd/mpdconnection.cpp:372 mpd/mpdconnection.cpp:415
-#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
-#: mpd/mpdconnection.cpp:1036
+#: mpd/mpdconnection.cpp:406 mpd/mpdconnection.cpp:451
+#: mpd/mpdconnection.cpp:501 mpd/mpdconnection.cpp:1137
+#: mpd/mpdconnection.cpp:1164
 msgid "Connection to %1 failed"
 msgstr "%1에 연결 안 됨"
 
-#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
+#: mpd/mpdconnection.cpp:412 mpd/mpdconnection.cpp:455
 msgid "Connection to %1 failed - incorrect password"
 msgstr "%1에 연결 안 됨 - 틀린 암호"
 
-#: mpd/mpdconnection.cpp:455
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to send command to %1 - not connected"
 msgstr "%1에 명령어 전달 안 됨 - 연결 안 됨"
 
-#: mpd/mpdconnection.cpp:491
+#: mpd/mpdconnection.cpp:539
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr "연결 안 됨. \"mpd\" 사용자가 읽기 권한이 있는지 확인해야 합니다."
 
-#: mpd/mpdconnection.cpp:493
+#: mpd/mpdconnection.cpp:541
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
 msgstr "불러오기 안 됨. MPD는 로컬에 연결된 파일만 불러올 수 있습니다."
 
-#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
+#: mpd/mpdconnection.cpp:547 mpd/mpdconnection.cpp:558
 msgid "Failed to send command. Disconnected from %1"
 msgstr "명령어 전달 안 됨. %1 연결 해제"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1306
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr "<b>%1</b>에서 <b>%2</b>로 이름 바꾸기 안 됨"
 
-#: mpd/mpdconnection.cpp:1183
+#: mpd/mpdconnection.cpp:1318
 msgid "Failed to save <b>%1</b>"
 msgstr "<b>%1</b> 저장 안 됨"
 
-#: mpd/mpdconnection.cpp:1196
+#: mpd/mpdconnection.cpp:1331
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr "큐시트의 일부를 연주목록에 추가할 수 없습니다!"
 
-#: mpd/mpdconnection.cpp:1199
+#: mpd/mpdconnection.cpp:1334
 msgid "You cannot add a playlist to another playlist!"
 msgstr "연주목록을 다른 연주목록에 추가할 수 없습니다!"
 
@@ -3243,7 +3377,15 @@ msgstr "연주목록을 다른 연주목록에 추가할 수 없습니다!"
 msgid "Personal"
 msgstr "개인"
 
-#: mpd/song.cpp:343
+#: mpd/song.cpp:62
+msgid "Unknown"
+msgstr "알 수 없음"
+
+#: mpd/song.cpp:63
+msgid "Various Artists"
+msgstr "여러 연주자"
+
+#: mpd/song.cpp:427
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3313,8 +3455,8 @@ msgstr "Magnatune 설정"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
-#: rc.cpp:711 rc.cpp:729
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:863 po/rc.cpp:881
+#: rc.cpp:863 rc.cpp:881
 msgid "Username:"
 msgstr "사용자:"
 
@@ -3342,9 +3484,9 @@ msgstr "사용자:"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPasswordLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:220 po/rc.cpp:238
-#: po/rc.cpp:412 po/rc.cpp:647 po/rc.cpp:714 po/rc.cpp:732 rc.cpp:220
-#: rc.cpp:238 rc.cpp:412 rc.cpp:647 rc.cpp:714 rc.cpp:732
+#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:281 po/rc.cpp:299
+#: po/rc.cpp:476 po/rc.cpp:802 po/rc.cpp:866 po/rc.cpp:884 rc.cpp:281
+#: rc.cpp:299 rc.cpp:476 rc.cpp:802 rc.cpp:866 rc.cpp:884
 msgid "Password:"
 msgstr "비밀번호:"
 
@@ -3384,155 +3526,178 @@ msgstr "내려받을 수 없음"
 msgid "Download To Library"
 msgstr "라이브러리로 내려받기"
 
-#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
-msgid "Search For Podcasts"
-msgstr "팟캐스트 찾기"
-
-#: online/onlineservicespage.cpp:63
+#: online/onlineservicespage.cpp:62
 msgid "Download Podcast Episodes"
 msgstr "팟캐스트 에피소드 내려받기"
 
-#: online/onlineservicespage.cpp:64
+#: online/onlineservicespage.cpp:63
 msgid "Delete Downloaded Podcast Episodes"
 msgstr "내려받은 팟캐스트 에피소드 지우기"
 
-#: online/onlineservicespage.cpp:329
+#: online/onlineservicespage.cpp:320
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
-msgstr "찾기 %1:"
+msgstr "%1 찾기:"
 
-#: online/onlineservicespage.cpp:464
+#: online/onlineservicespage.cpp:458
 msgid "Re-download music listing for %1?"
 msgstr "%1의 음악항목을 다시 내려받습니까?"
 
-#: online/onlineservicespage.cpp:532
-msgid "Subscribe to Podcast"
-msgstr "팟캐스트 구독"
-
-#: online/onlineservicespage.cpp:532
-msgid "Enter podcast URL:"
-msgstr "팟캐스트 URL 입력:"
-
-#: online/onlineservicespage.cpp:541
-msgid "Invalid URL!"
-msgstr "잘못된 URL!"
-
-#: online/onlineservicespage.cpp:546
-msgid "You are already subscribed to this URL!"
-msgstr "이미 이 URL을 구독하고 있습니다!"
-
-#: online/onlineservicespage.cpp:550
-msgid "Already downloading this URL!"
-msgstr "이미 이 URL을 내려받고 있습니다!"
-
-#: online/onlineservicespage.cpp:579
+#: online/onlineservicespage.cpp:544
 msgid "Unsubscribe from <b>%1</b>?"
 msgstr "<b>%1</b>을 구독 취소할까요?"
 
-#: online/onlineservicespage.cpp:600
+#: online/onlineservicespage.cpp:565
 msgid "Refresh all podcast listings?"
 msgstr "모든 팟캐스트를 새로 읽을까요?"
 
-#: online/onlineservicespage.cpp:621
+#: online/onlineservicespage.cpp:586
 msgid "Refresh episode listing from <b>%1</b>?"
 msgstr "<b>%1</b>의 팟캐스트 항목을 새로 읽을까요?"
 
-#: online/onlineservicespage.cpp:695
+#: online/onlineservicespage.cpp:652
 msgid "All selected podcasts have already been downloaded!"
 msgstr "이미 선택된 모든 팟캐스트를 내려받았습니다!"
 
-#: online/onlineservicespage.cpp:699
+#: online/onlineservicespage.cpp:656
 msgid "Do you wish to download the following podcast episode?"
 msgstr "아래 팟캐스트의 한 에피소드를 내려받을까요?"
 
-#: online/onlineservicespage.cpp:702
+#: online/onlineservicespage.cpp:659
 msgid "Do you wish to download the following podcast episodes?"
 msgstr "아래 팟캐스트의 여러 에피소드를 내려받을까요? "
 
-#: online/onlineservicespage.cpp:705
+#: online/onlineservicespage.cpp:662
 msgid "Do you wish to download the selected podcast episodes?"
 msgstr "선택된 팟캐스트 에피소드를 내려받을까요?"
 
-#: online/onlineservicespage.cpp:753
+#: online/onlineservicespage.cpp:710
 msgid "All selected downloaded podcast episodes have already been deleted!"
 msgstr "이미 선택된 모든 팟캐스트를 지웠습니다!"
 
-#: online/onlineservicespage.cpp:757
+#: online/onlineservicespage.cpp:714
 msgid ""
 "Do you wish to delete the downloaded file of the following podcast episode?"
 msgstr "아래 팟캐스트 에피소드에서 내려받은 한 파일을 지울까요?"
 
-#: online/onlineservicespage.cpp:760
+#: online/onlineservicespage.cpp:717
 msgid ""
 "Do you wish to the delete downloaded files of the following podcast episodes?"
 msgstr "아래 팟캐스트 에피소드에서 내려받은 여러 파일을 지울까요?"
 
-#: online/onlineservicespage.cpp:763
+#: online/onlineservicespage.cpp:720
 msgid ""
 "Do you wish to the delete downloaded files of the selected podcast episodes?"
 msgstr "선택된 팟캐스트 에피소드에서 내려받은 여러 파일을 지울까요?"
 
-#: online/podcastsearchdialog.cpp:243
+#: online/podcastsearchdialog.cpp:253
 msgid "RSS:"
 msgstr "RSS:"
 
-#: online/podcastsearchdialog.cpp:245
+#: online/podcastsearchdialog.cpp:255
 msgid "Website:"
 msgstr "웹사이트:"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Podcast details"
 msgstr "팟캐스트 상세정보"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Select a podcast to display its details"
 msgstr "상세정보를 보여줄 팟캐스트를 선택하셔요"
 
-#: online/podcastsearchdialog.cpp:322
+#: online/podcastsearchdialog.cpp:333
 msgid "Enter search term..."
 msgstr "검색단어입력..."
 
-#: online/podcastsearchdialog.cpp:372
+#: online/podcastsearchdialog.cpp:383
 msgid "Failed to fetch podcasts from %1"
 msgstr "%1의 팟캐스트를 가져올 수 없음"
 
-#: online/podcastsearchdialog.cpp:378
+#: online/podcastsearchdialog.cpp:389
 msgid "There was a problem parsing the response from %1"
 msgstr "%1의 응답을 분석할 수 없습니다"
 
-#: online/podcastsearchdialog.cpp:439
+#: online/podcastsearchdialog.cpp:450
 msgid "Failed to download directory listing"
 msgstr "디렉터리 항목을 내려받을 수 없음"
 
-#: online/podcastsearchdialog.cpp:447
+#: online/podcastsearchdialog.cpp:458
 msgid "Failed to parse directory listing"
 msgstr "디렉터리 항목을 분석할 수 없음"
 
 #: online/podcastsearchdialog.cpp:508
+msgid "URL"
+msgstr "URL"
+
+#: online/podcastsearchdialog.cpp:517
+msgid "Enter podcast URL..."
+msgstr "팟캐스트 URL 입력..."
+
+#: online/podcastsearchdialog.cpp:518
+msgid "Load"
+msgstr "읽음"
+
+#: online/podcastsearchdialog.cpp:525
+msgid "Enter podcast URL below, and press 'Load'"
+msgstr "아래 팟캐스트 URL을 입력하고 '읽음'을 누름"
+
+#: online/podcastsearchdialog.cpp:552
+msgid "Invalid URL!"
+msgstr "잘못된 URL!"
+
+#: online/podcastsearchdialog.cpp:562
+msgid "Failed to fetch podcast!"
+msgstr "팟캐스트를 가져올 수 없음!"
+
+#: online/podcastsearchdialog.cpp:567
+msgid "Failed to parse podcast."
+msgstr "팟캐스트 분석 안 됨."
+
+#: online/podcastsearchdialog.cpp:571
+msgid ""
+"Cantata only supports audio podcasts! The URL entered contains only video "
+"podcasts."
+msgstr "오디오 팟캐스트만 지원합니다! 입력한 URL은 비디오 팟캐스트만 포함하"
+"고 있습니다."
+
+#: online/podcastsearchdialog.cpp:589
 msgid "Subscribe"
 msgstr "구독"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:607
+msgid "Enter URL"
+msgstr "URL 입력"
+
+#: online/podcastsearchdialog.cpp:607
+msgid "Manual podcast URL"
+msgstr "수동 팟캐스트 URL"
+
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search %1"
-msgstr "찾기 %1"
+msgstr "%1 찾기"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search for podcasts on %1"
-msgstr "팟캐스트에서 %1을 찾기"
+msgstr "%1에서 팟캐스트를 찾기"
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1"
 msgstr "%1 둘러보기"
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1 podcasts"
 msgstr "%1 팟캐스트 둘러보기"
 
-#: online/podcastsearchdialog.cpp:602
+#: online/podcastsearchdialog.cpp:639
+msgid "Add Podcast Subscription"
+msgstr "팟캐스트 구독 추가"
+
+#: online/podcastsearchdialog.cpp:695
 msgid "Subscription added"
 msgstr "구독 추가됨"
 
-#: online/podcastsearchdialog.cpp:604
+#: online/podcastsearchdialog.cpp:697
 msgid "You are already subscribed to this podcast!"
 msgstr "이미 이 팟캐스트를 구독하고 있습니다!"
 
@@ -3540,91 +3705,170 @@ msgstr "이미 이 팟캐스트를 구독하고 있습니다!"
 msgid "Podcasts"
 msgstr "팟캐스트"
 
-#: online/podcastservice.cpp:284
+#: online/podcastservice.cpp:288
 msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
-msgstr "오디오 팟캐스트만 지원합니다! %1은 비디오를 포함하고 있습니다."
+msgstr "오디오 팟캐스트만 지원합니다! %1은 비디오 팟캐스트만 있습니다."
 
-#: online/podcastservice.cpp:286
+#: online/podcastservice.cpp:290
 msgid "Failed to parse %1"
 msgstr "%1 분석 안 됨"
 
-#: online/podcastservice.cpp:290
+#: online/podcastservice.cpp:294
 msgid "Failed to download %1"
 msgstr "%1을 내려받을 수 없음"
 
-#: online/podcastsettingsdialog.cpp:58
+#: online/podcastsettingsdialog.cpp:59
 msgid "Check for new episodes:"
 msgstr "새로운 에피소드 확인:"
 
-#: online/podcastsettingsdialog.cpp:59
+#: online/podcastsettingsdialog.cpp:60
 msgid "Download episodes to:"
 msgstr "에피소드 내려받기:"
 
-#: online/podcastsettingsdialog.cpp:60
-msgid "Automatically download new episodes:"
-msgstr "새로운 에피소드 자동 내려받기:"
+#: online/podcastsettingsdialog.cpp:67
+msgid "Automatically download new episodes"
+msgstr "새로운 에피소드 자동 내려받기"
 
-#: online/podcastsettingsdialog.cpp:82
+#: online/podcastsettingsdialog.cpp:80
 msgid "Podcast Settings"
 msgstr "팟캐스트 설정"
 
-#: online/podcastsettingsdialog.cpp:84
+#: online/podcastsettingsdialog.cpp:82
 msgid "Manually"
 msgstr "수동"
 
-#: online/podcastsettingsdialog.cpp:85
+#: online/podcastsettingsdialog.cpp:83
 msgid "Every 15 minutes"
 msgstr "15분마다"
 
-#: online/podcastsettingsdialog.cpp:86
+#: online/podcastsettingsdialog.cpp:84
 msgid "Every 30 minutes"
 msgstr "30분마다"
 
-#: online/podcastsettingsdialog.cpp:87
+#: online/podcastsettingsdialog.cpp:85
 msgid "Every hour"
 msgstr "1시간마다"
 
-#: online/podcastsettingsdialog.cpp:88
+#: online/podcastsettingsdialog.cpp:86
 msgid "Every 2 hours"
 msgstr "2시간마다"
 
-#: online/podcastsettingsdialog.cpp:89
+#: online/podcastsettingsdialog.cpp:87
 msgid "Every 6 hours"
 msgstr "6시간마다"
 
-#: online/podcastsettingsdialog.cpp:90
+#: online/podcastsettingsdialog.cpp:88
 msgid "Every 12 hours"
 msgstr "12시간마다"
 
-#: online/podcastsettingsdialog.cpp:91
+#: online/podcastsettingsdialog.cpp:89
 msgid "Every day"
 msgstr "매일"
 
-#: online/podcastsettingsdialog.cpp:92
+#: online/podcastsettingsdialog.cpp:90
 msgid "Every week"
 msgstr "매주"
 
-#. i18n: file: context/othersettings.ui:19
-#. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
-#: po/rc.cpp:3 rc.cpp:3
-msgid "Use backdrop:"
-msgstr "배경 사용:"
-
-#. i18n: file: context/othersettings.ui:32
-#. i18n: ectx: property (text), widget (BuddyLabel, contextDarkBackgroundLabel)
-#: po/rc.cpp:6 rc.cpp:6
-msgid "Dark background:"
-msgstr "어두운 기본배경:"
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:3 po/rc.cpp:657 rc.cpp:3 rc.cpp:657
+msgid "Background Image"
+msgstr "배경 화면"
 
-#. i18n: file: context/othersettings.ui:45
-#. i18n: ectx: property (text), widget (BuddyLabel, wikipediaIntroOnlyLabel)
+#. i18n: file: context/othersettings.ui:36
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_artist)
 #: po/rc.cpp:9 rc.cpp:9
-msgid "Only show basic wikipedia text:"
-msgstr "위키피디아 기본 본문만 보기:"
-
-#. i18n: file: context/othersettings.ui:86
+msgid "Artist image"
+msgstr "연주자이미지"
+
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#: po/rc.cpp:12 po/rc.cpp:666 rc.cpp:12 rc.cpp:666
+msgid "Custom image:"
+msgstr "사용자 이미지:"
+
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#: po/rc.cpp:15 po/rc.cpp:669 rc.cpp:15 rc.cpp:669
+msgid "Blur:"
+msgstr "흐림:"
+
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#: po/rc.cpp:18 po/rc.cpp:672 rc.cpp:18 rc.cpp:672
+msgid "10px"
+msgstr "10픽셀"
+
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: po/rc.cpp:21 po/rc.cpp:675 rc.cpp:21 rc.cpp:675
+msgid "Opacity:"
+msgstr "불투명:"
+
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#: po/rc.cpp:25 po/rc.cpp:679 rc.cpp:25 rc.cpp:679
+#, no-c-format
+msgid "40%"
+msgstr "40%"
+
+#. i18n: file: context/othersettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, contextDarkBackground)
+#: po/rc.cpp:28 rc.cpp:28
+msgid "Dark background"
+msgstr "어두운 기본배경"
+
+#. i18n: file: context/othersettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, wikipediaIntroOnly)
+#: po/rc.cpp:31 rc.cpp:31
+msgid "Only show basic wikipedia text"
+msgstr "위키피디아 기본 본문만 보기"
+
+#. i18n: file: context/othersettings.ui:178
+#. i18n: ectx: property (text), widget (QCheckBox, contextAlwaysCollapsed)
+#: po/rc.cpp:34 rc.cpp:34
+msgid "Always collapse into a single pane"
+msgstr "항상 하나의 창으로 줄이기"
+
+#. i18n: file: context/othersettings.ui:207
 #. i18n: ectx: property (text), widget (StateLabel, wikipediaIntroOnlyNote)
-#: po/rc.cpp:13 rc.cpp:13
+#: po/rc.cpp:38 rc.cpp:38
 #, no-c-format
 msgid ""
 "<i><b>NOTE:</b> Cantata does not show the full wikipedia pages (with images, "
@@ -3641,188 +3885,173 @@ msgstr ""
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:16 rc.cpp:16
+#: po/rc.cpp:41 rc.cpp:41
 msgid "Available:"
 msgstr "사용 가능:"
 
 #. i18n: file: context/togglelist.ui:24
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:19 rc.cpp:19
+#: po/rc.cpp:44 rc.cpp:44
 msgid "Selected:"
 msgstr "선택됨:"
 
-#. i18n: file: devices/actiondialog.ui:30
+#. i18n: file: devices/actiondialog.ui:33
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:22 rc.cpp:22
+#: po/rc.cpp:47 rc.cpp:47
 msgid "Copy songs from:"
 msgstr "복사해오기:"
 
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#: po/rc.cpp:25 po/rc.cpp:31 po/rc.cpp:49 po/rc.cpp:744 rc.cpp:25 rc.cpp:31
-#: rc.cpp:49 rc.cpp:744
+#: po/rc.cpp:50 po/rc.cpp:62 po/rc.cpp:896 rc.cpp:50 rc.cpp:62 rc.cpp:896
 msgid "TextLabel"
 msgstr "문자표"
 
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#: po/rc.cpp:28 po/rc.cpp:34 rc.cpp:28 rc.cpp:34
+#: po/rc.cpp:56 po/rc.cpp:68 rc.cpp:56 rc.cpp:68
 msgid "(Needs configuring)"
 msgstr "(설정 필요)"
 
-#. i18n: file: devices/actiondialog.ui:123
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:37 rc.cpp:37
-msgid "Overwrite songs:"
-msgstr "음악 덮어쓰기:"
-
-#. i18n: file: devices/actiondialog.ui:150
+#. i18n: file: devices/actiondialog.ui:86
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:40 rc.cpp:40
+#: po/rc.cpp:59 rc.cpp:59
 msgid "Copy songs to:"
 msgstr "음악 복사하기:"
 
-#. i18n: file: devices/actiondialog.ui:157
+#. i18n: file: devices/actiondialog.ui:149
 #. i18n: ectx: property (text), widget (QLabel, codecLabel)
-#: po/rc.cpp:43 rc.cpp:43
+#: po/rc.cpp:71 rc.cpp:71
 msgid "Destination format:"
 msgstr "대상 형식:"
 
-#. i18n: file: devices/actiondialog.ui:171
+#. i18n: file: devices/actiondialog.ui:163
+#. i18n: ectx: property (text), widget (QCheckBox, overwrite)
+#: po/rc.cpp:74 rc.cpp:74
+msgid "Overwrite songs"
+msgstr "곡 덮어쓰기"
+
+#. i18n: file: devices/actiondialog.ui:170
 #. i18n: ectx: property (text), widget (QLabel, songCountLabel)
-#: po/rc.cpp:46 rc.cpp:46
+#: po/rc.cpp:77 rc.cpp:77
 msgid "To copy:"
 msgstr "복사하기:"
 
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#: po/rc.cpp:80 po/rc.cpp:968 po/rc.cpp:995 rc.cpp:80 rc.cpp:968 rc.cpp:995
+msgid ""
+"<i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i>"
+msgstr ""
+"<i><b>참고:</b> Mopidy 서버에 연결됨 (수동 업데이트 필요).</i>"
+
 #. i18n: file: devices/albumdetails.ui:26
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:52 rc.cpp:52
+#: po/rc.cpp:83 rc.cpp:83
 msgid "Album Details"
 msgstr "음반 상세정보"
 
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#: po/rc.cpp:58 po/rc.cpp:298 po/rc.cpp:798 rc.cpp:58 rc.cpp:298 rc.cpp:798
-msgid "Composer:"
-msgstr "작곡가:"
-
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
-msgid "Genre:"
-msgstr "장르:"
-
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#: po/rc.cpp:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
+#: po/rc.cpp:98 po/rc.cpp:965 rc.cpp:98 rc.cpp:965
 msgid "Year:"
 msgstr "연도:"
 
-#. i18n: file: devices/albumdetails.ui:99
+#. i18n: file: devices/albumdetails.ui:102
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:70 rc.cpp:70
+#: po/rc.cpp:101 rc.cpp:101
 msgid "Disc:"
 msgstr "디스크:"
 
-#. i18n: file: devices/albumdetails.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:73 rc.cpp:73
-msgid "Single artist:"
-msgstr "한 연주자:"
+#. i18n: file: devices/albumdetails.ui:115
+#. i18n: ectx: property (text), widget (QCheckBox, singleArtist)
+#: po/rc.cpp:104 rc.cpp:104
+msgid "Single artist"
+msgstr "한 연주자"
 
-#. i18n: file: devices/audiocdsettings.ui:20
+#. i18n: file: devices/audiocdsettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:119 rc.cpp:119
 msgid "Album and Track Information Retrieval"
 msgstr "음반과 곡 정보검색"
 
-#. i18n: file: devices/audiocdsettings.ui:26
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:91 rc.cpp:91
-msgid "Automatically lookup:"
-msgstr "자동찾기:"
-
-#. i18n: file: devices/audiocdsettings.ui:39
+#. i18n: file: devices/audiocdsettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:122 rc.cpp:122
 msgid "Initially look up via:"
-msgstr "처음 찾기:"
+msgstr "첫 찾기:"
 
-#. i18n: file: devices/audiocdsettings.ui:52
+#. i18n: file: devices/audiocdsettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:125 rc.cpp:125
 msgid "CDDB Host:"
 msgstr "CDDB 호스트:"
 
-#. i18n: file: devices/audiocdsettings.ui:65
+#. i18n: file: devices/audiocdsettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:128 rc.cpp:128
 msgid "CDDB Port:"
 msgstr "CDDB 포트:"
 
-#. i18n: file: devices/audiocdsettings.ui:88
+#. i18n: file: devices/audiocdsettings.ui:84
+#. i18n: ectx: property (text), widget (QCheckBox, cdAuto)
+#: po/rc.cpp:131 rc.cpp:131
+msgid "Lookup information as soon as CD is inserted"
+msgstr "CD가 삽입되면 바로 정보 검색"
+
+#. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:134 rc.cpp:134
 msgid "Audio Extraction"
 msgstr "오디오추출"
 
-#. i18n: file: devices/audiocdsettings.ui:94
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:106 rc.cpp:106
-msgid "Full paranoia mode (best quality):"
-msgstr "Paranoia 완전 기능 (최고품질):"
+#. i18n: file: devices/audiocdsettings.ui:100
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaFull)
+#: po/rc.cpp:137 rc.cpp:137
+msgid "Full paranoia mode (best quality)"
+msgstr "Paranoia 완전 기능 (최고품질)"
 
 #. i18n: file: devices/audiocdsettings.ui:107
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:109 rc.cpp:109
-msgid "Never skip on read error:"
-msgstr "읽기오류 건너뛰지 않음:"
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaNeverSkip)
+#: po/rc.cpp:140 rc.cpp:140
+msgid "Never skip on read error"
+msgstr "읽기오류 건너뛰지 않음"
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:112 rc.cpp:112
+#: po/rc.cpp:143 rc.cpp:143
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3850,188 +4079,259 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
 #. i18n: file: gui/serversettings.ui:325
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
-#: po/rc.cpp:115 po/rc.cpp:415 po/rc.cpp:433 po/rc.cpp:650 po/rc.cpp:671
-#: rc.cpp:115 rc.cpp:415 rc.cpp:433 rc.cpp:650 rc.cpp:671
+#: po/rc.cpp:146 po/rc.cpp:479 po/rc.cpp:497 po/rc.cpp:805 po/rc.cpp:826
+#: rc.cpp:146 rc.cpp:479 rc.cpp:497 rc.cpp:805 rc.cpp:826
 msgid "Music folder:"
 msgstr "음악 폴더:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:149 rc.cpp:149
 msgid "Copy album covers as:"
 msgstr "음반표지 저장하기:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: po/rc.cpp:152 rc.cpp:152
 msgid "Maximum cover size:"
 msgstr "최대 표지 크기:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:82
-#. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:124 rc.cpp:124
-msgid "'Various Artists' workaround:"
-msgstr "'여러 연주자' 해결:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, autoScanLabel)
-#: po/rc.cpp:127 rc.cpp:127
-msgid "Automatically scan music when attached:"
-msgstr "연결되면 알아서 음악검색:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:108
-#. i18n: ectx: property (text), widget (BuddyLabel, useCacheLabel)
-#: po/rc.cpp:130 rc.cpp:130
-msgid "Use cache:"
-msgstr "캐시 사용:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:121
+#. i18n: file: devices/devicepropertieswidget.ui:85
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:133 rc.cpp:133
+#: po/rc.cpp:155 rc.cpp:155
 msgid "Default volume:"
 msgstr "기본 음량:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, fixVariousArtists)
+#: po/rc.cpp:158 rc.cpp:158
+msgid "'Various Artists' workaround"
+msgstr "'여러 연주자' 해결"
+
+#. i18n: file: devices/devicepropertieswidget.ui:99
+#. i18n: ectx: property (text), widget (QCheckBox, autoScan)
+#: po/rc.cpp:161 rc.cpp:161
+msgid "Automatically scan music when attached"
+msgstr "연결되면 알아서 음악검색"
+
+#. i18n: file: devices/devicepropertieswidget.ui:106
+#. i18n: ectx: property (text), widget (QCheckBox, useCache)
+#: po/rc.cpp:164 rc.cpp:164
+msgid "Use cache"
+msgstr "캐시 사용"
+
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#: po/rc.cpp:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
+#: po/rc.cpp:167 po/rc.cpp:971 rc.cpp:167 rc.cpp:971
 msgid "Filenames"
 msgstr "파일이름"
 
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
-msgid "Use only ASCII characters:"
-msgstr "ASCII 문자만 표시:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
-msgid "Replace spaces with underscores:"
-msgstr "빈칸을 밑줄로 바꿈:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
-msgid "Ignore 'The' in artist names:"
-msgstr "연주자 이름에 'The' 무시:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
+#: po/rc.cpp:170 po/rc.cpp:974 rc.cpp:170 rc.cpp:974
 msgid "Filename scheme:"
 msgstr "파일이름 구성:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
-msgid "VFAT safe:"
-msgstr "안전한 VFAT:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:250
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#: po/rc.cpp:173 po/rc.cpp:977 rc.cpp:173 rc.cpp:977
+msgid "VFAT safe"
+msgstr "안전한 VFAT"
+
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#: po/rc.cpp:176 po/rc.cpp:980 rc.cpp:176 rc.cpp:980
+msgid "Use only ASCII characters"
+msgstr "ASCII 문자만 표시"
+
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#: po/rc.cpp:179 po/rc.cpp:983 rc.cpp:179 rc.cpp:983
+msgid "Replace spaces with underscores"
+msgstr "빈칸을 밑줄로 바꿈"
+
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#: po/rc.cpp:182 po/rc.cpp:986 rc.cpp:182 rc.cpp:986
+msgid "Ignore 'The' in artist names"
+msgstr "연주자 이름에 'The' 무시"
+
+#. i18n: file: devices/devicepropertieswidget.ui:192
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:185 rc.cpp:185
 msgid "Transcoding"
 msgstr "변환"
 
-#. i18n: file: devices/devicepropertieswidget.ui:261
-#. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:157 rc.cpp:157
-msgid "Only transcode if source file is of a different format:"
-msgstr "원본 파일이 다른 포맷일 때만 변환:"
+#. i18n: file: devices/devicepropertieswidget.ui:201
+#. i18n: ectx: property (text), widget (QCheckBox, transcoderWhenDifferent)
+#: po/rc.cpp:188 rc.cpp:188
+msgid "Only transcode if source file is of a different format"
+msgstr "원본 파일이 다른 포맷일 때만 변환"
 
-#. i18n: file: devices/filenameschemedialog.ui:29
+#. i18n: file: devices/filenameschemedialog.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:191 rc.cpp:191
 msgid "Example:"
 msgstr "예:"
 
-#. i18n: file: devices/filenameschemedialog.ui:58
+#. i18n: file: devices/filenameschemedialog.ui:67
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:194 rc.cpp:194
 msgid "About filename schemes"
 msgstr "파일이름 구성에 대하여"
 
-#. i18n: file: devices/filenameschemedialog.ui:70
+#. i18n: file: devices/filenameschemedialog.ui:79
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumArtist)
+#: po/rc.cpp:197 rc.cpp:197
+msgid ""
+"The artist of the album. For most albums, this will be the same as the "
+"<i>Track Artist.</i> For compilations, this will often be <i>Various Artists."
+"</i>"
+msgstr ""
+"음반의 연주자. 대부분의 경우, <i>곡의 연주자</i>와 동일합니다. 편집음반의 "
+"경우, 대게 <i>여러 연주자</i>입니다."
+
+#. i18n: file: devices/filenameschemedialog.ui:82
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:200 rc.cpp:200
 msgid "Album Artist"
 msgstr "음반연주자"
 
-#. i18n: file: devices/filenameschemedialog.ui:77
+#. i18n: file: devices/filenameschemedialog.ui:89
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumTitle)
+#: po/rc.cpp:203 rc.cpp:203
+msgid "The name of the album."
+msgstr "음반명."
+
+#. i18n: file: devices/filenameschemedialog.ui:92
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:206 rc.cpp:206
 msgid "Album Title"
 msgstr "음반제목"
 
-#. i18n: file: devices/filenameschemedialog.ui:91
+#. i18n: file: devices/filenameschemedialog.ui:99
+#. i18n: ectx: property (toolTip), widget (QPushButton, composer)
+#: po/rc.cpp:209 rc.cpp:209
+msgid "The composer."
+msgstr "작곡가."
+
+#. i18n: file: devices/filenameschemedialog.ui:109
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtist)
+#: po/rc.cpp:215 rc.cpp:215
+msgid "The artist of each track."
+msgstr "각 곡의 연주자."
+
+#. i18n: file: devices/filenameschemedialog.ui:112
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:218 rc.cpp:218
 msgid "Track Artist"
 msgstr "곡 연주자"
 
-#. i18n: file: devices/filenameschemedialog.ui:98
+#. i18n: file: devices/filenameschemedialog.ui:119
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackTitle)
+#: po/rc.cpp:221 rc.cpp:221
+msgid "The track title (without <i>Track Artist</i>)."
+msgstr "곡명 (<i>곡 연주자</i>없이)."
+
+#. i18n: file: devices/filenameschemedialog.ui:122
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:224 rc.cpp:224
 msgid "Track Title"
 msgstr "곡 제목"
 
-#. i18n: file: devices/filenameschemedialog.ui:117
+#. i18n: file: devices/filenameschemedialog.ui:141
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtistAndTitle)
+#: po/rc.cpp:227 rc.cpp:227
+msgid ""
+"The track title (with <i>Track Artist</i>, if different to <i>Album Artist</"
+"i>)."
+msgstr ""
+"곡명 (만약 <i>음반연주자</i>와 다르다면, <i>곡 연주자</i>와 함께)."
+
+#. i18n: file: devices/filenameschemedialog.ui:144
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:230 rc.cpp:230
 msgid "Track Title (+Artist)"
 msgstr "곡 제목 (+연주자)"
 
-#. i18n: file: devices/filenameschemedialog.ui:124
+#. i18n: file: devices/filenameschemedialog.ui:151
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackNo)
+#: po/rc.cpp:233 rc.cpp:233
+msgid "The track number."
+msgstr "곡 번호."
+
+#. i18n: file: devices/filenameschemedialog.ui:154
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:184 rc.cpp:184
+#: po/rc.cpp:236 rc.cpp:236
 msgid "Track #"
 msgstr "곡 #"
 
-#. i18n: file: devices/filenameschemedialog.ui:131
+#. i18n: file: devices/filenameschemedialog.ui:161
+#. i18n: ectx: property (toolTip), widget (QPushButton, cdNo)
+#: po/rc.cpp:239 rc.cpp:239
+msgid ""
+"The album number of a multi-album album. Often compilations consist of "
+"several albums."
+msgstr ""
+"다수 음반의 음반 수.편집음반의 경우 대게 여러 장으로 구성됩니다."
+
+#. i18n: file: devices/filenameschemedialog.ui:164
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:187 rc.cpp:187
+#: po/rc.cpp:242 rc.cpp:242
 msgid "CD #"
 msgstr "CD #"
 
+#. i18n: file: devices/filenameschemedialog.ui:171
+#. i18n: ectx: property (toolTip), widget (QPushButton, year)
+#: po/rc.cpp:245 rc.cpp:245
+msgid "The year of the album's release."
+msgstr "음반발행연도."
+
+#. i18n: file: devices/filenameschemedialog.ui:181
+#. i18n: ectx: property (toolTip), widget (QPushButton, genre)
+#: po/rc.cpp:251 rc.cpp:251
+msgid "The genre of the album."
+msgstr "음반 장르."
+
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:196 rc.cpp:196
+#: po/rc.cpp:257 rc.cpp:257
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -4041,17 +4341,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
-#: po/rc.cpp:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
+#: po/rc.cpp:260 po/rc.cpp:353 po/rc.cpp:848 rc.cpp:260 rc.cpp:353 rc.cpp:848
 msgid "Type:"
 msgstr "형태:"
 
@@ -4063,16 +4363,18 @@ msgstr "형태:"
 #. i18n: ectx: property (text), widget (BuddyLabel, nameLabel)
 #. i18n: file: gui/serversettings.ui:63
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
-#: rc.cpp:638
+#: po/rc.cpp:263 po/rc.cpp:793 streams/streamdialog.cpp:71 rc.cpp:263
+#: rc.cpp:793
 msgid "Name:"
 msgstr "이름:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:205 rc.cpp:205
+#. i18n: file: gui/interfacesettings.ui:122
+#. i18n: ectx: property (title), widget (QGroupBox, optionsGroup)
+#: po/rc.cpp:266 rc.cpp:266 po/rc.cpp:551 rc.cpp:551
 msgid "Options"
-msgstr "옵션"
+msgstr "선택"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:88
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel_2)
@@ -4094,8 +4396,8 @@ msgstr "옵션"
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: network/proxysettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPortLabel)
-#: po/rc.cpp:211 po/rc.cpp:250 po/rc.cpp:409 po/rc.cpp:644 po/rc.cpp:708
-#: rc.cpp:211 rc.cpp:250 rc.cpp:409 rc.cpp:644 rc.cpp:708
+#: po/rc.cpp:272 po/rc.cpp:311 po/rc.cpp:473 po/rc.cpp:799 po/rc.cpp:860
+#: rc.cpp:272 rc.cpp:311 rc.cpp:473 rc.cpp:799 rc.cpp:860
 msgid "Port:"
 msgstr "포트:"
 
@@ -4111,7 +4413,7 @@ msgstr "포트:"
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2x)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:322
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel)
-#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
+#: po/rc.cpp:275 po/rc.cpp:293 po/rc.cpp:314 rc.cpp:275 rc.cpp:293 rc.cpp:314
 msgid "User:"
 msgstr "사용자:"
 
@@ -4123,7 +4425,7 @@ msgstr "사용자:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:218
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2x)
-#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:278 po/rc.cpp:296 rc.cpp:278 rc.cpp:296
 msgid "Domain:"
 msgstr "도메인:"
 
@@ -4135,7 +4437,7 @@ msgstr "도메인:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:248
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2)
-#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
+#: po/rc.cpp:284 po/rc.cpp:302 rc.cpp:284 rc.cpp:302
 msgid "Share:"
 msgstr "공유:"
 
@@ -4147,7 +4449,7 @@ msgstr "공유:"
 #. i18n: ectx: property (text), widget (QLabel, label_4)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:263
 #. i18n: ectx: property (text), widget (QLabel, label_4x)
-#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
+#: po/rc.cpp:287 po/rc.cpp:305 rc.cpp:287 rc.cpp:305
 msgid ""
 "<i><b>NOTE:</b> If you enter a password here, it will be stored "
 "<b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the "
@@ -4159,7 +4461,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:229 rc.cpp:229
+#: po/rc.cpp:290 rc.cpp:290
 msgid "Service name:"
 msgstr "서비스 이름:"
 
@@ -4171,19 +4473,19 @@ msgstr "서비스 이름:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:390
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
+#: po/rc.cpp:317 po/rc.cpp:326 rc.cpp:317 rc.cpp:326
 msgid "Folder:"
 msgstr "폴더:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:259 rc.cpp:259
+#: po/rc.cpp:320 rc.cpp:320
 msgid "Extra Options:"
-msgstr "기타 옵션:"
+msgstr "기타 선택:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:323 rc.cpp:323
 msgid ""
 "<i><b>NOTE:</b> Due to the way sshfs works, a suitable ssh-askpass "
 "application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter "
@@ -4194,7 +4496,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:329 rc.cpp:329
 msgid ""
 "<i><b>NOTE:</b> This dialog is only used to add remote devices (e.g. via "
 "Samba), or to access locally mounted folders. For normal media players, "
@@ -4207,110 +4509,98 @@ msgstr ""
 
 #. i18n: file: dynamic/dynamicpage.ui:26
 #. i18n: ectx: property (text), widget (StatusLabel, infoLabel)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:332 rc.cpp:332
 msgid "No dynamizer port defined in server settings."
 msgstr "서버 설정에 활동 포트가 없습니다."
 
 #. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:274 rc.cpp:274
+#: po/rc.cpp:335 rc.cpp:335
 msgid "Remote dynamizer is not running."
-msgstr "원격 활성화가 실행 중이 아님."
+msgstr "원격 활동이 실행 중이 아님."
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:277 rc.cpp:277
+#: po/rc.cpp:338 rc.cpp:338
 msgid "Name of Dynamic Rules"
 msgstr "새로운 동적 규정"
 
 #. i18n: file: dynamic/dynamicrules.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, editBtn)
-#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
+#: po/rc.cpp:344 streams/streamspage.cpp:62 rc.cpp:344
 msgid "Edit"
 msgstr "수정"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:350 rc.cpp:350
 msgid "About Rules"
 msgstr "규정에 대하여"
 
-#. i18n: file: dynamic/dynamicrule.ui:38
+#. i18n: file: dynamic/dynamicrule.ui:37
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:356 rc.cpp:356
+msgid "Include songs that match the following:"
+msgstr "아래와 맞는 음악 포함:"
+
+#. i18n: file: dynamic/dynamicrule.ui:42
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:359 rc.cpp:359
+msgid "Exclude songs that match the following:"
+msgstr "아래와 맞는 음악 제외:"
+
+#. i18n: file: dynamic/dynamicrule.ui:63
+#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
+#: po/rc.cpp:365 rc.cpp:365
+msgid "Artists similar to:"
+msgstr "비슷한 연주자:"
+
+#. i18n: file: dynamic/dynamicrule.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:295 rc.cpp:295
+#: po/rc.cpp:368 rc.cpp:368
 msgid "Album Artist:"
 msgstr "음반연주자:"
 
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
-msgid "Album:"
-msgstr "음반:"
-
-#. i18n: file: dynamic/dynamicrule.ui:103
+#. i18n: file: dynamic/dynamicrule.ui:141
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:310 rc.cpp:310
+#: po/rc.cpp:383 rc.cpp:383
 msgid "From Year:"
 msgstr "시작 연도:"
 
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#: po/rc.cpp:386 po/rc.cpp:392 rc.cpp:386 rc.cpp:392
 msgid "Any"
 msgstr "모두"
 
-#. i18n: file: dynamic/dynamicrule.ui:126
+#. i18n: file: dynamic/dynamicrule.ui:164
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:316 rc.cpp:316
+#: po/rc.cpp:389 rc.cpp:389
 msgid "To Year:"
 msgstr "마지막 연도:"
 
-#. i18n: file: dynamic/dynamicrule.ui:149
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:322 rc.cpp:322
-msgid "Exact match:"
-msgstr "정확한 맞춤:"
-
-#. i18n: file: dynamic/dynamicrule.ui:173
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:328 rc.cpp:328
-msgid "Include songs that match the following:"
-msgstr "아래와 맞는 음악 포함:"
-
-#. i18n: file: dynamic/dynamicrule.ui:178
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:331 rc.cpp:331
-msgid "Exclude songs that match the following:"
-msgstr "아래와 맞는 음악 제외:"
+#. i18n: file: dynamic/dynamicrule.ui:187
+#. i18n: ectx: property (text), widget (QCheckBox, exactCheck)
+#: po/rc.cpp:395 rc.cpp:395
+msgid "Exact match"
+msgstr "정확한 맞춤"
 
-#. i18n: file: dynamic/dynamicrule.ui:186
-#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:334 rc.cpp:334
-msgid "Artists similar to:"
-msgstr "비슷한 연주자:"
-
-#. i18n: file: dynamic/dynamicrule.ui:236
+#. i18n: file: dynamic/dynamicrule.ui:231
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:337 rc.cpp:337
+#: po/rc.cpp:398 rc.cpp:398
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr "<i><b>참고</b> 찾고자 하는 태그값만 입력합니다. </i>"
 
-#. i18n: file: dynamic/dynamicrule.ui:262
+#. i18n: file: dynamic/dynamicrule.ui:260
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:340 rc.cpp:340
+#: po/rc.cpp:401 rc.cpp:401
 msgid ""
 "<i><b>NOTE</b> For genre, end string with an asterisk to match various "
 "genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. </i>"
@@ -4318,69 +4608,63 @@ msgstr ""
 "<i><b>참고</b> 장르에서 별표(*)로 끝나는 문자열은 다양한 장르를 포함합니다. "
 "예) 'rock*'은 'Hard Rock'과 'Rock and Roll'을 포함. </i>"
 
-#. i18n: file: gui/coverdialog.ui:23
-#. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:343 rc.cpp:343
-msgid "<html><head/><body><p>Cancel current query</p></body></html>"
-msgstr "<html><head/><body><p>지금의 조회를 취소</p></body></html>"
-
-#. i18n: file: gui/coverdialog.ui:37
+#. i18n: file: gui/coverdialog.ui:30
 #. i18n: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:349 rc.cpp:349
-msgid "<html><head/><body><p>Add a local file</p></body></html>"
-msgstr "<html><head/><body><p>로컬 파일에 추가</p></body></html>"
-
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:352 po/rc.cpp:442 rc.cpp:352 rc.cpp:442
-msgid "Save downloaded covers in music folder:"
-msgstr "음악 폴더에 내려받은 표지 저장:"
-
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:355 po/rc.cpp:445 rc.cpp:355 rc.cpp:445
-msgid "Save downloaded lyrics in music folder:"
-msgstr "음악 폴더에 내려받은 가사저장:"
-
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#: po/rc.cpp:358 po/rc.cpp:448 rc.cpp:358 rc.cpp:448
-msgid "Save downloaded backdrops in music folder:"
-msgstr "음악 폴더에 내려받은 배경 저장:"
-
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:361 po/rc.cpp:451 rc.cpp:361 rc.cpp:451
-msgid "Save list of favorite streams in music folder:"
-msgstr "음악 폴더에 즐겨찾기 스트림 항목 저장:"
-
-#. i18n: file: gui/filesettings.ui:110
+#: po/rc.cpp:407 rc.cpp:407
+msgid "Add a local file"
+msgstr "로컬 파일 추가"
+
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#: po/rc.cpp:413 po/rc.cpp:506 rc.cpp:413 rc.cpp:506
+msgid "Save downloaded covers in music folder"
+msgstr "음악 폴더에 내려받은 표지 저장"
+
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#: po/rc.cpp:416 po/rc.cpp:509 rc.cpp:416 rc.cpp:509
+msgid "Save downloaded lyrics in music folder"
+msgstr "음악 폴더에 내려받은 가사저장"
+
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#: po/rc.cpp:419 po/rc.cpp:512 rc.cpp:419 rc.cpp:512
+msgid "Save downloaded backdrops in music folder"
+msgstr "음악 폴더에 내려받은 배경 저장"
+
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#: po/rc.cpp:422 po/rc.cpp:515 rc.cpp:422 rc.cpp:515
+msgid "Save list of favorite streams in music folder"
+msgstr "음악 폴더에 즐겨찾기 스트림 항목 저장"
+
+#. i18n: file: gui/filesettings.ui:79
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:425 rc.cpp:425
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, lyrics, or "
 "backdrops, within the music folder, and you do not have write access to this "
@@ -4393,13 +4677,24 @@ msgid ""
 msgstr ""
 "<i><b>참고:</b> 칸타타에서 쓰기 권한이 없는 음악 폴더에 음반 표지, 가사 또는 "
 "배경을 저장하면, 개인 캐시 폴더에 대신 저장하게 됩니다. 하지만 스트림은 쓰기 "
-"권한이 없다면, 음악 폴더에 저장된 스트림을 보고 연주할 수만 있으며 추가하거나"
-" 수정할 수는 없습니다. 스트림을 음악 폴더에 저장하지 않으면, 로컬 설정 폴더에"
-" 저장되며 해당 사용자만 접근할 수 있습니다.</i>"
+"권한이 없다면, 음악 폴더에 저장된 스트림을 보고 연주할 수만 있으며 추가하거"
+"나 수정할 수는 없습니다. 스트림을 음악 폴더에 저장하지 않으면, 로컬 설정 폴더"
+"에 저장되며 해당 사용자만 접근할 수 있습니다.</i>"
 
-#. i18n: file: gui/filesettings.ui:145
+#. i18n: file: gui/filesettings.ui:108
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:428 rc.cpp:428
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. (i.e. 'Artist/Album/Tracks')"
+"</i>"
+msgstr ""
+"<i><b>참고:</b> 두 단계 이상이면 배경이나 음반 이미지를 음악 폴더에 저장합니"
+"다. (즉, '연주자/음반/곡')</i>"
+
+#. i18n: file: gui/filesettings.ui:140
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:431 rc.cpp:431
 msgid ""
 "<i><b>NOTE:</b> If you change the location where streams are stored (i.e. "
 "you toggle the 'Save list of favorite streams in music folder' option), then "
@@ -4415,19 +4710,19 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:370 rc.cpp:370
+#: po/rc.cpp:434 rc.cpp:434
 msgid "Cantata First Run"
 msgstr "처음으로 칸타타 실행"
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:373 rc.cpp:373
+#: po/rc.cpp:437 rc.cpp:437
 msgid "Welcome to Cantata"
 msgstr "칸타타로 맞이합니다"
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:440 rc.cpp:440
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4447,13 +4742,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:379 rc.cpp:379
+#: po/rc.cpp:443 rc.cpp:443
 msgid "<html><head/><body><p>Welcome to Cantata</p></body></html>"
 msgstr "<html><head/><body><p>칸타타로 맞이합니다</p></body></html>"
 
 #. i18n: file: gui/initialsettingswizard.ui:128
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:382 rc.cpp:382
+#: po/rc.cpp:446 rc.cpp:446
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4468,13 +4763,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:166
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:385 rc.cpp:385
+#: po/rc.cpp:449 rc.cpp:449
 msgid "Standard multi-user/server setup"
 msgstr "표준 다수 사용자/서버 설정"
 
 #. i18n: file: gui/initialsettingswizard.ui:179
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:388 rc.cpp:388
+#: po/rc.cpp:452 rc.cpp:452
 msgid ""
 "<i>Select this option if your music collection is shared between users, your "
 "MPD instance is running on another machine, or you already have a personal "
@@ -4483,28 +4778,28 @@ msgid ""
 "that MPD is already configured and running.</i>"
 msgstr ""
 "<i>음원을 다른 사용자와 공유하고 MPD가 다른 컴퓨터에서 실행되거나 이미 개인 "
-"설정이 되어 있다면, 이 옵션을 선택합니다. 따라서 MPD가 이미 설정이 되고 가동 "
-"중인 것을 확인해야 합니다.</i>"
+"설정이 되어 있다면, 이것을 선택합니다. MPD가 이미 설정이 되고 가동 중인 것을 "
+"확인해야 합니다.</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:211
 #. i18n: ectx: property (text), widget (QRadioButton, basic)
-#: po/rc.cpp:391 rc.cpp:391
+#: po/rc.cpp:455 rc.cpp:455
 msgid "Basic single user setup"
 msgstr "기본 단일 사용자 설정"
 
 #. i18n: file: gui/initialsettingswizard.ui:224
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
-#: po/rc.cpp:394 rc.cpp:394
+#: po/rc.cpp:458 rc.cpp:458
 msgid ""
 "<i>Select this option if your music collection is not shared with others, "
 "and you wish Cantata to configure and control the MPD instance.</i>"
 msgstr ""
-"<i>음원을 다른 사용자와 공유하지 않고 칸타타가 MPD를 설정하고 관리하려면, 이 "
-"옵션을 선택합니다.</i>"
+"<i>음원을 다른 사용자와 공유하지 않고 칸타타가 MPD를 설정하고 관리하려면, "
+"이것을 선택합니다.</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:397 rc.cpp:397
+#: po/rc.cpp:461 rc.cpp:461
 msgid ""
 "<html><head/><body><p>For more information on MPD itself, please refer to "
 "the MPD website <a href=\"http://www.musicpd.org\"><span style=\" text-"
@@ -4520,13 +4815,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:400 rc.cpp:400
+#: po/rc.cpp:464 rc.cpp:464
 msgid "Connection details"
 msgstr "연결 상세정보"
 
 #. i18n: file: gui/initialsettingswizard.ui:341
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:403 rc.cpp:403
+#: po/rc.cpp:467 rc.cpp:467
 msgid ""
 "The settings below are the basic settings required by Cantata. Please enter "
 "the relevant details, and use the 'Connect' button to test the connection."
@@ -4542,19 +4837,20 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: gui/serversettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
-#: po/rc.cpp:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
+#: po/rc.cpp:470 po/rc.cpp:796 rc.cpp:470 rc.cpp:796
 msgid "Host (or local socket):"
 msgstr "호스트 (또는 로컬소켓):"
 
 #. i18n: file: gui/initialsettingswizard.ui:494
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:421 rc.cpp:421
+#: po/rc.cpp:485 rc.cpp:485
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
-"lyrics, etc.</i>"
+"lyrics, etc. If you're MPD instance is on a remote host, you may set this to "
+"a HTTP URL.</i>"
 msgstr ""
-"<i><b>참고:</b> '음악 폴더' 설정은 음반표지나 가사 등을 찾기 위해 사용됩니다."
-"</i>"
+"<i><b>참고:</b> '음악 폴더' 설정은 음반표지나 가사 등을 찾기 위해 사용됩니"
+"다. 만약 MPD가 원격 호스트에 있다면 HTTP URL로 설정할 수 있습니다.</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:520
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
@@ -4564,35 +4860,35 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
 #. i18n: file: gui/serversettings.ui:225
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#: po/rc.cpp:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
+#: po/rc.cpp:488 po/rc.cpp:820 rc.cpp:488 rc.cpp:820
 msgid ""
 "<i><b>NOTE:</b> When using a local socket the full absolute path to the "
 "socket needs to be set. (Port number is not required.)</i>"
 msgstr ""
-"<i><b>참고:</b> 로컬소켓을 사용할 때는 절대경로로 설정되어야 합니다 (포트번"
-"호는 필요 없음).</i>"
+"<i><b>참고:</b> 로컬소켓을 사용할 때는 절대경로로 설정되어야 합니다 (포트번호"
+"는 필요 없음).</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:553
 #. i18n: ectx: property (text), widget (QLabel, label_13)
-#: po/rc.cpp:427 rc.cpp:427
+#: po/rc.cpp:491 rc.cpp:491
 msgid "Music folder"
 msgstr "음악 폴더"
 
 #. i18n: file: gui/initialsettingswizard.ui:576
 #. i18n: ectx: property (text), widget (QLabel, label_12)
-#: po/rc.cpp:430 rc.cpp:430
+#: po/rc.cpp:494 rc.cpp:494
 msgid "Please choose the folder containing your music collection."
 msgstr "음악 폴더를 선택합니다."
 
 #. i18n: file: gui/initialsettingswizard.ui:662
 #. i18n: ectx: property (text), widget (QLabel, label_6f)
-#: po/rc.cpp:436 rc.cpp:436
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Covers, Lyrics, and Streams"
 msgstr "음반표지, 가사와 스트림"
 
 #. i18n: file: gui/initialsettingswizard.ui:685
 #. i18n: ectx: property (text), widget (QLabel, label_5f)
-#: po/rc.cpp:439 rc.cpp:439
+#: po/rc.cpp:503 rc.cpp:503
 msgid ""
 "<p>Cantata will download missing covers, and lyrics, from the internet. "
 "Cantata also allows you to save a list of internet streams (e.g. Radio "
@@ -4604,9 +4900,9 @@ msgstr ""
 "라디오등 스트림 항목을 저장할 수도 있습니다.</p><p>이를 위해서, 관련 파일을 "
 "음악 폴더나 개인 캐시/설정 폴더에 저장할지를 확인해 주시기 바랍니다.</p>"
 
-#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: file: gui/initialsettingswizard.ui:758
 #. i18n: ectx: property (text), widget (QLabel, persNote)
-#: po/rc.cpp:454 rc.cpp:454
+#: po/rc.cpp:518 rc.cpp:518
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
 "the music folder, and you do not have write access to this folder, then "
@@ -4623,26 +4919,37 @@ msgstr ""
 "는 없습니다. 스트림을 음악 폴더에 저장하지 않으면, 로컬 설정 폴더에 저장되며 "
 "해당 사용자만 접근할 수 있습니다.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:824
-#. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:457 rc.cpp:457
+#. i18n: file: gui/initialsettingswizard.ui:784
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:521 rc.cpp:521
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. i.e. 'Artist/Album/Tracks'."
+"</i>"
+msgstr ""
+"<i><b>참고:</b> 두 단계 이상이면 배경이나 음반 이미지를 음악 폴더에 저장합니"
+"다. 즉, '연주자/음반/곡'</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:810
+#. i18n: ectx: property (text), widget (StateLabel, httpNote)
+#: po/rc.cpp:524 rc.cpp:524
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata "
 "currently cannot upload files to external HTTP servers. Therefore, the above "
-"settings should be left disabled.</i>"
+"settings should be left un-checked.</i>"
 msgstr ""
 "<i><b>참고:</b> '음악 폴더'가 HTTP 주소로 지정되어, 외부 HTTP 서버에 파일을 "
-"올릴 수 없습니다. 따라서 위의 설정은 사용하지 않도록 해야 합니다.</i>"
+"올릴 수 없습니다. 따라서 위의 설정은 사용하지 않아야 합니다.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:857
+#. i18n: file: gui/initialsettingswizard.ui:843
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:460 rc.cpp:460
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Finished!"
 msgstr "완료!"
 
-#. i18n: file: gui/initialsettingswizard.ui:880
+#. i18n: file: gui/initialsettingswizard.ui:866
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:463 rc.cpp:463
+#: po/rc.cpp:530 rc.cpp:530
 msgid ""
 "Cantata is now configured! If you wish to further configure Cantata (to add "
 "extra MPD hosts, etc) then Canta's configuration dialog may be accessed from "
@@ -4651,9 +4958,9 @@ msgstr ""
 "이제 칸타타가 설정되었습니다! MPD 서버를 추가하는 등의 설정을 더 하려면, 칸타"
 "타 메인화면의 오른쪽 위에 있는 단추를 선택하면 설정 대화상자가 나옵니다."
 
-#. i18n: file: gui/initialsettingswizard.ui:918
+#. i18n: file: gui/initialsettingswizard.ui:904
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:466 rc.cpp:466
+#: po/rc.cpp:533 rc.cpp:533
 msgid ""
 "<b>Warning:</b> You are not currently a member of the 'users' group. Cantata "
 "will function better (saving of album covers, lyrics, etc. with the correct "
@@ -4665,291 +4972,404 @@ msgstr ""
 "면 음반표지 및 가사를 저장하는 등의 기능을 더 잘 수행합니다. 만약 본인이나 관"
 "리자가 사용자를 이 그룹에 추가하였다면 다시 로그인을 해야 합니다."
 
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:36
+#. i18n: ectx: attribute (title), widget (QWidget, sidebarTab)
+#: po/rc.cpp:536 rc.cpp:536
+msgid "Sidebar"
+msgstr "옆줄"
+
+#. i18n: file: gui/interfacesettings.ui:42
+#. i18n: ectx: property (title), widget (QGroupBox, viewsGroup)
+#: po/rc.cpp:539 rc.cpp:539
+msgid "Views"
+msgstr "보기"
+
+#. i18n: file: gui/interfacesettings.ui:48
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:542 rc.cpp:542
+msgid "Use the checkboxes below to configure the list of active views."
+msgstr "보기를 선택하려면 아래 항목을 사용합니다."
+
+#. i18n: file: gui/interfacesettings.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, sbPlayQueueLabel)
+#: po/rc.cpp:545 rc.cpp:545
+msgid ""
+"<i><b>NOTE:</b> By default, the play queue appears to the side of the other "
+"views. If you enable the option above, then it will be merged into the "
+"sidebar as per other views.</i>"
+msgstr ""
+"<i><b>참고:</b> 기본적으로 연주순서는 다른 보기의 옆에 보입니다. 위를 선택한 "
+"경우에는, 다른 보기처럼 옆막대에 합쳐집니다.</i>"
+
+#. i18n: file: gui/interfacesettings.ui:106
+#. i18n: ectx: property (text), widget (StateLabel, sbInfoLabel)
+#: po/rc.cpp:548 rc.cpp:548
+msgid ""
+"<i><b>NOTE:</b> By default, the 'Info' (current song information) view is "
+"accessible by pressing its icon in the main toolbar. If you enable the "
+"option above, then it will be merged into the sidebar as per other views.</i>"
+msgstr ""
+"<i><b>참고:</b> 기본적으로 '정보'(지금 곡 정보) 보기는 주 메뉴의 아이콘을 "
+"누르면 사용할 수 있습니다. 위를 선택한 경우에는, 다른 보기처럼 옆막대에 합쳐"
+"집니다.</i>"
+
+#. i18n: file: gui/interfacesettings.ui:144
+#. i18n: ectx: property (text), widget (BuddyLabel, sbPositionLabel)
+#: po/rc.cpp:557 rc.cpp:557
+msgid "Position:"
+msgstr "위치:"
+
+#. i18n: file: gui/interfacesettings.ui:157
+#. i18n: ectx: property (text), widget (QCheckBox, sbIconsOnly)
+#: po/rc.cpp:560 rc.cpp:560
+msgid "Only show icons, no text"
+msgstr "아이콘만 보임"
+
+#. i18n: file: gui/interfacesettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, sbMonoIcons)
+#: po/rc.cpp:563 rc.cpp:563
+msgid "Use monochrome icons"
+msgstr "단색 아이콘 사용"
+
+#. i18n: file: gui/interfacesettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, sbAutoHide)
+#: po/rc.cpp:566 rc.cpp:566
+msgid "Auto-hide"
+msgstr "자동 숨김"
+
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#: po/rc.cpp:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
+#: po/rc.cpp:575 po/rc.cpp:594 rc.cpp:575 rc.cpp:594
 msgid "Covers:"
 msgstr "표지:"
 
-#. i18n: file: gui/interfacesettings.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:478 rc.cpp:478
-msgid "Show artist images:"
-msgstr "연주자이미지 보기:"
+#. i18n: file: gui/interfacesettings.ui:219
+#. i18n: ectx: property (text), widget (QCheckBox, libraryArtistImage)
+#: po/rc.cpp:578 rc.cpp:578
+msgid "Show artist images"
+msgstr "연주자이미지 보기"
 
-#. i18n: file: gui/interfacesettings.ui:81
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:481 rc.cpp:481
-msgid "Show album year:"
-msgstr "앨범연도 보기:"
+#. i18n: file: gui/interfacesettings.ui:226
+#. i18n: ectx: property (text), widget (QCheckBox, libraryYear)
+#: po/rc.cpp:581 rc.cpp:581
+msgid "Show album year"
+msgstr "앨범연도 보기"
 
-#. i18n: file: gui/interfacesettings.ui:123
+#. i18n: file: gui/interfacesettings.ui:258
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:484 rc.cpp:484
+#: po/rc.cpp:584 rc.cpp:584
 msgid ""
 "<i><b>NOTE:</b> When looking for artist images, Cantata will look for either "
 "artist.jpg, artist.png, 'Artist'.jpg, or 'Artist'.png,\n"
 "within the folder of the current track, or within its parent folder. If no "
-"image is found, Cantata will attempt to download one. When the image is "
-"displayed, it will be cropped (either top/bottom, or left/right) to provide "
-"a square image.</i>"
+"image is found, Cantata will attempt to download one.</i>"
 msgstr ""
 "<i><b>참고:</b> 연주자이미지를 찾을 때, 지금 곡이 있는 폴더나 상위 폴더의 "
 "artist.jpg, artist.png, '연주자'.jpg 또는 '연주자'.png\n"
-"를 찾습니다.만약 이미지를 찾지 못하면 내려받기를 시도합니다. 정사각형의 이미"
-"지를 보이기 위해서 상하 또는 좌우가 잘릴 수 있습니다.<i>"
+"를 찾습니다.만약 이미지를 찾지 못하면 내려받기를 시도합니다.<i>"
 
-#. i18n: file: gui/interfacesettings.ui:172
+#. i18n: file: gui/interfacesettings.ui:307
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:497 rc.cpp:497
+#: po/rc.cpp:597 rc.cpp:597
 msgid "Sort albums:"
 msgstr "음반 정렬:"
 
-#. i18n: file: gui/interfacesettings.ui:183
+#. i18n: file: gui/interfacesettings.ui:318
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:500 rc.cpp:500
+#: po/rc.cpp:600 rc.cpp:600
 msgid "Album/Artist"
 msgstr "음반/연주자"
 
-#. i18n: file: gui/interfacesettings.ui:188
+#. i18n: file: gui/interfacesettings.ui:323
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:503 rc.cpp:503
+#: po/rc.cpp:603 rc.cpp:603
 msgid "Artist/Album"
 msgstr "연주자/음반"
 
-#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: file: gui/interfacesettings.ui:328
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:506 rc.cpp:506
+#: po/rc.cpp:606 rc.cpp:606
 msgid "Artist/Year/Album"
 msgstr "연주자/연도/음반"
 
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#: po/rc.cpp:515 po/rc.cpp:545 rc.cpp:515 rc.cpp:545
-msgid "Initially collapse albums:"
-msgstr "처음에 음반 펼치지 않기:"
-
-#. i18n: file: gui/interfacesettings.ui:242
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#: po/rc.cpp:615 po/rc.cpp:645 rc.cpp:615 rc.cpp:645
+msgid "Initially collapse albums"
+msgstr "처음에 음반 펼치지 않기"
+
+#. i18n: file: gui/interfacesettings.ui:367
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:518 rc.cpp:518
+#: po/rc.cpp:618 rc.cpp:618
 msgid "Other Views"
 msgstr "다른 보기"
 
-#. i18n: file: gui/interfacesettings.ui:251
+#. i18n: file: gui/interfacesettings.ui:376
 #. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
-#: po/rc.cpp:521 rc.cpp:521
+#: po/rc.cpp:621 rc.cpp:621
 msgid "Folder view style:"
 msgstr "폴더 보기:"
 
-#. i18n: file: gui/interfacesettings.ui:264
+#. i18n: file: gui/interfacesettings.ui:389
 #. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
-#: po/rc.cpp:524 rc.cpp:524
+#: po/rc.cpp:624 rc.cpp:624
 msgid "Streams view style:"
 msgstr "스트림 보기:"
 
-#. i18n: file: gui/interfacesettings.ui:277
+#. i18n: file: gui/interfacesettings.ui:402
 #. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
-#: po/rc.cpp:527 rc.cpp:527
+#: po/rc.cpp:627 rc.cpp:627
 msgid "Online view style:"
 msgstr "온라인 보기:"
 
-#. i18n: file: gui/interfacesettings.ui:290
+#. i18n: file: gui/interfacesettings.ui:415
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:530 rc.cpp:530
+#: po/rc.cpp:630 rc.cpp:630
 msgid "Devices view style:"
 msgstr "장치 보기:"
 
-#. i18n: file: gui/interfacesettings.ui:324
-#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:539 rc.cpp:539
-msgid "Table"
-msgstr "항목으로 따로"
-
-#. i18n: file: gui/interfacesettings.ui:354
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueAutoExpandLabel)
-#: po/rc.cpp:548 rc.cpp:548
-msgid "Automatically expand current album:"
-msgstr "지금 음반을 자동으로 펼치기:"
-
-#. i18n: file: gui/interfacesettings.ui:371
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueScrollLabel)
-#: po/rc.cpp:551 rc.cpp:551
-msgid "Scroll to current track:"
-msgstr "지금 곡으로 이동:"
-
-#. i18n: file: gui/interfacesettings.ui:384
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueBackgroundLabel)
-#: po/rc.cpp:554 rc.cpp:554
-msgid "Use current album cover as background:"
-msgstr "지금 음반 표지를 배경으로 사용:"
-
-#. i18n: file: gui/interfacesettings.ui:397
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueConfirmClearLabel)
-#: po/rc.cpp:557 rc.cpp:557
-msgid "Prompt before clearing:"
-msgstr "지우기 전에 물어보기:"
-
-#. i18n: file: gui/interfacesettings.ui:411
+#. i18n: file: gui/interfacesettings.ui:469
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueAutoExpand)
+#: po/rc.cpp:648 rc.cpp:648
+msgid "Automatically expand current album"
+msgstr "지금 음반을 자동으로 펼치기"
+
+#. i18n: file: gui/interfacesettings.ui:476
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueScroll)
+#: po/rc.cpp:651 rc.cpp:651
+msgid "Scroll to current track"
+msgstr "지금 곡으로 이동"
+
+#. i18n: file: gui/interfacesettings.ui:483
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueConfirmClear)
+#: po/rc.cpp:654 rc.cpp:654
+msgid "Prompt before clearing"
+msgstr "지우기 전에 물어보기"
+
+#. i18n: file: gui/interfacesettings.ui:509
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_cover)
+#: po/rc.cpp:663 rc.cpp:663
+msgid "Current album cover"
+msgstr "현재 음반표지"
+
+#. i18n: file: gui/interfacesettings.ui:638
 #. i18n: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:560 rc.cpp:560
+#: po/rc.cpp:682 rc.cpp:682
 msgid "External"
 msgstr "외부"
 
-#. i18n: file: gui/interfacesettings.ui:417
-#. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:563 rc.cpp:563
-msgid "Show icon in notification area:"
-msgstr "알림 영역에 아이콘 보이기:"
-
-#. i18n: file: gui/interfacesettings.ui:437
-#. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:566 rc.cpp:566
-msgid "Minimize to notification area when closed:"
-msgstr "닫으면 알림 영역으로 최소화:"
-
-#. i18n: file: gui/interfacesettings.ui:457
-#. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:569 rc.cpp:569
-msgid "Show popup messages when changing tracks:"
-msgstr "곡이 바뀌면 팝업 표시:"
-
-#. i18n: file: gui/interfacesettings.ui:475
+#. i18n: file: gui/interfacesettings.ui:644
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayPopup)
+#: po/rc.cpp:685 rc.cpp:685
+msgid "Show popup messages when changing tracks"
+msgstr "곡이 바뀌면 팝업 표시"
+
+#. i18n: file: gui/interfacesettings.ui:654
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayCheckBox)
+#: po/rc.cpp:688 rc.cpp:688
+msgid "Show icon in notification area"
+msgstr "알림 영역에 아이콘 보이기"
+
+#. i18n: file: gui/interfacesettings.ui:664
+#. i18n: ectx: property (text), widget (QCheckBox, minimiseOnClose)
+#: po/rc.cpp:691 rc.cpp:691
+msgid "Minimize to notification area when closed"
+msgstr "닫으면 알림 영역으로 최소화"
+
+#. i18n: file: gui/interfacesettings.ui:671
+#. i18n: ectx: property (title), widget (QGroupBox, startupState)
+#: po/rc.cpp:694 rc.cpp:694
+msgid "On Start-up"
+msgstr "시작할 때"
+
+#. i18n: file: gui/interfacesettings.ui:677
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateShow)
+#: po/rc.cpp:697 rc.cpp:697
+msgid "Show main window"
+msgstr "창 보이기"
+
+#. i18n: file: gui/interfacesettings.ui:684
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateHide)
+#: po/rc.cpp:700 rc.cpp:700
+msgid "Hide main window"
+msgstr "창 숨기기"
+
+#. i18n: file: gui/interfacesettings.ui:691
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateRestore)
+#: po/rc.cpp:703 rc.cpp:703
+msgid "Restore previous state"
+msgstr "이전 상태로"
+
+#. i18n: file: gui/interfacesettings.ui:715
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:572 rc.cpp:572
+#: po/rc.cpp:706 rc.cpp:706
 msgid "General"
 msgstr "일반"
 
-#. i18n: file: gui/interfacesettings.ui:486
-#. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:575 rc.cpp:575
-msgid "Group single track albums:"
-msgstr "한 곡 음반 묶기:"
-
-#. i18n: file: gui/interfacesettings.ui:503
-#. i18n: ectx: property (text), widget (BuddyLabel, useComposerLabel)
-#: po/rc.cpp:578 rc.cpp:578
-msgid "Group albums by composer:"
-msgstr "작곡가 음반 묶기:"
-
-#. i18n: file: gui/interfacesettings.ui:520
-#. i18n: ectx: property (text), widget (BuddyLabel, groupMultipleLabel)
-#: po/rc.cpp:581 rc.cpp:581
-msgid "Multiple artist albums:"
-msgstr "여러 연주자 음반:"
-
-#. i18n: file: gui/interfacesettings.ui:533
-#. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:584 rc.cpp:584
-msgid "Show delete action in context menus:"
-msgstr "메뉴에 지우기 보이기:"
-
-#. i18n: file: gui/interfacesettings.ui:550
-#. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:587 rc.cpp:587
-msgid "Enforce single-click activation of items:"
-msgstr "한 번 클릭 사용:"
+#. i18n: file: gui/interfacesettings.ui:726
+#. i18n: ectx: property (text), widget (QCheckBox, groupSingle)
+#: po/rc.cpp:709 rc.cpp:709
+msgid "Group single track albums"
+msgstr "한 곡 음반 묶기"
+
+#. i18n: file: gui/interfacesettings.ui:733
+#. i18n: ectx: property (text), widget (QCheckBox, useComposer)
+#: po/rc.cpp:712 rc.cpp:712
+msgid "Group albums by composer"
+msgstr "작곡가 음반 묶기"
+
+#. i18n: file: gui/interfacesettings.ui:740
+#. i18n: ectx: property (text), widget (QCheckBox, groupMultiple)
+#: po/rc.cpp:715 rc.cpp:715
+msgid "Group multiple artist albums under 'Various Artists'"
+msgstr "'여러 연주자'로 묶음"
 
-#. i18n: file: gui/interfacesettings.ui:591
+#. i18n: file: gui/interfacesettings.ui:747
+#. i18n: ectx: property (text), widget (QCheckBox, fetchCovers)
+#: po/rc.cpp:718 rc.cpp:718
+msgid "Fetch missing covers from Last.fm"
+msgstr "음반표지가 없으면 Last.fm에서 가져오기"
+
+#. i18n: file: gui/interfacesettings.ui:754
+#. i18n: ectx: property (text), widget (QCheckBox, cacheScaledCovers)
+#: po/rc.cpp:721 rc.cpp:721
+msgid "Cache scaled covers"
+msgstr "비율표지 캐시"
+
+#. i18n: file: gui/interfacesettings.ui:761
+#. i18n: ectx: property (text), widget (QCheckBox, showDeleteAction)
+#: po/rc.cpp:724 rc.cpp:724
+msgid "Show delete action in context menus"
+msgstr "메뉴에 지우기 보이기"
+
+#. i18n: file: gui/interfacesettings.ui:768
+#. i18n: ectx: property (text), widget (QCheckBox, forceSingleClick)
+#: po/rc.cpp:727 rc.cpp:727
+msgid "Enforce single-click activation of items"
+msgstr "한 번 클릭 사용"
+
+#. i18n: file: gui/interfacesettings.ui:775
+#. i18n: ectx: property (text), widget (BuddyLabel, langLabel)
+#: po/rc.cpp:730 rc.cpp:730
+msgid "Language:"
+msgstr "언어:"
+
+#. i18n: file: gui/interfacesettings.ui:806
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:590 rc.cpp:590
+#: po/rc.cpp:733 rc.cpp:733
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
 msgstr ""
 "<i><b>참고:</b> '한 번 클릭 사용' 설정을 바꾸면 다시 시작해야 합니다.</i>"
 
-#. i18n: file: gui/mainwindow.ui:287
+#. i18n: file: gui/interfacesettings.ui:835
+#. i18n: ectx: property (text), widget (StateLabel, langNoteLabel)
+#: po/rc.cpp:736 rc.cpp:736
+msgid ""
+"<i><b>NOTE:</b> Changing the language setting will require a re-start of "
+"Cantata.</i>"
+msgstr ""
+"<i><b>참고:</b> 언어 설정을 바꾸면 다시 시작해야 합니다.</i>"
+
+#. i18n: file: gui/mainwindow.ui:298
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:593 rc.cpp:593
+#: po/rc.cpp:739 rc.cpp:739
 msgid "[Dynamic]"
 msgstr "[동적]"
 
-#. i18n: file: gui/playbacksettings.ui:20
+#. i18n: file: gui/playbacksettings.ui:38
+#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
+#: po/rc.cpp:745 rc.cpp:745
+msgid "Fadeout on stop:"
+msgstr "정지할 때 페이드아웃:"
+
+#. i18n: file: gui/playbacksettings.ui:48
+#. i18n: ectx: property (suffix), widget (QSpinBox, stopFadeDuration)
+#: po/rc.cpp:748 rc.cpp:748
+msgid " ms"
+msgstr " ms"
+
+#. i18n: file: gui/playbacksettings.ui:58
+#. i18n: ectx: property (text), widget (QCheckBox, stopOnExit)
+#: po/rc.cpp:754 rc.cpp:754
+msgid "Stop playback on exit"
+msgstr "빠져나가면 연주 정지"
+
+#. i18n: file: gui/playbacksettings.ui:65
+#. i18n: ectx: property (text), widget (QCheckBox, stopDynamizerOnExit)
+#: po/rc.cpp:757 rc.cpp:757
+msgid "Stop dynamizer on exit"
+msgstr "빠져나가면 활동 정지"
+
+#. i18n: file: gui/playbacksettings.ui:72
+#. i18n: ectx: property (text), widget (QCheckBox, inhibitSuspend)
+#: po/rc.cpp:760 rc.cpp:760
+msgid "Inhibit suspend whilst playing"
+msgstr "연주 중에 절전기능 사용 않기"
+
+#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:763 rc.cpp:763
+msgid ""
+"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
+"shown allowing you to choose whether to stop playback now, or after the "
+"current track.</i>"
+msgstr ""
+"<i><b>참고:</b> 정지 단추를 누르고 있으면, 바로 정지할지 지금 곡 다음에 정지"
+"할지를 선택하는 메뉴가 보입니다.</i>"
+
+#. i18n: file: gui/playbacksettings.ui:108
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:596 rc.cpp:596
+#: po/rc.cpp:766 rc.cpp:766
 msgid "Output"
 msgstr "출력"
 
-#. i18n: file: gui/playbacksettings.ui:41
+#. i18n: file: gui/playbacksettings.ui:129
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:602 rc.cpp:602
-msgid "Crossfading:"
-msgstr "크로스페이딩:"
-
-#. i18n: file: gui/playbacksettings.ui:51
-#. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:605 rc.cpp:605
-msgid " seconds"
+#: po/rc.cpp:772 rc.cpp:772
+msgid "Crossfade between tracks:"
+msgstr "곡 사이 크로스페이드:"
+
+#. i18n: file: gui/playbacksettings.ui:139
+#. i18n: ectx: property (suffix), widget (QSpinBox, crossfading)
+#: po/rc.cpp:775 rc.cpp:775
+msgid " s"
 msgstr " 초"
 
-#. i18n: file: gui/playbacksettings.ui:61
+#. i18n: file: gui/playbacksettings.ui:152
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:608 rc.cpp:608
+#: po/rc.cpp:781 rc.cpp:781
 msgid "Replay gain:"
 msgstr "리플레이게인:"
 
-#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: file: gui/playbacksettings.ui:195
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:611 rc.cpp:611
+#: po/rc.cpp:784 rc.cpp:784
 msgid "About replay gain"
 msgstr "리플레이게인에 대하여"
 
-#. i18n: file: gui/playbacksettings.ui:104
+#. i18n: file: gui/playbacksettings.ui:204
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:614 rc.cpp:614
-msgid "Devices:"
-msgstr "장치:"
-
-#. i18n: file: gui/playbacksettings.ui:141
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:620 rc.cpp:620
-msgid "Fadeout on stop:"
-msgstr "정지할 때 페이드아웃:"
-
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:623 rc.cpp:623
-msgid "Stop playback on exit:"
-msgstr "빠져나가면 연주 정지:"
-
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:626 rc.cpp:626
-msgid "Stop dynamizer on exit:"
-msgstr "빠져나가면 활동 정지:"
-
-#. i18n: file: gui/playbacksettings.ui:184
-#. i18n: ectx: property (text), widget (BuddyLabel, inhibitSuspendLabel)
-#: po/rc.cpp:629 rc.cpp:629
-msgid "Inhibit suspend whilst playing:"
-msgstr "연주 중에 절전기능 사용 않기:"
-
-#. i18n: file: gui/playbacksettings.ui:217
-#. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:632 rc.cpp:632
-msgid ""
-"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
-"shown allowing you to choose whether to stop playback now, or after the "
-"current track.</i>"
-msgstr ""
-"<i><b>참고:</b> 정지 단추를 누르고 있으면, 바로 정지할지 지금 곡 다음에 정지"
-"할지를 선택하는 메뉴가 보입니다.</i>"
+#: po/rc.cpp:787 rc.cpp:787
+msgid "Use the checkboxes below to control the active outputs."
+msgstr "출력을 선택하려면 아래 항목을 켭니다."
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:635 rc.cpp:635
+#: po/rc.cpp:790 rc.cpp:790
 msgid "Collection:"
 msgstr "음원:"
 
@@ -4961,25 +5381,25 @@ msgstr "음원:"
 #. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
 #. i18n: file: gui/serversettings.ui:338
 #. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
-#: po/rc.cpp:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
+#: po/rc.cpp:808 po/rc.cpp:829 rc.cpp:808 rc.cpp:829
 msgid "Cover filename:"
 msgstr "표지 파일이름:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:656 rc.cpp:656
+#: po/rc.cpp:811 rc.cpp:811
 msgid "Dynamizer port:"
 msgstr "활동 포트:"
 
 #. i18n: file: gui/serversettings.ui:168
 #. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
-#: po/rc.cpp:659 rc.cpp:659
+#: po/rc.cpp:814 rc.cpp:814
 msgid "HTTP stream URL:"
 msgstr "HTTP 스트림 URL:"
 
 #. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:662 rc.cpp:662
+#: po/rc.cpp:817 rc.cpp:817
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art "
 "(either the value specified above, or <code>cover.jpg / cover.png</code> if "
@@ -4993,7 +5413,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:277
 #. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
-#: po/rc.cpp:668 rc.cpp:668
+#: po/rc.cpp:823 rc.cpp:823
 msgid ""
 "<i><b>NOTE:</b> 'HTTP Stream URL' is only of use if you have MPD configured "
 "to output to a HTTP stream, and you wish Cantata to be able to play that "
@@ -5004,7 +5424,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:677 rc.cpp:677
+#: po/rc.cpp:832 rc.cpp:832
 msgid ""
 "<i><b>NOTE:</b> If you change the 'Music folder' setting, then you will need "
 "to manually update the music database. This can be performed by pressing the "
@@ -5016,29 +5436,23 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:379
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel_2)
-#: po/rc.cpp:680 rc.cpp:680
+#: po/rc.cpp:835 rc.cpp:835
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
 msgstr ""
-"<i><b>참고:</b> '표지 파일이름, 다음에 칸타타'에 설정이 되어 있지 않으면 기"
-"본 <code>cover<code>를 사용합니다. </i>"
+"<i><b>참고:</b> '표지 파일이름'에 설정이 되어 있지 않으면 기본 "
+"<code>cover<code>를 사용합니다 </i>"
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:683 rc.cpp:683
+#: po/rc.cpp:838 rc.cpp:838
 msgid "Network interface:"
 msgstr "네트워크 연결:"
 
-#. i18n: file: http/httpserversettings.ui:38
-#. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:686 rc.cpp:686
-msgid "Current URL:"
-msgstr "현재 URL:"
-
-#. i18n: file: http/httpserversettings.ui:73
+#. i18n: file: http/httpserversettings.ui:57
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:689 rc.cpp:689
+#: po/rc.cpp:841 rc.cpp:841
 msgid ""
 "<i><b>NOTE:</b> MPD usually only plays songs that are stored within its "
 "folders. Cantata contains a minimal HTTP server that can be used to serve "
@@ -5055,34 +5469,31 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:693 rc.cpp:693
+#: po/rc.cpp:845 rc.cpp:845
 msgid "Mode:"
 msgstr "모드:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:699 rc.cpp:699
+#: po/rc.cpp:851 rc.cpp:851
 msgid "HTTP Proxy"
 msgstr "HTTP 프락시"
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:702 rc.cpp:702
+#: po/rc.cpp:854 rc.cpp:854
 msgid "SOCKS Proxy"
 msgstr "SOCKS 프락시"
 
 #. i18n: file: online/onlinesettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:717 rc.cpp:717
-msgid ""
-"The following is a list of online providers, to hide a provider simply un-"
-"check its entry in this list."
-msgstr "아래는 온라인제공자로, 해당 카테고리를 숨기려면 아래 항목에서 선택"
-"하지 않습니다."
+#: po/rc.cpp:869 rc.cpp:869
+msgid "Use the checkboxes below to configure the list of active services."
+msgstr "서비스를 선택하려면 아래 항목을 사용합니다."
 
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:723 rc.cpp:723
+#: po/rc.cpp:875 rc.cpp:875
 msgid ""
 "You can listen for free without an account, but Premium members can listen "
 "to higher quality streams without advertisements. Visit <a href=\"http://www."
@@ -5095,38 +5506,38 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:726 rc.cpp:726
+#: po/rc.cpp:878 rc.cpp:878
 msgid "Premium Account"
 msgstr "프리미엄 계정"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:735 rc.cpp:735
+#: po/rc.cpp:887 rc.cpp:887
 msgid "Stream type:"
 msgstr "스트림 형식:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:738 rc.cpp:738
+#: po/rc.cpp:890 rc.cpp:890
 msgid "Status:"
 msgstr "상태:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:109
 #. i18n: ectx: property (text), widget (QPushButton, loginButton)
-#: po/rc.cpp:741 streams/digitallyimportedsettings.cpp:130
-#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
+#: po/rc.cpp:893 streams/digitallyimportedsettings.cpp:131
+#: streams/digitallyimportedsettings.cpp:137 rc.cpp:893
 msgid "Login"
 msgstr "로그인"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:747 rc.cpp:747
+#: po/rc.cpp:899 rc.cpp:899
 msgid "Session expiry:"
 msgstr "세션 만료:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:151
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:750 rc.cpp:750
+#: po/rc.cpp:902 rc.cpp:902
 msgid ""
 "<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
 "RockRadio.com, and Sky.fm</i>"
@@ -5136,7 +5547,7 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:161
 #. i18n: ectx: property (text), widget (QLabel, note2Label)
-#: po/rc.cpp:753 rc.cpp:753
+#: po/rc.cpp:905 rc.cpp:905
 msgid ""
 "<i><b>NOTE:</b> If you enter account details, then a 'DI' status item will "
 "appear under the list of streams. This will indicate if you are logged in or "
@@ -5147,29 +5558,25 @@ msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:756 rc.cpp:756
-msgid ""
-"The following is a list of the top-level stream categories, to hide a "
-"category simply un-check its entry in this list."
-msgstr ""
-"아래는 상위 스트림 카테고리로, 해당 카테고리를 숨기려면 아래 항목에서 "
-"선택하지 않습니다."
+#: po/rc.cpp:908 rc.cpp:908
+msgid "Use the checkboxes below to configure the list of active providers."
+msgstr "서비스제공자를 선택하려면 아래 항목을 사용합니다."
 
 #. i18n: file: streams/streamssettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: po/rc.cpp:759 rc.cpp:759
+#: po/rc.cpp:911 rc.cpp:911
 msgid "Configure Provider"
-msgstr "제공자 설정"
+msgstr "서비스제공자 설정"
 
 #. i18n: file: streams/streamssettings.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, installButton)
-#: po/rc.cpp:762 rc.cpp:762
+#: po/rc.cpp:914 rc.cpp:914
 msgid "Install"
 msgstr "설치"
 
 #. i18n: file: streams/streamssettings.ui:80
 #. i18n: ectx: property (text), widget (QLabel, note)
-#: po/rc.cpp:768 rc.cpp:768
+#: po/rc.cpp:920 rc.cpp:920
 msgid ""
 "<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
 "removed.</i>"
@@ -5179,123 +5586,117 @@ msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:771 rc.cpp:771
+#: po/rc.cpp:923 rc.cpp:923
 msgid "Search:"
 msgstr "찾기:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:65
 #. i18n: ectx: property (title), widget (QGroupBox, actionBox)
-#: po/rc.cpp:774 rc.cpp:774
+#: po/rc.cpp:926 rc.cpp:926
 msgid "Shortcut for Selected Action"
 msgstr "선택된 기능 단축키"
 
 #. i18n: file: support/shortcutssettingswidget.ui:71
 #. i18n: ectx: property (text), widget (QRadioButton, useDefault)
-#: po/rc.cpp:777 rc.cpp:777
+#: po/rc.cpp:929 rc.cpp:929
 msgid "Default:"
 msgstr "기본:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:85
 #. i18n: ectx: property (text), widget (QRadioButton, useCustom)
-#: po/rc.cpp:783 rc.cpp:783
+#: po/rc.cpp:935 rc.cpp:935
 msgid "Custom:"
 msgstr "개인:"
 
-#. i18n: file: tags/tageditor.ui:25
-#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:786 rc.cpp:786
-msgid "Track:"
-msgstr "곡:"
-
 #. i18n: file: tags/tageditor.ui:64
 #. i18n: ectx: property (text), widget (StateLabel, albumArtistLabel)
-#: po/rc.cpp:795 rc.cpp:795
+#: po/rc.cpp:947 rc.cpp:947
 msgid "Album artist:"
 msgstr "음반연주자:"
 
 #. i18n: file: tags/tageditor.ui:103
 #. i18n: ectx: property (text), widget (StateLabel, trackLabel)
-#: po/rc.cpp:804 rc.cpp:804
+#: po/rc.cpp:956 rc.cpp:956
 msgid "Track number:"
 msgstr "곡 번호:"
 
 #. i18n: file: tags/tageditor.ui:116
 #. i18n: ectx: property (text), widget (StateLabel, discLabel)
-#: po/rc.cpp:807 rc.cpp:807
+#: po/rc.cpp:959 rc.cpp:959
 msgid "Disc number:"
 msgstr "디스크 번호:"
 
-#. i18n: file: tags/trackorganiser.ui:155
+#. i18n: file: tags/trackorganiser.ui:115
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:834 rc.cpp:834
+#: po/rc.cpp:989 rc.cpp:989
 msgid "Original Name"
 msgstr "원래 이름"
 
-#. i18n: file: tags/trackorganiser.ui:160
+#. i18n: file: tags/trackorganiser.ui:120
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:837 rc.cpp:837
+#: po/rc.cpp:992 rc.cpp:992
 msgid "New Name"
 msgstr "새 이름"
 
-#: po/rc.cpp:838 rc.cpp:838
+#: po/rc.cpp:996 rc.cpp:996
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "이름"
 
-#: po/rc.cpp:839 rc.cpp:839
+#: po/rc.cpp:997 rc.cpp:997
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "이메일"
 
-#: replaygain/rgdialog.cpp:121
+#: replaygain/rgdialog.cpp:116
 msgid "Show All Tracks"
 msgstr "전곡 보기"
 
-#: replaygain/rgdialog.cpp:122
+#: replaygain/rgdialog.cpp:117
 msgid "Show Untagged Tracks"
 msgstr "태그가 없는 곡 보기"
 
-#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:124 tags/trackorganiser.cpp:79
 msgid "Remove From List"
 msgstr "항목에서 지웁니다"
 
-#: replaygain/rgdialog.cpp:136
+#: replaygain/rgdialog.cpp:131
 msgid "Album Gain"
 msgstr "음반 게인"
 
-#: replaygain/rgdialog.cpp:137
+#: replaygain/rgdialog.cpp:132
 msgid "Track Gain"
 msgstr "곡 게인"
 
-#: replaygain/rgdialog.cpp:138
+#: replaygain/rgdialog.cpp:133
 msgid "Album Peak"
 msgstr "음반 피크"
 
-#: replaygain/rgdialog.cpp:139
+#: replaygain/rgdialog.cpp:134
 msgid "Track Peak"
 msgstr "곡 피크"
 
-#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
+#: replaygain/rgdialog.cpp:154 replaygain/rgdialog.cpp:283
 msgid "Scan"
 msgstr "검색"
 
-#: replaygain/rgdialog.cpp:238
+#: replaygain/rgdialog.cpp:233
 msgid "Update ReplayGain tags in tracks?"
 msgstr "곡의 리플레이게인 태그를 업데이트할까요?"
 
-#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
+#: replaygain/rgdialog.cpp:233 replaygain/rgdialog.cpp:234
 msgid "Update Tags"
 msgstr "태그 업데이트"
 
-#: replaygain/rgdialog.cpp:252
+#: replaygain/rgdialog.cpp:247
 msgid "Abort scanning of tracks?"
 msgstr "곡 검색을 취소할까요?"
 
-#: replaygain/rgdialog.cpp:261
+#: replaygain/rgdialog.cpp:256
 msgid "Abort reading of existing tags?"
 msgstr "기존 태그 읽기를 취소할까요?"
 
-#: replaygain/rgdialog.cpp:287
+#: replaygain/rgdialog.cpp:282
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
@@ -5303,62 +5704,62 @@ msgstr ""
 "<b>전</b>곡을 검색할까요?<br><br><i>참고: 전곡은 기존 리플레이게인을 가지고 "
 "있습니다.</i>"
 
-#: replaygain/rgdialog.cpp:289
+#: replaygain/rgdialog.cpp:284
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr "전곡이나 기존 태그가 없는 곡만 검색할까요?"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "Untagged Tracks"
 msgstr "태그가 없는 곡"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "All Tracks"
 msgstr "전곡"
 
-#: replaygain/rgdialog.cpp:300
+#: replaygain/rgdialog.cpp:295
 msgid "Scanning tracks..."
 msgstr "곡 검색 중..."
 
-#: replaygain/rgdialog.cpp:367
+#: replaygain/rgdialog.cpp:362
 msgid "Reading existing tags..."
 msgstr "기존 태그 읽는 중..."
 
-#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+#: replaygain/rgdialog.cpp:414 tags/tageditor.cpp:798
 msgctxt "filename (Timeout)"
 msgid "%1 (Timeout)"
 msgstr "%1 (종료)"
 
-#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:802
 msgctxt "filename (Corrupt tags?)"
 msgid "%1 (Corrupt tags?)"
 msgstr "%1 (태그 오류?)"
 
-#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
+#: replaygain/rgdialog.cpp:432 tags/tageditor.cpp:812
 msgid "Failed to update the tags of the following tracks:"
 msgstr "다음 곡들의 태그를 업데이트할 수 없음:"
 
-#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
-#: tags/trackorganiser.cpp:451
+#: replaygain/rgdialog.cpp:473 tags/tageditor.cpp:885
+#: tags/trackorganiser.cpp:483
 msgid "Device is not connected."
 msgstr "장치가 연결되지 않았음."
 
-#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
-#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
+#: replaygain/rgdialog.cpp:513 replaygain/rgdialog.cpp:520
+#: replaygain/rgdialog.cpp:599 replaygain/rgdialog.cpp:601
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:520 replaygain/rgdialog.cpp:521
-#: replaygain/rgdialog.cpp:527 replaygain/rgdialog.cpp:528
-#: replaygain/rgdialog.cpp:579 replaygain/rgdialog.cpp:580
-#: replaygain/rgdialog.cpp:581 replaygain/rgdialog.cpp:582
+#: replaygain/rgdialog.cpp:516 replaygain/rgdialog.cpp:517
+#: replaygain/rgdialog.cpp:523 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:575 replaygain/rgdialog.cpp:576
+#: replaygain/rgdialog.cpp:577 replaygain/rgdialog.cpp:578
 msgid "Failed"
 msgstr "실패"
 
-#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
+#: replaygain/rgdialog.cpp:651 tags/trackorganiser.cpp:428
 msgid "Remove the selected tracks from the list?"
 msgstr "항목의 선택된 곡을 지울까요?"
 
-#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
+#: replaygain/rgdialog.cpp:652 tags/trackorganiser.cpp:429
 msgid "Remove Tracks"
 msgstr "곡을 지움"
 
@@ -5378,19 +5779,19 @@ msgstr "AAC 64k"
 msgid "AAC 128k"
 msgstr "AAC 128k"
 
-#: streams/digitallyimportedsettings.cpp:109
+#: streams/digitallyimportedsettings.cpp:110
 msgid "Logged out"
 msgstr "로그아웃 됨"
 
-#: streams/digitallyimportedsettings.cpp:112
+#: streams/digitallyimportedsettings.cpp:113
 msgid "Logging in..."
 msgstr "로그인 중..."
 
-#: streams/digitallyimportedsettings.cpp:136
+#: streams/digitallyimportedsettings.cpp:137
 msgid "Logout"
 msgstr "로그아웃"
 
-#: streams/streamdialog.cpp:71
+#: streams/streamdialog.cpp:72
 msgid "URL:"
 msgstr "URL:"
 
@@ -5414,7 +5815,7 @@ msgstr "스트림 수정"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>오류:</b> 무효 프로토콜</i>"
 
-#: streams/streamfetcher.cpp:205
+#: streams/streamfetcher.cpp:209
 msgid "Fetching %1"
 msgstr "%1 가져옴"
 
@@ -5430,91 +5831,91 @@ msgstr "즐겨찾기 스트림을 내보내기"
 msgid "Add New Stream To Favorites"
 msgstr "새로운 스트림을 즐겨찾기에 추가"
 
-#: streams/streamspage.cpp:124
+#: streams/streamspage.cpp:125
 msgctxt "Service name"
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:243
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|XML 스트림"
 
-#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
+#: streams/streamspage.cpp:243 streams/streamspage.cpp:245
 msgid "Import Streams"
 msgstr "스트림 불러오기"
 
-#: streams/streamspage.cpp:245
+#: streams/streamspage.cpp:246
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "XML 스트림 (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:253
+#: streams/streamspage.cpp:254
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr "<b>%1</b>을 불러올 수 없음!<br/>정확한지 확인 바랍니다."
 
-#: streams/streamspage.cpp:265
+#: streams/streamspage.cpp:266
 msgid "*.xml|XML Streams"
 msgstr "*.xml|XML 스트림"
 
-#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
+#: streams/streamspage.cpp:266 streams/streamspage.cpp:268
 msgid "Export Streams"
 msgstr "스트림 내보내기"
 
-#: streams/streamspage.cpp:267
+#: streams/streamspage.cpp:268
 msgid "XML Streams (*.xml)"
 msgstr "XML 스트림 (*.xml)"
 
-#: streams/streamspage.cpp:279
+#: streams/streamspage.cpp:280
 msgid "Failed to create <b>%1</b>!"
 msgstr "<b>%1</b>을 만들 수 없음!"
 
-#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
+#: streams/streamspage.cpp:297 streams/streamspage.cpp:493
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "이미 있는 스트림! <br/><b>%1</b>"
 
-#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
+#: streams/streamspage.cpp:299 streams/streamspage.cpp:495
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "스트림 <b>%1</b>은 이미 있습니다!"
 
-#: streams/streamspage.cpp:318
+#: streams/streamspage.cpp:319
 msgid "Bookmark added"
 msgstr "책갈피 추가됨"
 
-#: streams/streamspage.cpp:320
+#: streams/streamspage.cpp:321
 msgid "Already bookmarked"
 msgstr "책갈피 이미 있음"
 
-#: streams/streamspage.cpp:366
+#: streams/streamspage.cpp:367
 msgid "Added to favorites"
 msgstr "즐겨찾기에 추가"
 
-#: streams/streamspage.cpp:368
+#: streams/streamspage.cpp:369
 msgid "Already in favorites"
 msgstr "즐겨찾기에 있음"
 
-#: streams/streamspage.cpp:393
+#: streams/streamspage.cpp:394
 msgid "Reload <b>%1</b> streams?"
 msgstr "<b>%1</b> 스트림을 다시 읽을까요?"
 
-#: streams/streamspage.cpp:411
+#: streams/streamspage.cpp:412
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr "<b>%1</b>의 책갈피를 지울까요?"
 
-#: streams/streamspage.cpp:417
+#: streams/streamspage.cpp:418
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr "<b>%1</b>의 모든 책갈피를 지울까요?"
 
-#: streams/streamspage.cpp:445
+#: streams/streamspage.cpp:446
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "선택된 %1 스트림을 지울까요?"
 
-#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
+#: streams/streamspage.cpp:450 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "<b>%1</b>을 지울까요?"
 
-#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+#: streams/streamspage.cpp:561 streams/streamspage.cpp:577
 msgid "Search %1:"
-msgstr "찾기 %1:"
+msgstr "%1 찾기:"
 
 #: streams/streamssettings.cpp:125
 msgid "*.streams|Cantata Streams"
@@ -5552,139 +5953,90 @@ msgstr "스트림 항목을 저장할 수 없음!"
 msgid "Failed to remove streams folder!"
 msgstr "스트림 폴더를 지울 수 없음!"
 
-#: support/dialog.cpp:89
+#: support/dialog.cpp:73
 msgid "&OK"
 msgstr "확인(&O)"
 
-#: support/dialog.cpp:90
+#: support/dialog.cpp:74
 msgid "&Cancel"
 msgstr "취소(&C)"
 
-#: support/dialog.cpp:91
+#: support/dialog.cpp:75
 msgid "&Yes"
 msgstr "예(&Y)"
 
-#: support/dialog.cpp:92
+#: support/dialog.cpp:76
 msgid "&No"
 msgstr "아니오(&N)"
 
-#: support/dialog.cpp:93
+#: support/dialog.cpp:77
 msgid "&Discard"
 msgstr "취소(&D)"
 
-#: support/dialog.cpp:94
+#: support/dialog.cpp:78
 msgid "&Save"
 msgstr "저장(&S)"
 
-#: support/dialog.cpp:95
+#: support/dialog.cpp:79
 msgid "&Apply"
 msgstr "적용(&A)"
 
-#: support/dialog.cpp:96
+#: support/dialog.cpp:80
 msgid "&Close"
 msgstr "닫기(&C)"
 
-#: support/dialog.cpp:98
+#: support/dialog.cpp:82
 msgid "&Overwrite"
 msgstr "덮어쓰기(&O)"
 
-#: support/dialog.cpp:99
+#: support/dialog.cpp:83
 msgid "&Reset"
 msgstr "재설정(&R)"
 
-#: support/dialog.cpp:100
+#: support/dialog.cpp:84
 msgid "&Continue"
 msgstr "계속(&C)"
 
-#: support/dialog.cpp:101
+#: support/dialog.cpp:85
 msgid "&Delete"
 msgstr "지우기(&D)"
 
-#: support/dialog.cpp:102
+#: support/dialog.cpp:86
 msgid "&Stop"
 msgstr "정지(&S)"
 
-#: support/dialog.cpp:103
+#: support/dialog.cpp:87
 msgid "&Remove"
 msgstr "지우기(&R)"
 
-#: support/dialog.cpp:104
+#: support/dialog.cpp:88
 msgid "&Previous"
 msgstr "이전(&P)"
 
-#: support/dialog.cpp:105
+#: support/dialog.cpp:89
 msgid "&Next"
 msgstr "다음(&N)"
 
-#: support/fancytabwidget.cpp:957
-msgid "Icons Only"
-msgstr "아이콘만"
-
-#: support/fancytabwidget.cpp:958
-msgid "Style"
-msgstr "형식"
-
-#: support/fancytabwidget.cpp:959
-msgid "Large Sidebar"
-msgstr "큰 옆 막대"
-
-#: support/fancytabwidget.cpp:960
-msgid "Small Sidebar"
-msgstr "작은 옆 막대"
-
-#: support/fancytabwidget.cpp:961
-msgid "Top Bar"
-msgstr "위 막대"
-
-#: support/fancytabwidget.cpp:962
-msgid "Bottom Bar"
-msgstr "아래 막대"
-
-#: support/fancytabwidget.cpp:963
-msgid "Tabs On Side"
-msgstr "옆 꼬리표"
-
-#: support/fancytabwidget.cpp:964
-msgid "Tabs On Top"
-msgstr "위 꼬리표"
-
-#: support/fancytabwidget.cpp:965
-msgid "Tabs On Bottom"
-msgstr "아래 꼬리표"
-
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Password"
 msgstr "비밀번호"
 
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Please enter password:"
 msgstr "비밀번호 입력:"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:123
+#: support/messagebox.cpp:50 support/messagebox.cpp:124
 msgid "Warning"
 msgstr "주의"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:118
+#: support/messagebox.cpp:50 support/messagebox.cpp:119
 msgid "Question"
 msgstr "질문"
 
-#: support/messagebox.cpp:107 support/messagebox.cpp:113
-#: support/messagebox.h:62
-msgid "Error"
-msgstr "오류"
-
 #: support/messagebox.h:65
 msgid "Information"
 msgstr "정보"
 
-#: support/onoffbutton.cpp:47
-msgid "ON"
-msgstr "켜기"
-
-#: support/onoffbutton.cpp:48
-msgid "OFF"
-msgstr "끄기"
-
 #: support/pathrequester.cpp:50
 msgid "Select Folder"
 msgstr "폴더 선택"
@@ -5727,31 +6079,31 @@ msgid_plural "%1 days %2"
 msgstr[0] "하루 %2"
 msgstr[1] "%1일 %2"
 
-#: tags/tageditor.cpp:134
+#: tags/tageditor.cpp:147
 msgid "Tags"
 msgstr "태그"
 
-#: tags/tageditor.cpp:147
+#: tags/tageditor.cpp:160
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr "'연주자'에서 '음반연주자' 설정"
 
-#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
+#: tags/tageditor.cpp:261 tags/tageditor.cpp:592
 msgid "All tracks"
 msgstr "전곡"
 
-#: tags/tageditor.cpp:295
+#: tags/tageditor.cpp:323
 msgid "(Various)"
 msgstr "(여러)"
 
-#: tags/tageditor.cpp:336
+#: tags/tageditor.cpp:368
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr "\"여러 연주자\" 해결을 <b>전</b>곡에 적용할까요?"
 
-#: tags/tageditor.cpp:378
+#: tags/tageditor.cpp:410
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr "\"여러 연주자\" 해결을 <b>전</b>곡에 되돌릴까요?"
 
-#: tags/tageditor.cpp:428
+#: tags/tageditor.cpp:460
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5759,15 +6111,15 @@ msgstr ""
 "만약 음반연주자가 비어있다면, '연주자'에서 '음반연주자'를 설정하는 것을 <b>전"
 "</b>곡에 적용할까요?"
 
-#: tags/tageditor.cpp:429
+#: tags/tageditor.cpp:461
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr "만약 음반연주자가 비어있다면, '연주자'에서 '음반연주자'를 설정할까요?"
 
-#: tags/tageditor.cpp:430
+#: tags/tageditor.cpp:462
 msgid "Album Artist from Artist"
 msgstr "연주자에서 음반연주자"
 
-#: tags/tageditor.cpp:463
+#: tags/tageditor.cpp:495
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5775,52 +6127,52 @@ msgstr ""
 "<b>전</b>곡의 '제목', '연주자', '음반연주자', '음반'의 첫 글자를 대문자로 할"
 "까요?"
 
-#: tags/tageditor.cpp:496
+#: tags/tageditor.cpp:528
 msgid "Adjust the value of each track number by:"
 msgstr "각 곡 순서를 값대로 늘여갑니다:"
 
-#: tags/tageditor.cpp:554
+#: tags/tageditor.cpp:586
 msgid "All tracks [modified]"
 msgstr "전곡 [수정됨]"
 
-#: tags/tageditor.cpp:556
+#: tags/tageditor.cpp:588
 msgid "%1 [modified]"
 msgstr "%1 [수정됨]"
 
-#: tags/tageditor.cpp:783
+#: tags/tageditor.cpp:827
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr "태그에 맞추기 위해서, 곡들의 이름을 바꾸겠습니까?"
 
-#: tags/tageditor.cpp:784
+#: tags/tageditor.cpp:828
 msgid "Rename Files"
 msgstr "파일이름 바꾸기"
 
-#: tags/trackorganiser.cpp:150
+#: tags/trackorganiser.cpp:164
 msgid "Abort renaming of files?"
 msgstr "파일 이름 바꾸기를 취소할까요?"
 
-#: tags/trackorganiser.cpp:263
+#: tags/trackorganiser.cpp:279
 msgid "Source file does not exist!<br/>%1"
 msgstr "원본 파일이 없습니다!<hr/>%1"
 
-#: tags/trackorganiser.cpp:282
+#: tags/trackorganiser.cpp:298
 msgid "Destination file already exists!<br/>%1"
 msgstr "대상 파일이 이미 있음!<br/>%1"
 
-#: tags/trackorganiser.cpp:304
+#: tags/trackorganiser.cpp:320
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "대상 폴더를 만들 수 없음!<br/>%1"
 
-#: tags/trackorganiser.cpp:325
+#: tags/trackorganiser.cpp:341
 msgid "Failed to rename %1 to %2"
 msgstr "%1을 %2로 이름을 바꿀 수 없음"
 
-#: widgets/coverwidget.cpp:267
+#: widgets/coverwidget.cpp:280
 msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
 msgstr "<tr><td align=\"right\">작곡가:</td><td>%1</td></tr>"
 
-#: widgets/coverwidget.cpp:269
+#: widgets/coverwidget.cpp:282
 msgid ""
 "<tr><td align=\"right\"><b>Artist:</b></td><td>%1</td></tr><tr><td align="
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Year:"
@@ -5830,37 +6182,41 @@ msgstr ""
 "\"right\"><b>음반:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>연도:</"
 "b></td><td>%3</td></tr>"
 
-#: widgets/genrecombo.cpp:54
+#: widgets/genrecombo.cpp:44
+msgid "Filter On Genre"
+msgstr "장르 선택"
+
+#: widgets/genrecombo.cpp:66
 msgid "All Genres"
 msgstr "모든 장르"
 
-#: widgets/groupedview.cpp:267
+#: widgets/groupedview.cpp:265
 msgctxt "album (albumYear)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: widgets/groupedview.cpp:269
+#: widgets/groupedview.cpp:267
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: widgets/itemview.cpp:480
+#: widgets/itemview.cpp:561
 msgid "Go Back"
 msgstr "돌아가기"
 
-#: widgets/itemview.cpp:485
+#: widgets/itemview.cpp:566
 msgid "Go Home"
 msgstr "홈으로"
 
-#: widgets/menubutton.cpp:36
+#: widgets/menubutton.cpp:39
 msgid "Menu"
 msgstr "메뉴"
 
-#: widgets/searchwidget.cpp:62
+#: widgets/searchwidget.cpp:63
 msgid "Search..."
 msgstr "찾기..."
 
-#: widgets/searchwidget.cpp:66
+#: widgets/searchwidget.cpp:67
 msgid "Close Search Bar"
 msgstr "검색막대 닫기"
 
@@ -5872,7 +6228,7 @@ msgstr "%1로 로그인됨"
 msgid "<b>NOT</b> logged into %1"
 msgstr "%1로 로그인 <b>안</b>됨"
 
-#: widgets/songdialog.cpp:48
+#: widgets/songdialog.cpp:49
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
 "\" setting, and MPD's \"music_directory\" setting.</p>"
@@ -5880,7 +6236,7 @@ msgstr ""
 "<p>음악 파일에 접근할 수 없음!<br/><br/>칸타타의 \"Music folder\"와 MPD의 "
 "\"music_directory\" 설정을 확인하셔요.</p>"
 
-#: widgets/songdialog.cpp:51
+#: widgets/songdialog.cpp:52
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check that the device is still "
 "attached.</p>"
@@ -5888,28 +6244,24 @@ msgstr ""
 "<p>음악 파일에 접근할 수 없음!<br/><br/>장치가 아직 연결되어 있는지 확인하셔"
 "요.</p>"
 
-#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:115 widgets/volumeslider.cpp:230
+#: widgets/volumeslider.cpp:237
 msgid "Mute"
 msgstr "음 소거"
 
-#: widgets/volumeslider.cpp:199
+#: widgets/volumeslider.cpp:198
 msgid "Muted"
 msgstr "음 소거됨"
 
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:237
 msgid "Unmute"
 msgstr "음 소거 취소"
 
-#: widgets/volumeslider.cpp:276
-msgid "Volume Disabled"
-msgstr "음량사용 안 함"
-
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1% (Muted)"
 msgstr "음량 %1% (무음)"
 
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1%"
 msgstr "음량 %1%"
 
@@ -6008,10 +6360,186 @@ msgid "1 Episode"
 msgstr "한 에피소드"
 
 #: ../gui/qtplural.h:63
+#, qt-format
 msgctxt "Plural (N!=1)"
 msgid "%1 Episodes"
 msgstr "%1 에피소드"
 
+#~ msgid "Transcoding failed.<br/><br/<hr/>%1"
+#~ msgstr "변환할 수 없음.<br/><br/<hr/>%1"
+
+#~ msgid "Failed to download track.<br/><br/<hr/>%1"
+#~ msgstr "곡을 내려받을 수 없음.<br/><br/<hr/>%1"
+
+#~ msgid "<b>Error</b><br/>"
+#~ msgstr "<b>오류</b><br/>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
+#~ "td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">연주자:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">음반:</td><td>%2</td></tr><tr><td align=\"right\">곡:</td><td>%3</td></"
+#~ "tr>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Destination file:</td><td>%2</td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">원본 파일:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">대상 파일:</td><td>%2</td></tr>"
+
+#~ msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
+#~ msgstr "<tr><td align=\"right\">파일:</td><td>%1</td></tr>"
+
+#~ msgid ""
+#~ "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
+#~ "i></tr>"
+#~ msgstr ""
+#~ "<tr><i><td align=\"right\"><i>남은 시간:</i></td><td><i>%5</i></td></i></"
+#~ "tr>"
+
+#~ msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
+#~ msgstr "<tr><td>%album%</td><td>%1</td><td>음반의 이름.</td></tr>"
+
+#~ msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
+#~ msgstr "<tr><td>%composer%</td><td>%1</td><td>작곡가.</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
+#~ msgstr "<tr><td>%artist%</td><td>%1</td><td>각 곡의 연주자.</td></tr>"
+
+#~ msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
+#~ msgstr "<tr><td>%track%</td><td>%1</td><td>곡 번호.</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></"
+#~ "tr>"
+#~ msgstr "<tr><td>%year%</td><td>%1</td><td>음반발매연도.</td></tr>"
+
+#~ msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
+#~ msgstr "<tr><td>%genre%</td><td>%1</td><td>음반의 장르.</td></tr>"
+
+#~ msgctxt ""
+#~ "Google\n"
+#~ "width x height (file size)"
+#~ msgid ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+#~ msgstr ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+
+#~ msgctxt ""
+#~ "Discogs\n"
+#~ "width x height"
+#~ msgid ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+#~ msgstr ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+
+#~ msgid "Grouped by 'Album Artist'"
+#~ msgstr "'음반연주자'로 묶음"
+
+#~ msgid "Search Play Queue"
+#~ msgstr "연주순서 찾기"
+
+#~ msgid "Do not fadeout"
+#~ msgstr "페이드아웃 안 함"
+
+#~ msgid "Inactive"
+#~ msgstr "사용되지 않음"
+
+#~ msgctxt "Track Number (#)"
+#~ msgid "#"
+#~ msgstr "#"
+
+#~ msgid "Search For Podcasts"
+#~ msgstr "팟캐스트 찾기"
+
+#~ msgid "Subscribe to Podcast"
+#~ msgstr "팟캐스트 구독"
+
+#~ msgid "You are already subscribed to this URL!"
+#~ msgstr "이미 이 URL을 구독하고 있습니다!"
+
+#~ msgid "Already downloading this URL!"
+#~ msgstr "이미 이 URL을 내려받고 있습니다!"
+
+#~ msgid "Use backdrop"
+#~ msgstr "배경 사용"
+
+#~ msgid "Automatically lookup"
+#~ msgstr "자동찾기"
+
+#~ msgid "<html><head/><body><p>Cancel current query</p></body></html>"
+#~ msgstr "<html><head/><body><p>지금의 조회를 취소</p></body></html>"
+
+#~ msgid "<html><head/><body><p>Add a local file</p></body></html>"
+#~ msgstr "<html><head/><body><p>로컬 파일에 추가</p></body></html>"
+
+#~ msgid "Use current album cover as background:"
+#~ msgstr "지금 음반 표지를 배경으로 사용:"
+
+#~ msgid "Multiple artist albums:"
+#~ msgstr "여러 연주자 음반:"
+
+#~ msgid "Crossfading:"
+#~ msgstr "크로스페이딩:"
+
+#~ msgid " seconds"
+#~ msgstr " 초"
+
+#~ msgid "Devices:"
+#~ msgstr "장치:"
+
+#~ msgid "Current URL:"
+#~ msgstr "현재 URL:"
+
+#~ msgid ""
+#~ "The following is a list of online providers, to hide a provider simply un-"
+#~ "check its entry in this list."
+#~ msgstr ""
+#~ "아래는 온라인서비스제공자로, 해당 카테고리를 숨기려면 아래 항목에서 선택하"
+#~ "지 않습니다."
+
+#~ msgid ""
+#~ "The following is a list of the top-level stream categories, to hide a "
+#~ "category simply un-check its entry in this list."
+#~ msgstr ""
+#~ "아래는 상위 스트림 카테고리로, 해당 카테고리를 숨기려면 아래 항목에서 선택"
+#~ "하지 않습니다."
+
+#~ msgid "Icons Only"
+#~ msgstr "아이콘만"
+
+#~ msgid "Style"
+#~ msgstr "형식"
+
+#~ msgid "Small Sidebar"
+#~ msgstr "작은 옆 막대"
+
+#~ msgid "Tabs On Side"
+#~ msgstr "옆 꼬리표"
+
+#~ msgid "Tabs On Top"
+#~ msgstr "위 꼬리표"
+
+#~ msgid "Tabs On Bottom"
+#~ msgstr "아래 꼬리표"
+
+#~ msgid "ON"
+#~ msgstr "켜기"
+
+#~ msgid "OFF"
+#~ msgstr "끄기"
+
+#~ msgid "Volume Disabled"
+#~ msgstr "음량사용 안 함"
+
 #~ msgid ""
 #~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
 #~ msgstr "곡을 내려받을 수 없음 - 너무 많은 재전송.<br/><br/<hr/>%1"
@@ -6079,15 +6607,12 @@ msgstr "%1 에피소드"
 #~ msgid "Biography"
 #~ msgstr "경력"
 
-#~ msgid "Source: %1"
-#~ msgstr "출처: %1"
-
 #~ msgid "Stop Immediately"
 #~ msgstr "바로 정지"
 
 #~ msgid ""
 #~ "When 'Play Stream' is activated, the enabled stream is played locally."
-#~ msgstr "'스트림 연주'가 활성화되면, 로컬에서 스트림이 연주됩니다."
+#~ msgstr "'스트림 연주'가 선택되면, 로컬에서 스트림이 연주됩니다."
 
 #~ msgid ""
 #~ "<p><table><tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align="
@@ -6139,9 +6664,6 @@ msgstr "%1 에피소드"
 #~ "설정 이름 %1은 이미 있습니다!\n"
 #~ "덮어쓸까요?"
 
-#~ msgid "Set Cover"
-#~ msgstr "표지 설정"
-
 #~ msgctxt ""
 #~ "<title> by <artist>\n"
 #~ "Failed\n"
@@ -6164,9 +6686,6 @@ msgstr "%1 에피소드"
 #~ msgid "Failed to reconnect to %1"
 #~ msgstr "%1에 재연결 안 됨"
 
-#~ msgid "Loaded"
-#~ msgstr "읽음"
-
 #~ msgid "Add Online Service"
 #~ msgstr "온라인서비스 추가"
 
@@ -6241,12 +6760,12 @@ msgstr "%1 에피소드"
 #~ "have Cantata choose a random port number.</i>"
 #~ msgstr ""
 #~ "<i><b>참고:</b> MPD는 주로 음악 폴더에 저장된 음악만 연주합니다.로컬소켓"
-#~ "에 연결되면 파일시스템의 파일을 연주할 수 있습니다. 로컬소켓을 사용하지 "
-#~ "않는다면 (예로 '서버' 설정페이지의 '호스트' 입력란에 호스트 이름이나 IP주"
-#~ "소를 입력했다면) 칸타타는 파일을 MPD로 서비스하는 최소한의 HTTP 서버 역할"
-#~ "을 합니다. 다만, 칸타타가 실행되는 한에서만 작동합니다. '항상 서버 사"
-#~ "용'을 선택하면 칸타타는 로컬소켓에 연결되었더라도 항상 서버 URL을 MPD 파"
-#~ "일로 전달합니다.<br/><br/>\n"
+#~ "에 연결되면 파일시스템의 파일을 연주할 수 있습니다. 로컬소켓을 사용하지 않"
+#~ "는다면 (예로 '서버' 설정페이지의 '호스트' 입력란에 호스트 이름이나 IP주소"
+#~ "를 입력했다면) 칸타타는 파일을 MPD로 서비스하는 최소한의 HTTP 서버 역할을 "
+#~ "합니다. 다만, 칸타타가 실행되는 한에서만 작동합니다. '항상 서버 사용'을 선"
+#~ "택하면 칸타타는 로컬소켓에 연결되었더라도 항상 서버 URL을 MPD 파일로 전달"
+#~ "합니다.<br/><br/>\n"
 #~ "<b>참고:</b>'주소/인터페이스'는 연결을 원하는 IP주소나 eth0등 인터페이스"
 #~ "를 포함할 수 있습니다. 로컬 루프백 주소 (127.0.0.1)을 쓰려면 비워두시기 바"
 #~ "랍니다.<br/><br/><b>참고:</b> 포트를 '동적'으로 두면 칸타타가 포트 번호를 "
@@ -6289,9 +6808,6 @@ msgstr "%1 에피소드"
 #~ msgid "Category:"
 #~ msgstr "카테고리:"
 
-#~ msgid "Radio Stations"
-#~ msgstr "라디오 방송국"
-
 #~ msgid "From %1"
 #~ msgstr "%1"
 
@@ -6436,9 +6952,6 @@ msgstr "%1 에피소드"
 #~ msgid "Uptime:"
 #~ msgstr "가동시간:"
 
-#~ msgid "Time playing:"
-#~ msgstr "연주시간:"
-
 #~ msgid "Database"
 #~ msgstr "데이터베이스"
 
diff --git a/po/pl.po b/po/pl.po
index 9ba2257..3c69104 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -1,14 +1,14 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 #
-# Piotr Wicijowski <piwsko at gmail.com>, 2011, 2012, 2013.
+# Piotr Wicijowski <piwsko at gmail.com>, 2011, 2012, 2013, 2014.
 # Mirosław Zalewski <miroslaw-zalewski at o2.pl>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-14 20:26+0000\n"
-"PO-Revision-Date: 2013-11-27 20:30+0100\n"
+"POT-Creation-Date: 2014-02-02 20:02+0000\n"
+"PO-Revision-Date: 2014-02-10 15:51+0100\n"
 "Last-Translator: Piotr Wicijowski <piotr.wicijowski at gmail.com>\n"
 "Language-Team: Polish <kde-i18n-doc at kde.org>\n"
 "Language: pl\n"
@@ -23,14 +23,13 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "Odśwież informacje o albumie"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:307
-#: gui/cachesettings.cpp:262
+#: context/albumview.cpp:71 gui/cachesettings.cpp:269
 msgid "Album Information"
 msgstr "Informacje o albumie"
 
-#. i18n: file: devices/albumdetails.ui:143
+#. i18n: file: devices/albumdetails.ui:136
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
+#: context/albumview.cpp:175 po/rc.cpp:107 rc.cpp:107
 msgid "Tracks"
 msgstr "Utwory"
 
@@ -38,22 +37,22 @@ msgstr "Utwory"
 msgid "Refresh Artist Information"
 msgstr "Odśwież informacje o artyście"
 
-#: context/artistview.cpp:92 context/contextwidget.cpp:306
-#: gui/cachesettings.cpp:260
+#: context/artistview.cpp:92 gui/cachesettings.cpp:267
 msgid "Artist Information"
 msgstr "Informacje o artyście"
 
-#. i18n: file: gui/interfacesettings.ui:137
+#. i18n: file: gui/interfacesettings.ui:272
 #. i18n: ectx: attribute (title), widget (QWidget, tab_2)
-#: context/artistview.cpp:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
+#: context/artistview.cpp:314 gui/interfacesettings.cpp:106
+#: gui/mainwindow.cpp:308 po/rc.cpp:588 rc.cpp:588
 msgid "Albums"
 msgstr "Albumy"
 
-#: context/artistview.cpp:333
+#: context/artistview.cpp:337
 msgid "Web Links"
 msgstr "Linki sieciowe"
 
-#: context/artistview.cpp:419
+#: context/artistview.cpp:424
 msgid "Similar Artists"
 msgstr "Podobni Artyści"
 
@@ -61,23 +60,30 @@ msgstr "Podobni Artyści"
 msgid "Lyrics Providers"
 msgstr "Dostawcy tekstów"
 
-#: context/contextsettings.cpp:37
+#: context/contextsettings.cpp:37 gui/cachesettings.cpp:278
 msgid "Wikipedia Languages"
 msgstr "Język Wikipedii"
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
-#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1388
+#: models/streamsmodel.cpp:1434 models/streamsmodel.cpp:1642
 msgid "Other"
 msgstr "Inne"
 
-#: context/contextwidget.cpp:98
+#: context/contextwidget.cpp:293
 msgid "Reset Spacing"
 msgstr "Resetuj odstępy"
 
-#: context/contextwidget.cpp:308 context/songview.cpp:105
-#: gui/cachesettings.cpp:259
-msgid "Lyrics"
-msgstr "Teksty"
+#: context/contextwidget.cpp:506
+msgid "&Artist"
+msgstr "&Artysta"
+
+#: context/contextwidget.cpp:507
+msgid "Al&bum"
+msgstr "Al&bum"
+
+#: context/contextwidget.cpp:508
+msgid "&Lyrics"
+msgstr "&Teksty"
 
 #: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
@@ -101,37 +107,38 @@ msgstr ""
 "Jeśli to wyszukiwanie się powiedzie, to znaleziony tekst zostanie "
 "przyporządkowany w Cantacie oryginalnemu utworowi i artyście."
 
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#: context/lyricsdialog.cpp:64 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
-#: rc.cpp:61 rc.cpp:304 rc.cpp:789
+#: context/lyricsdialog.cpp:64 gui/searchpage.cpp:204 po/rc.cpp:92
+#: po/rc.cpp:377 po/rc.cpp:941 rc.cpp:92 rc.cpp:377 rc.cpp:941
 msgid "Title:"
 msgstr "Tytuł:"
 
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#: context/lyricsdialog.cpp:66 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
-#: rc.cpp:55 rc.cpp:292 rc.cpp:792
+#: context/lyricsdialog.cpp:66 devices/actiondialog.cpp:800
+#: gui/searchpage.cpp:197 po/rc.cpp:86 po/rc.cpp:362 po/rc.cpp:944 rc.cpp:86
+#: rc.cpp:362 rc.cpp:944
 msgid "Artist:"
 msgstr "Artysta:"
 
@@ -143,96 +150,124 @@ msgstr "Szukaj tekstów"
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "Proszę wybrać strony z tekstami."
 
-#: context/lyricsettings.cpp:66
-msgid "(Polish Translations)"
-msgstr "(Polskie tłumaczenia)"
+#: context/othersettings.cpp:45 gui/coverdialog.cpp:877
+#: gui/interfacesettings.cpp:174
+msgid "Images (*.png *.jpg)"
+msgstr "Obrazy (*.png *.jpg)"
 
-#: context/lyricsettings.cpp:67
-msgid "(Portuguese Translations)"
-msgstr "(Portugalskie tłumaczenia)"
+#: context/othersettings.cpp:47 gui/interfacesettings.cpp:176
+msgctxt "pixels"
+msgid "10px"
+msgstr "10px"
+
+#: context/othersettings.cpp:102 gui/interfacesettings.cpp:524
+msgctxt "value%"
+msgid "%1%"
+msgstr "%1%"
+
+#: context/othersettings.cpp:107 gui/interfacesettings.cpp:529
+#, c-format
+msgctxt "pixels"
+msgid "%1px"
+msgstr "%1px"
 
-#: context/songview.cpp:89
+#: context/songview.cpp:90
 msgid "Refresh Lyrics"
 msgstr "Odśwież teksty"
 
-#: context/songview.cpp:90
+#: context/songview.cpp:91
 msgid "Edit Lyrics"
 msgstr "Edytuj teksty"
 
-#: context/songview.cpp:91
+#: context/songview.cpp:92
 msgid "Save Lyrics"
 msgstr "Zapisz teksty"
 
-#: context/songview.cpp:92
+#: context/songview.cpp:93
 msgid "Cancel Editing Lyrics"
 msgstr "Anuluj edycję tekstów"
 
-#: context/songview.cpp:93
+#: context/songview.cpp:94
 msgid "Delete Lyrics File"
 msgstr "Usuń plik z tekstami"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:106 gui/cachesettings.cpp:266
+msgid "Lyrics"
+msgstr "Teksty"
+
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort editing of lyrics?"
 msgstr "Przerwać edycję tekstów?"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort Editing"
 msgstr "Przerwij edycję"
 
-#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
-#: replaygain/rgdialog.cpp:252 replaygain/rgdialog.cpp:253
-#: replaygain/rgdialog.cpp:261 replaygain/rgdialog.cpp:262
-#: tags/trackorganiser.cpp:150
+#: context/songview.cpp:120 context/songview.cpp:139 context/songview.cpp:198
+#: replaygain/rgdialog.cpp:247 replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:256 replaygain/rgdialog.cpp:257
+#: tags/trackorganiser.cpp:164
 msgid "Abort"
 msgstr "Przerwij"
 
-#: context/songview.cpp:121
+#: context/songview.cpp:122
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr "Usunąć zapisaną kopię tekstów i pobrać ponownie?"
 
-#: context/songview.cpp:121 context/songview.cpp:122
-#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
+#: context/songview.cpp:122 context/songview.cpp:123
+#: online/onlineservicespage.cpp:458 online/onlineservicespage.cpp:459
 msgid "Re-download"
 msgstr "Pobierz ponownie"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Current playing song has changed, still perform search?"
 msgstr ""
 "Obecnie odtwarzany utwór uległ zmianie. Czy nadal wykonać wyszukiwanie?"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Song Changed"
 msgstr "Zmieniono utwór"
 
-#: context/songview.cpp:148
+#: context/songview.cpp:149
 msgid "Perform Search"
 msgstr "Szukaj"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save updated lyrics?"
 msgstr "Zapisać uaktualnione teksty?"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save"
 msgstr "Zapisz"
 
-#: context/songview.cpp:185
+#: context/songview.cpp:186
 msgid "Failed to save lyrics."
 msgstr "Zapisanie tekstów nie powiodło się."
 
-#: context/songview.cpp:207
+#: context/songview.cpp:208
 msgid "Delete lyrics file?"
 msgstr "Usunąć plik z tekstami?"
 
-#: context/songview.cpp:207 gui/mainwindow.cpp:292
-#: widgets/messageoverlay.cpp:43
-msgid "Cancel"
-msgstr "Anuluj"
+#: context/songview.cpp:208
+msgid "Delete File"
+msgstr "Usuń plik"
 
-#: context/songview.cpp:431
+#: context/songview.cpp:462
 msgid "Fetching lyrics via %1"
 msgstr "Pobieranie tekstów z %1"
 
+#: context/ultimatelyricsprovider.cpp:200
+msgid "(Polish Translations)"
+msgstr "(Polskie tłumaczenia)"
+
+#: context/ultimatelyricsprovider.cpp:201
+msgid "(Portuguese Translations)"
+msgstr "(Portugalskie tłumaczenia)"
+
+#: context/view.cpp:91 gui/mainwindow.cpp:328 widgets/messageoverlay.cpp:44
+msgid "Cancel"
+msgstr "Anuluj"
+
 #: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "Listing utworów"
@@ -255,7 +290,7 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "album|ścieżka dźwiękowa|kompozycja"
 
-#: context/wikipediasettings.cpp:99
+#: context/wikipediasettings.cpp:114
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
@@ -263,46 +298,62 @@ msgstr ""
 "Proszę wybrać języki Wikipedii, które mają być użyte przy wyszukiwaniu "
 "informacji o artyście i albumie."
 
-#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
-#: online/podcastsearchdialog.cpp:393
+#: context/wikipediasettings.cpp:115 models/streamsmodel.cpp:598
+#: online/podcastsearchdialog.cpp:404
 msgid "Reload"
 msgstr "Odśwież"
 
 #: dbus/powermanagement.cpp:96
 msgid "Cantata is playing a track"
-msgstr ""
+msgstr "Cantata odtwarza utwór"
 
-#: devices/actiondialog.cpp:76
+#: devices/actiondialog.cpp:83
 msgid "Songs To Be Copied"
 msgstr "Utwory do skopiowania"
 
-#: devices/actiondialog.cpp:146
+#: devices/actiondialog.cpp:153
 msgid "<b>INVALID</b>"
 msgstr "<b>NIEWŁAŚCIWY</b>"
 
-#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
+#: devices/actiondialog.cpp:167 devices/actiondialog.cpp:170
 msgid "<i>(When different)</i>"
 msgstr "<i>(Gdy różne)</i>"
 
-#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:185 tags/tageditor.cpp:713
+#: tags/trackorganiser.cpp:444
+msgid ""
+"Cantata has detected that you are connected to a Mopidy server.\n"
+"\n"
+"Currently it is not possible for Cantata to force Mopidy to refresh its "
+"local music listing. Therefore, you will need to stop Cantata, manually "
+"refresh Mopidy's database, and restart Cantata for any changes to be active."
+msgstr ""
+"Wykryto, że program jest połączony z serwerem Mopidy.\n"
+"\n"
+"Na tę chwilę program Cantata nie może wymusić na serwerze Mopidy odświeżenia "
+"lokalnej listy muzyki. Dlatego należy zamknąć program Cantata, ręcznie "
+"odświeżyć bazę danych Mopidy i zrestartować Cantatę aby uaktywnić wszelkie "
+"zmiany."
+
+#: devices/actiondialog.cpp:211 devices/synccollectionwidget.cpp:274
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "Artyści:%1, Albumy:%2, Utwory:%3"
 
-#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
-#: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
+#: devices/actiondialog.cpp:271 devices/mtpdevice.cpp:1622
+#: devices/remotefsdevice.cpp:571 devices/umsdevice.cpp:103
 msgid "%1 free"
 msgstr "%1 wolnego miejsca"
 
-#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
+#: devices/actiondialog.cpp:284 devices/actiondialog.cpp:288
 msgid "Local Music Library"
 msgstr "Lokalna biblioteka muzyki"
 
-#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
+#: devices/actiondialog.cpp:286 devices/albumdetailsdialog.cpp:104
+#: gui/preferencesdialog.cpp:115 widgets/groupedview.cpp:251
 msgid "Audio CD"
 msgstr "Płyta audio"
 
-#: devices/actiondialog.cpp:293
+#: devices/actiondialog.cpp:309
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -314,7 +365,7 @@ msgstr ""
 "Aby utwory mogły zostać skopiowane, będą musiały zostać skonwertowane do "
 "plików o mniejszych rozmiarach."
 
-#: devices/actiondialog.cpp:300
+#: devices/actiondialog.cpp:316
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -322,17 +373,17 @@ msgstr ""
 "W lokalizacji docelowej nie ma wystarczająco dużo miejsca.\n"
 "Zaznaczone utwory zajmują %1, jednak pozostało jedynie %2 miejsca."
 
-#: devices/actiondialog.cpp:349
+#: devices/actiondialog.cpp:365
 msgid "Copy Songs"
 msgstr "Skopiuj utwory"
 
-#: devices/actiondialog.cpp:349 devices/devicespage.cpp:503
-#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: devices/actiondialog.cpp:365 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:214 gui/folderpage.cpp:270 gui/librarypage.cpp:257
 #: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "Usuń utwory"
 
-#: devices/actiondialog.cpp:380
+#: devices/actiondialog.cpp:402
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
@@ -340,15 +391,15 @@ msgstr ""
 "<p>Urządzenie docelowe nie zostało skonfigurowane.<br/>Czy kontynuować z "
 "domyślnymi ustawieniami?</p>"
 
-#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
+#: devices/actiondialog.cpp:403 devices/actiondialog.cpp:407
 msgid "Not Configured"
 msgstr "Nie skonfigurowano"
 
-#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
+#: devices/actiondialog.cpp:404 devices/actiondialog.cpp:408
 msgid "Use Defaults"
 msgstr "Użyj domyślnych"
 
-#: devices/actiondialog.cpp:384
+#: devices/actiondialog.cpp:406
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
@@ -356,224 +407,231 @@ msgstr ""
 "<p>Urządzenie źródłowe nie zostało skonfigurowane.<br/>Czy kontynuować z "
 "domyślnymi ustawieniami?</p>"
 
-#: devices/actiondialog.cpp:446
+#: devices/actiondialog.cpp:468
 msgid "Are you sure you wish to stop?"
 msgstr "Czy na pewno zatrzymać?"
 
-#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
+#: devices/actiondialog.cpp:468 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "Stop"
 
-#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
-#: tags/trackorganiser.cpp:446
+#: devices/actiondialog.cpp:513 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:468 tags/tageditor.cpp:880
+#: tags/trackorganiser.cpp:478
 msgid "Device has been removed!"
 msgstr "Urządzenie zostało usunięte!"
 
-#: devices/actiondialog.cpp:491
+#: devices/actiondialog.cpp:515
 msgid "Device is not connected!"
 msgstr "Urządzenie nie jest podłączone!"
 
-#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
-#: tags/trackorganiser.cpp:456
+#: devices/actiondialog.cpp:517 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:478 tags/tageditor.cpp:890
+#: tags/trackorganiser.cpp:488
 msgid "Device is busy?"
 msgstr "Urządzenie jest zajęte?"
 
-#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:519 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "Urządzenie zostało zmienione?"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:586
 msgid "Clearing unused folders"
 msgstr "Czyszczenie nieużywanych katalogów"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "Obliczyć ReplayGain zgranych utworów?"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "ReplyGain"
 msgstr "ReplayGain"
 
-#: devices/actiondialog.cpp:578
+#: devices/actiondialog.cpp:602
 msgid "Calculate"
 msgstr "Oblicz"
 
-#: devices/actiondialog.cpp:634
-msgid "The destination filename already exists!<hr/>%1"
-msgstr "Istnieje plik o nazwie docelowej!<hr/>%1"
+#: devices/actiondialog.cpp:661
+msgid "The destination filename already exists!"
+msgstr "Istnieje plik o nazwie docelowej!"
 
-#: devices/actiondialog.cpp:637
-msgid "Song already exists!<hr/>%1"
-msgstr "Utwór już istnieje!<hr/>%1"
+#: devices/actiondialog.cpp:664
+msgid "Song already exists!"
+msgstr "Utwór już istnieje!"
 
-#: devices/actiondialog.cpp:640
-msgid "Song does not exist!<hr/>%1"
-msgstr "Utwór nie istnieje!<hr/>%1"
+#: devices/actiondialog.cpp:667
+msgid "Song does not exist!"
+msgstr "Utwór nie istnieje!"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:670
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
-"permissions.<hr/>%1"
+"permissions."
 msgstr ""
 "Tworzenie katalogu docelowego nie powiodło się!<br/>Proszę upewnić się, że "
-"ustawione są odpowiednie prawa dostępu.<hr/>%1"
+"ustawione są odpowiednie prawa dostępu."
 
-#: devices/actiondialog.cpp:646
-msgid "Source file no longer exists?<br/><br/<hr/>%1"
-msgstr "Plik źródłowy już nie istnieje?<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:673
+msgid "Source file no longer exists?"
+msgstr "Plik źródłowy już nie istnieje?"
 
-#: devices/actiondialog.cpp:649
-msgid "Failed to copy.<hr/>%1"
-msgstr "Kopiowanie nie powiodło się.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to copy."
+msgstr "Kopiowanie nie powiodło się."
 
-#: devices/actiondialog.cpp:650
-msgid "Failed to delete.<hr/>%1"
-msgstr "Usuwanie nie powiodło się.<hr/>%1"
+#: devices/actiondialog.cpp:676
+msgid "Failed to delete."
+msgstr "Usuwanie nie powiodło się."
 
-#: devices/actiondialog.cpp:653
-msgid "Not connected to device.<hr/>%1"
-msgstr "Brak połączenia z urządzeniem.<hr/>%1"
+#: devices/actiondialog.cpp:679
+msgid "Not connected to device."
+msgstr "Brak połączenia z urządzeniem."
 
-#: devices/actiondialog.cpp:656
-msgid "Selected codec is not available.<hr/>%1"
-msgstr "Wybrany kodek nie jest dostępny.<hr/>%1"
+#: devices/actiondialog.cpp:682
+msgid "Selected codec is not available."
+msgstr "Wybrany kodek nie jest dostępny."
 
-#: devices/actiondialog.cpp:659
-msgid "Transcoding failed.<br/><br/<hr/>%1"
-msgstr "Konwertowanie nie powiodło się.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:685
+msgid "Transcoding failed."
+msgstr "Konwertowanie nie powiodło się."
 
-#: devices/actiondialog.cpp:662
+#: devices/actiondialog.cpp:688
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
-"devices.)<hr/>%1"
+"devices.)"
 msgstr ""
 "Stworzenie pliku tymczasowego nie powiodło się.<br/>(Wymagane przy "
-"konwertowaniu do urządzeń MTP.)<hr/>%1"
+"konwertowaniu do urządzeń MTP.)"
 
-#: devices/actiondialog.cpp:665
-msgid "Failed to read source file.<br/><br/<hr/>%1"
-msgstr "Odczyt pliku źródłowego nie powiódł się.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:691
+msgid "Failed to read source file."
+msgstr "Odczyt pliku źródłowego nie powiódł się."
 
-#: devices/actiondialog.cpp:668
-msgid "Failed to write to destination file.<br/><br/<hr/>%1"
-msgstr "Zapis do pliku docelowego nie powiódł się!<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:694
+msgid "Failed to write to destination file."
+msgstr "Zapis do pliku docelowego nie powiódł się!"
 
-#: devices/actiondialog.cpp:671
-msgid "No space left on device.<br/><br/<hr/>%1"
-msgstr "Brak miejsca na urządzeniu.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:697
+msgid "No space left on device."
+msgstr "Brak miejsca na urządzeniu."
 
-#: devices/actiondialog.cpp:674
-msgid "Failed to update metadata.<br/><br/<hr/>%1"
-msgstr "Uaktualnienie metadanych nie powiodło się.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:700
+msgid "Failed to update metadata."
+msgstr "Uaktualnienie metadanych nie powiodło się."
 
-#: devices/actiondialog.cpp:677
-msgid "Failed to download track.<br/><br/<hr/>%1"
-msgstr "Pobieranie utworu nie powiodło się.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:703
+msgid "Failed to download track."
+msgstr "Pobieranie utworu nie powiodło się."
 
-#: devices/actiondialog.cpp:680
-msgid "Failed to lock device.<hr/>%1"
-msgstr "Zablokowanie urządzenia nie powiodło się.<hr/>%1"
+#: devices/actiondialog.cpp:706
+msgid "Failed to lock device."
+msgstr "Zablokowanie urządzenia nie powiodło się."
 
-#: devices/actiondialog.cpp:709
+#: devices/actiondialog.cpp:735
 msgid "Local Music Library Properties"
 msgstr "Ustawienia lokalnej biblioteki muzyki"
 
-#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
-msgid "<b>Error</b><br/>"
-msgstr "<b>Błąd</b><br/>"
+#: devices/actiondialog.cpp:776 devices/actiondialog.cpp:790
+#: support/messagebox.cpp:108 support/messagebox.cpp:114
+#: support/messagebox.h:62
+msgid "Error"
+msgstr "Błąd"
 
-#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:780 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Skip"
 msgstr "Pomiń"
 
-#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:781 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Auto Skip"
 msgstr "Automatycznie pomiń"
 
-#: devices/actiondialog.cpp:759
+#: devices/actiondialog.cpp:785
 msgid "Retry"
 msgstr "Spróbuj ponownie"
 
-#: devices/actiondialog.cpp:774
-msgid ""
-"<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
-"td></tr>"
-msgstr ""
-"<tr><td align=\"right\">Artysta:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Numer:</td><td>%3</"
-"td></tr>"
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#: devices/actiondialog.cpp:801 gui/searchpage.cpp:203 po/rc.cpp:374
+#: po/rc.cpp:953 rc.cpp:374 rc.cpp:953
+msgid "Album:"
+msgstr "Album:"
 
-#: devices/actiondialog.cpp:781
-msgid ""
-"<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
-"\"right\">Destination file:</td><td>%2</td></tr>"
-msgstr ""
-"<tr><td align=\"right\">Plik źródłowy:</td><td>%1</td></tr><tr><td align="
-"\"right\">Plik docelowy:</td><td>%2</td></tr>"
+#. i18n: file: tags/tageditor.ui:25
+#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
+#: devices/actiondialog.cpp:802 po/rc.cpp:938 rc.cpp:938
+msgid "Track:"
+msgstr "Utwór:"
+
+#: devices/actiondialog.cpp:806
+msgid "Source file:"
+msgstr "Plik źródłowy:"
 
-#: devices/actiondialog.cpp:786
-msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
-msgstr "<tr><td align=\"right\">Plik:</td><td>%1</td></tr>"
+#: devices/actiondialog.cpp:807
+msgid "Destination file:"
+msgstr "Plik docelowy:"
 
-#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
-#: gui/cachesettings.cpp:230
+#: devices/actiondialog.cpp:809 gui/searchpage.cpp:207
+msgid "File:"
+msgstr "Plik:"
+
+#: devices/actiondialog.cpp:815 gui/cachesettings.cpp:179
+#: gui/cachesettings.cpp:235
 msgid "Calculating..."
 msgstr "Obliczanie..."
 
-#: devices/actiondialog.cpp:799
+#: devices/actiondialog.cpp:822
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (Szacunkowo)"
 
-#: devices/actiondialog.cpp:802
-msgid ""
-"<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
-"i></tr>"
-msgstr ""
-"<tr><i><td align=\"right\"><i>Pozostały czas:</i></td><td><i>%5</i></td></"
-"i></tr>"
+#: devices/actiondialog.cpp:824
+msgid "Time remaining:"
+msgstr "Pozostało:"
 
-#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: devices/actiondialog.cpp:847 devices/fsdevice.cpp:762
 #: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "Zapisywanie pamięci podręcznej"
 
-#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
+#: devices/albumdetailsdialog.cpp:139 devices/albumdetailsdialog.cpp:236
+#: tags/tageditor.cpp:158 tags/tageditor.cpp:373
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "Zastosuj obejście dla 'Various Artists'"
 
-#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
+#: devices/albumdetailsdialog.cpp:140 devices/albumdetailsdialog.cpp:260
+#: tags/tageditor.cpp:159 tags/tageditor.cpp:418
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "Cofnij obejście dla 'Various Artists'"
 
-#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
-#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
+#: devices/albumdetailsdialog.cpp:141 devices/albumdetailsdialog.cpp:278
+#: tags/tageditor.cpp:161 tags/tageditor.cpp:499
 msgid "Capitalize"
 msgstr "Duża pierwsza litera"
 
-#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
-#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
+#: devices/albumdetailsdialog.cpp:142 devices/albumdetailsdialog.cpp:295
+#: tags/tageditor.cpp:162 tags/tageditor.cpp:528
 msgid "Adjust Track Numbers"
 msgstr "Dostosuj numery utworów"
 
-#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
+#: devices/albumdetailsdialog.cpp:144 tags/tageditor.cpp:156
 msgid "Tools"
 msgstr "Narzędzia"
 
-#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:369
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "Zastosować obejście dla 'Various Artists'?"
 
-#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
+#: devices/albumdetailsdialog.cpp:234 tags/tageditor.cpp:371
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -581,11 +639,11 @@ msgstr ""
 "<i>Spowoduje to ustawienie tagów 'ArtystaAlbumu' oraz 'Artysta' na wartość "
 "\"Various Artists\", zaś tagu 'Tytuł' na \"ArtystaUtworu - TytułUtworu\"</i>"
 
-#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:411
 msgid "Revert \"Various Artists\" workaround"
 msgstr "Cofnij obejście dla 'Various Artists'"
 
-#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
+#: devices/albumdetailsdialog.cpp:255 tags/tageditor.cpp:413
 msgid ""
 "<i>Where the 'Album artist' is the same as 'Artist' and the 'Title' is of "
 "the format \"TrackArtist - TrackTitle\", 'Artist' will be taken from 'Title' "
@@ -600,37 +658,27 @@ msgstr ""
 "\"Wibble - Wobble\", wtedy 'Artysta' zostanie ustawiony na \"Wibble\" "
 "natomiast 'Title' będzie miał wartość \"Wobble\"</i>"
 
-#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
+#: devices/albumdetailsdialog.cpp:261 tags/tageditor.cpp:419
 msgid "Revert"
 msgstr "Odwróć"
 
-#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
+#: devices/albumdetailsdialog.cpp:277 tags/tageditor.cpp:497
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr ""
 "Duża pierwsza litera w tagach 'Title', 'Artist', 'Album artist', oraz 'Album'"
 
-#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
+#: devices/albumdetailsdialog.cpp:295 tags/tageditor.cpp:529
 msgid "Adjust track number by:"
 msgstr "Zmień numery utworów o:"
 
-#: devices/albumdetailsdialog.cpp:335 devices/cddbinterface.cpp:143
-#: devices/deviceoptions.cpp:358 devices/musicbrainz.cpp:202
-#: devices/musicbrainz.cpp:324 gui/mainwindow.cpp:1771 gui/mainwindow.cpp:1784
-#: models/musiclibraryitemroot.cpp:362 models/musiclibraryitemroot.cpp:520
-#: models/playqueuemodel.cpp:325 mpd/mpdparseutils.cpp:249
-#: mpd/mpdparseutils.cpp:409 mpd/song.cpp:228 mpd/song.cpp:233
-#: mpd/song.cpp:272 mpd/song.cpp:299 widgets/groupedview.cpp:260
-msgid "Unknown"
-msgstr "Nieznany"
-
 #: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "Odczyt płyty"
 
-#: devices/audiocddevice.cpp:353 gui/mainwindow.cpp:2199
-#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
-#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
+#: devices/audiocddevice.cpp:358 gui/mainwindow.cpp:2345
+#: gui/searchpage.cpp:220 models/albumsmodel.cpp:245 models/musicmodel.cpp:217
+#: models/playlistsmodel.cpp:309 models/playlistsmodel.cpp:324
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "1 Utwór (%2)"
@@ -654,7 +702,7 @@ msgid "Failed to open CD device"
 msgstr "Otwarcie urządzenia CD nie powiodło się"
 
 #: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
-#: devices/musicbrainz.cpp:217
+#: devices/musicbrainz.cpp:216
 msgid "Track %1"
 msgstr "Utwór %1"
 
@@ -674,19 +722,19 @@ msgstr "Błąd CDDB: %1"
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr "Znaleziono wiele pasujących wyników. Proszę wybrać jeden z poniższych:"
 
-#. i18n: file: devices/albumdetails.ui:170
+#. i18n: file: devices/albumdetails.ui:163
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:66
-#: models/playqueuemodel.cpp:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
-#: rc.cpp:82
+#: models/playqueuemodel.cpp:106 po/rc.cpp:113 replaygain/rgdialog.cpp:128
+#: rc.cpp:113
 msgid "Artist"
 msgstr "Artysta"
 
-#. i18n: file: devices/albumdetails.ui:175
+#. i18n: file: devices/albumdetails.ui:168
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:76
-#: models/playqueuemodel.cpp:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
-#: rc.cpp:85
+#: models/playqueuemodel.cpp:105 po/rc.cpp:116 replaygain/rgdialog.cpp:130
+#: rc.cpp:116
 msgid "Title"
 msgstr "Tytuł"
 
@@ -763,7 +811,7 @@ msgstr ""
 "Jeśli tak, to program podejmie próbę przywrócenia rzeczywistej nazwy artysty "
 "z tagu 'Tytuł' oraz usunie nazwę artysty z tagu 'Tytuł'.</p>"
 
-#: devices/devicepropertieswidget.cpp:99
+#: devices/devicepropertieswidget.cpp:98
 msgid ""
 "<p>If you enable this, then Cantata will create a cache of the device's "
 "music library. This will help to speed up subsequent library scans (as the "
@@ -783,19 +831,19 @@ msgstr ""
 "Spowoduje to usunięcie pamięci podręcznej oraz ponowne przeskanowanie "
 "zawartości urządzenia.</p>"
 
-#: devices/devicepropertieswidget.cpp:204
+#: devices/devicepropertieswidget.cpp:209
 msgid "Do not transcode"
 msgstr "Nie konwertuj"
 
-#: devices/devicepropertieswidget.cpp:212
+#: devices/devicepropertieswidget.cpp:216
 msgid "Encoder"
 msgstr "Enkoder"
 
-#: devices/devicepropertieswidget.cpp:228
+#: devices/devicepropertieswidget.cpp:231
 msgid "Transcode to %1"
 msgstr "Konwertuj do \"%1\""
 
-#: devices/devicepropertieswidget.cpp:259
+#: devices/devicepropertieswidget.cpp:262
 msgctxt "name (size free)"
 msgid "%1 (%2 free)"
 msgstr "%1 (%2 wolne)"
@@ -808,11 +856,11 @@ msgstr "Skopiuj do biblioteki"
 msgid "Sync"
 msgstr "Synchronizacja"
 
-#: devices/devicespage.cpp:71
+#: devices/devicespage.cpp:70
 msgid "Forget Device"
 msgstr "Zapomnij o urządzeniu"
 
-#: devices/devicespage.cpp:114 devices/remotedevicepropertiesdialog.cpp:60
+#: devices/devicespage.cpp:113 devices/remotedevicepropertiesdialog.cpp:60
 msgid "Add Device"
 msgstr "Dodaj urządzenie"
 
@@ -821,7 +869,7 @@ msgid "Lookup album and track details?"
 msgstr "Czy wyszukać szczegóły albumu i utworów?"
 
 #: devices/devicespage.cpp:433 devices/devicespage.cpp:445
-#: devices/devicespage.cpp:455
+#: devices/devicespage.cpp:455 gui/mainwindow.cpp:589
 msgid "Refresh"
 msgstr "Odśwież"
 
@@ -851,8 +899,8 @@ msgstr "Częściowy"
 msgid "Full"
 msgstr "Pełny"
 
-#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
-#: gui/librarypage.cpp:257
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:213 gui/folderpage.cpp:269
+#: gui/librarypage.cpp:256
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -880,11 +928,11 @@ msgstr "Czy na pewno rozłączyć się z <b>%1</b>?"
 msgid "Disconnect"
 msgstr "Rozłącz"
 
-#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1220
 msgid "Please close other dialogs first."
 msgstr "Proszę najpierw zamknąć inne okna dialogowe."
 
-#: devices/encoders.cpp:77
+#: devices/encoders.cpp:78
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -902,7 +950,7 @@ msgstr ""
 
 # Nie jestem pewien, czy "przesadzone" nie jest zbyt kolokwialne.
 # Było "nadmiarowe".
-#: devices/encoders.cpp:82
+#: devices/encoders.cpp:83
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>AAC</b> encoder used by Cantata supports a <a "
@@ -933,21 +981,21 @@ msgstr ""
 "<b>120kb/s</b> mogą nie być satysfakcjonujące dla muzyki, a wszystko powyżej "
 "<b>200kb/s</b> jest prawdopodobnie przesadzone."
 
-#: devices/encoders.cpp:100 devices/encoders.cpp:140
+#: devices/encoders.cpp:101 devices/encoders.cpp:141
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr "Szacowany średni bitrate przy kodowaniu ze zmiennym bitrate"
 
-#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
-#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:293 devices/encoders.cpp:329
 msgid "Smaller file"
 msgstr "Mniejszy plik"
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:233 devices/encoders.cpp:329
+#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
+#: devices/encoders.cpp:234 devices/encoders.cpp:330
 msgid "Better sound quality"
 msgstr "Lepsza jakość dźwięku"
 
-#: devices/encoders.cpp:119
+#: devices/encoders.cpp:120
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -965,7 +1013,7 @@ msgstr ""
 
 # nadmiarowe → przesadzone
 # patrz też komentarz do devices/encoders.cpp:62
-#: devices/encoders.cpp:123
+#: devices/encoders.cpp:124
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>MP3</b> encoder used by Cantata supports a <a "
@@ -993,11 +1041,11 @@ msgstr ""
 ">Wartości poniżej <b>120kb/s</b> mogą nie być satysfakcjonujące dla muzyki, "
 "a wszystko powyżej <b>205kb/s</b> jest prawdopodobnie przesadzone."
 
-#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
+#: devices/encoders.cpp:156 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:158
+#: devices/encoders.cpp:159
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1015,7 +1063,7 @@ msgstr ""
 
 # nadmiarowe → przesadzone
 # patrz też komentarz do devices/encoders.cpp:62
-#: devices/encoders.cpp:163
+#: devices/encoders.cpp:164
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Vorbis</b> encoder used by Cantata supports a "
@@ -1050,15 +1098,15 @@ msgstr ""
 "b> mogą nie być satysfakcjonujące dla muzyki, a wszystko powyżej <b>8</b> "
 "jest prawdopodobnie przesadzone."
 
-#: devices/encoders.cpp:183
+#: devices/encoders.cpp:184
 msgid "Quality rating"
 msgstr "Wskaźnik jakości"
 
-#: devices/encoders.cpp:200
+#: devices/encoders.cpp:201
 msgid "Opus"
 msgstr "Opus"
 
-#: devices/encoders.cpp:203
+#: devices/encoders.cpp:204
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1071,7 +1119,7 @@ msgstr ""
 
 # nadmiarowe → przesadzone
 # patrz też komentarz do devices/encoders.cpp:62
-#: devices/encoders.cpp:205
+#: devices/encoders.cpp:206
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Opus</b> encoder used by Cantata supports a <a "
@@ -1095,19 +1143,19 @@ msgstr ""
 "daje ogólnie lepszą jakość i mniejsze pliki, niż gdyby użyć stałego "
 "bitrate'u w całym utworze.<br>Z tego powodu, wyświetlana wartość bitrate "
 "jest tylko oszacowaniem średniego bitrate'u wynikowego utworu.<br><b>128kb/"
-"s</b> jest dobrym wyborem dla użytku w odtwarzaczach przenośnych. <br/>"
-"Wartości poniżej <b>100kb/s</b> mogą nie być satysfakcjonujące dla muzyki, "
+"s</b> jest dobrym wyborem dla użytku w odtwarzaczach przenośnych. <br/"
+">Wartości poniżej <b>100kb/s</b> mogą nie być satysfakcjonujące dla muzyki, "
 "a wszystko powyżej <b>256kb/s</b> jest prawdopodobnie przesadzone."
 
-#: devices/encoders.cpp:222 devices/encoders.cpp:319
+#: devices/encoders.cpp:223 devices/encoders.cpp:320
 msgid "Bitrate"
 msgstr "Bitrate"
 
-#: devices/encoders.cpp:241
+#: devices/encoders.cpp:242
 msgid "Apple Lossless"
 msgstr "Apple Lossless"
 
-#: devices/encoders.cpp:244
+#: devices/encoders.cpp:245
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1122,11 +1170,11 @@ msgstr ""
 "<br>Polecany jedynie dla odtwarzaczy muzycznych firmy Apple oraz odtwarzaczy "
 "nie obsługujących formatu FLAC."
 
-#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:260 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:262
+#: devices/encoders.cpp:263
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1141,7 +1189,7 @@ msgstr ""
 "open-source nie wymagającym licencji patentowych.<br>Kodek ten jest polecany "
 "do przechowywania muzyki bez straty jakości dźwięku."
 
-#: devices/encoders.cpp:266
+#: devices/encoders.cpp:267
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1167,19 +1215,19 @@ msgstr ""
 "<br/>Ponadto, poziomy powyżej <b>5</b> dramatycznie podnoszą czas kompresji "
 "dając jedynie niewiele mniejsze pliki wyjściowe i są niezalecane."
 
-#: devices/encoders.cpp:281
+#: devices/encoders.cpp:282
 msgid "Compression level"
 msgstr "Poziom kompresji"
 
-#: devices/encoders.cpp:291
+#: devices/encoders.cpp:292
 msgid "Faster compression"
 msgstr "Szybsza kompresja"
 
-#: devices/encoders.cpp:298
+#: devices/encoders.cpp:299
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:301
+#: devices/encoders.cpp:302
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1196,7 +1244,7 @@ msgstr ""
 
 # nadmiarowe → przesadzone
 # patrz też komentarz do devices/encoders.cpp:62
-#: devices/encoders.cpp:305
+#: devices/encoders.cpp:306
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>Due to the limitations of the proprietary <b>WMA</b> "
@@ -1220,176 +1268,111 @@ msgstr ""
 "być satysfakcjonujące dla muzyki, a wszystko powyżej <b>182kb/s</b> jest "
 "prawdopodobnie przesadzone."
 
-#: devices/filenameschemedialog.cpp:33
+#: devices/filenameschemedialog.cpp:34
 msgid "Filename Scheme"
 msgstr "Schemat nazwy pliku"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:62
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "Various Artists"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:63
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Wibble"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:64
 msgctxt "Example composer"
 msgid "Vivaldi"
 msgstr "Vivaldi"
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:65
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "Now 5001"
 
-#: devices/filenameschemedialog.cpp:56
+#: devices/filenameschemedialog.cpp:66
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "Wobble"
 
-#: devices/filenameschemedialog.cpp:57
+#: devices/filenameschemedialog.cpp:67
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Dance"
 
-#: devices/filenameschemedialog.cpp:101
+#: devices/filenameschemedialog.cpp:121
 msgid ""
 "<p>The following variables will be replaced with their corresponding meaning "
 "for each track name.</p>"
 msgstr ""
-"<p>Następujące zmienne zostaną zastąpione ich wartościami dla każdego pliku.<"
-"/p>"
+"<p>Następujące zmienne zostaną zastąpione ich wartościami dla każdego pliku."
+"</p>"
 
-#: devices/filenameschemedialog.cpp:103
+#: devices/filenameschemedialog.cpp:123
 msgid ""
-"<tr><th><em>Button</em></th><th><em>Variable</em></th><th><em>Description</"
+"<tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</"
 "em></th></tr>"
 msgstr ""
-"<tr><th><em>Przycisk</em></th><th><em>Zmienna</em></th><th><em>Opis</"
+"<tr><th><em>Zmienna</em></th><th><em>Przycisk</em></th><th><em>Opis</"
 "em></th></tr>"
 
-#: devices/filenameschemedialog.cpp:104
-msgid ""
-"<tr><td>%albumartist%</td><td>%1</td><td>The artist of the album. For most "
-"albums, this will be the same as the <i>Track Artist.</i> For compilations, "
-"this will often be <i>Various Artists.</i> </td></tr>"
-msgstr ""
-"<tr><td>%albumartist%</td><td>%1</td><td>Artysta albumu. Dla większości "
-"albumów będzie to taka sama wartość jak <i>artysta utworu.</i> Dla kompilacji "
-"często przyjmie wartość <i>Various Artists.</i> </td></tr>"
-
-#: devices/filenameschemedialog.cpp:106
-msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
-msgstr "<tr><td>%album%</td><td>%1</td><td>Nazwa albumu.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:107
-msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
-msgstr "<tr><td>%composer%</td><td>%1</td><td>Kompozytor.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:108
-msgid "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
-msgstr "<tr><td>%artist%</td><td>%1</td><td>Artysta utworu.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:109
-msgid ""
-"<tr><td>%title%</td><td>%1</td><td>The track title (without <i>Track Artist</"
-"i>).</td></tr>"
-msgstr ""
-"<tr><td>%title%</td><td>%1</td><td>Tytuł utworu (bez <i>artysty utworu</i>).<"
-"/td></tr>"
-
-#: devices/filenameschemedialog.cpp:110
-msgid ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>The track title (with <i>Track "
-"Artist</i>, if different to <i>Album Artist</i>).</td></tr>"
-msgstr ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>Tytuł utworu (z <i>artystą "
-"utworu</i>, jeśli różny od <i>artysty albumu</i>).</td></tr>"
-
-#: devices/filenameschemedialog.cpp:111
-msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
-msgstr "<tr><td>%track%</td><td>%1</td><td>Numer utworu.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:112
-msgid ""
-"<tr><td>%discnumber%</td><td>%1</td><td>The album number of a multi-album "
-"album. Often compilations consist of several albums.</td></tr>"
-msgstr ""
-"<tr><td>%discnumber%</td><td>%1</td><td>Numer albumu w wieloalbumowych "
-"wydaniach. Często kompilacje zawierają wiele albumów.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:113
-msgid ""
-"<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></tr>"
-msgstr "<tr><td>%year%</td><td>%1</td><td>Rok wydania albumu.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:114
-msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
-msgstr "<tr><td>%genre%</td><td>%1</td><td>Gatunek albumu.</td></tr>"
-
-#: devices/fsdevice.cpp:668
+#: devices/fsdevice.cpp:675 gui/albumspage.cpp:287 gui/folderpage.cpp:304
+#: gui/librarypage.cpp:414
 msgid "Updating..."
 msgstr "Uaktualnianie...."
 
-#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: devices/fsdevice.cpp:757 online/onlineservice.cpp:94
 #: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "Odczytywanie pamięci podręcznej"
 
-#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
+#: devices/fsdevice.cpp:769 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
 
-#: devices/mtpdevice.cpp:137
+#: devices/mtpdevice.cpp:153
 msgid "Connecting to device..."
 msgstr "Łączenie się z urządzeniem..."
 
-#: devices/mtpdevice.cpp:139 devices/mtpdevice.cpp:161
+#: devices/mtpdevice.cpp:155 devices/mtpdevice.cpp:202
 msgid "No devices found"
 msgstr "Nie znaleziono urządzeń"
 
-#: devices/mtpdevice.cpp:173
+#: devices/mtpdevice.cpp:217
 msgid "Connected to device"
 msgstr "Połączono z urządzeniem"
 
-#: devices/mtpdevice.cpp:183
+#: devices/mtpdevice.cpp:230
 msgid "Disconnected from device"
 msgstr "Rozłączono urządzenie"
 
-#: devices/mtpdevice.cpp:250
+#: devices/mtpdevice.cpp:304
 msgid "Updating folders..."
 msgstr "Wysyłanie katalogów..."
 
-#: devices/mtpdevice.cpp:257
+#: devices/mtpdevice.cpp:320
 msgid "Updating files..."
 msgstr "Uaktualniania plików..."
 
-#: devices/mtpdevice.cpp:262 devices/remotefsdevice.cpp:465
-#: devices/remotefsdevice.cpp:485
+#: devices/mtpdevice.cpp:334 devices/remotefsdevice.cpp:461
+#: devices/remotefsdevice.cpp:481
 msgid "Updating tracks..."
 msgstr "Uaktualnianie utworów..."
 
-#: devices/mtpdevice.cpp:281 devices/mtpdevice.cpp:383
-#: models/musiclibraryitemroot.cpp:78 models/musiclibraryitemroot.cpp:117
-#: models/musiclibraryitemroot.cpp:171 models/musiclibraryitemroot.cpp:833
-#: models/musiclibraryitemroot.cpp:1012 mpd/song.cpp:371
-msgid "Various Artists"
-msgstr "Various Artists"
-
-#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
-#: models/devicesmodel.cpp:140
+#: devices/mtpdevice.cpp:1619 devices/remotefsdevice.cpp:564
+#: devices/umsdevice.cpp:100 gui/initialsettingswizard.cpp:57
+#: models/devicesmodel.cpp:157
 msgid "Not Connected"
 msgstr "Nie połączono"
 
-#: devices/musicbrainz.cpp:320
+#: devices/musicbrainz.cpp:319
 msgid "%1 (Disc %2)"
 msgstr "%1 (Płyta %2)"
 
-#: devices/musicbrainz.cpp:408
+#: devices/musicbrainz.cpp:407
 msgid "No matches found in MusicBrainz"
 msgstr "Nie znaleziono pasujących wyników w MusicBrainz"
 
@@ -1397,7 +1380,7 @@ msgstr "Nie znaleziono pasujących wyników w MusicBrainz"
 msgid "Connection"
 msgstr "Połączenie"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:261
 msgid "Music Library"
 msgstr "Biblioteka muzyki"
 
@@ -1425,24 +1408,24 @@ msgstr "Bezpieczna powłoka (sshfs)"
 msgid "Locally Mounted Folder"
 msgstr "Katalog zamontowany lokalnie"
 
-#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:612
+#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:608
 msgid "Available"
 msgstr "Dostępny"
 
-#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:610
+#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:606
 msgid "Not Available"
 msgstr "Niedostępny"
 
-#: devices/remotefsdevice.cpp:315
+#: devices/remotefsdevice.cpp:313
 msgid "Failed to resolve connection details for %1"
 msgstr "Nie powiodło się pobranie szczegółów połączenia dla %1"
 
-#: devices/remotefsdevice.cpp:330 devices/remotefsdevice.cpp:345
-#: devices/remotefsdevice.cpp:403
+#: devices/remotefsdevice.cpp:328 devices/remotefsdevice.cpp:343
+#: devices/remotefsdevice.cpp:399
 msgid "Connecting..."
 msgstr "Łączenie..."
 
-#: devices/remotefsdevice.cpp:358
+#: devices/remotefsdevice.cpp:356
 msgid ""
 "Password prompting does not work when cantata is started from the "
 "commandline."
@@ -1450,7 +1433,7 @@ msgstr ""
 "Pytanie o hasło nie działa, jeśli Cantata uruchomiana została z wiersza "
 "poleceń."
 
-#: devices/remotefsdevice.cpp:379
+#: devices/remotefsdevice.cpp:375
 msgid ""
 "No suitable ssh-askpass application installed! This is required for entering "
 "passwords."
@@ -1458,50 +1441,50 @@ msgstr ""
 "Nie znaleziono odpowiedniej aplikacji ssh-askpass! Jest ona wymagana do "
 "wprowadzania haseł."
 
-#: devices/remotefsdevice.cpp:386
+#: devices/remotefsdevice.cpp:382
 msgid "Mount point (\"%1\") is not empty!"
 msgstr "Punkt montowania (\"%1\") nie jest pusty!"
 
-#: devices/remotefsdevice.cpp:398
+#: devices/remotefsdevice.cpp:394
 msgid "\"sshfs\" is not installed!"
 msgstr "\"sshfs\" nie jest zainstalowane!"
 
-#: devices/remotefsdevice.cpp:426 devices/remotefsdevice.cpp:446
+#: devices/remotefsdevice.cpp:422 devices/remotefsdevice.cpp:442
 msgid "Disconnecting..."
 msgstr "Rozłączanie..."
 
-#: devices/remotefsdevice.cpp:440
+#: devices/remotefsdevice.cpp:436
 msgid "\"fusermount\" is not installed!"
 msgstr "\"fusermount\" nie jest zainstalowane!"
 
-#: devices/remotefsdevice.cpp:461 devices/remotefsdevice.cpp:482
+#: devices/remotefsdevice.cpp:457 devices/remotefsdevice.cpp:478
 msgid "Failed to connect to \"%1\""
 msgstr "Nie powiodło się łączenie z \"%1\""
 
-#: devices/remotefsdevice.cpp:462 devices/remotefsdevice.cpp:497
+#: devices/remotefsdevice.cpp:458 devices/remotefsdevice.cpp:493
 msgid "Failed to disconnect from \"%1\""
 msgstr "Nie powiodło się rozłączanie z \"%1\""
 
-#: devices/remotefsdevice.cpp:573
+#: devices/remotefsdevice.cpp:569
 msgid "Capacity Unknown"
 msgstr "Pojemność nieznana"
 
-#. i18n: file: gui/coverdialog.ui:30
+#. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (text), widget (QPushButton, search)
-#: devices/synccollectionwidget.cpp:53 gui/stdactions.cpp:92
-#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
+#: devices/synccollectionwidget.cpp:54 gui/mainwindow.cpp:323
+#: online/podcastsearchdialog.cpp:334 po/rc.cpp:404 rc.cpp:404
 msgid "Search"
 msgstr "Szukaj"
 
-#: devices/synccollectionwidget.cpp:62
+#: devices/synccollectionwidget.cpp:63
 msgid "Check Items"
 msgstr "Zaznacz elementy"
 
-#: devices/synccollectionwidget.cpp:64
+#: devices/synccollectionwidget.cpp:65
 msgid "Uncheck Items"
 msgstr "Odznacz elementy"
 
-#: devices/synccollectionwidget.cpp:266
+#: devices/synccollectionwidget.cpp:272
 msgid "Nothing selected"
 msgstr "Brak zaznaczenia"
 
@@ -1525,7 +1508,7 @@ msgstr "Synchronizuj"
 msgid "Device and library are in sync."
 msgstr "Urządzenie i biblioteka są zsynchronizowane."
 
-#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:190
+#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:188
 msgid "Not Scanned"
 msgstr "Nie przeskanowano"
 
@@ -1533,22 +1516,22 @@ msgstr "Nie przeskanowano"
 msgid " (recommended)"
 msgstr " (zalecane)"
 
-#: dynamic/dynamic.cpp:208
+#: dynamic/dynamic.cpp:215
 msgid "Start Dynamic Playlist"
 msgstr "Uruchom playlistę dynamiczną"
 
-#: dynamic/dynamic.cpp:209
+#: dynamic/dynamic.cpp:216
 msgid "Stop Dynamic Mode"
 msgstr "Zatrzymaj tryb dynamiczny"
 
-#: dynamic/dynamic.cpp:257
+#: dynamic/dynamic.cpp:264
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "1 reguła"
 msgstr[1] "%1 reguły"
 msgstr[2] "%1 reguł"
 
-#: dynamic/dynamic.cpp:396
+#: dynamic/dynamic.cpp:403
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
@@ -1556,71 +1539,71 @@ msgstr ""
 "Należy w systemie zainstalować narzędzie \"perl\" aby tryb dynamiczny "
 "Cantaty mógł działać."
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:410
 msgid "Failed to locate rules file - %1"
 msgstr "Odnalezienie pliku z regułami nie powiodło się - %1"
 
-#: dynamic/dynamic.cpp:411
+#: dynamic/dynamic.cpp:418
 msgid "Failed to remove previous rules file - %1"
 msgstr "Usunięcie poprzedniego pliku z regułami nie powiodło się - %1"
 
-#: dynamic/dynamic.cpp:416
+#: dynamic/dynamic.cpp:423
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "Instalacja pliku z regułami nie powiodła się - %1 -> %2"
 
-#: dynamic/dynamic.cpp:729
+#: dynamic/dynamic.cpp:736
 msgid "Dynamizer has been terminated."
 msgstr "Dynamizer został wyłączony."
 
-#: dynamic/dynamic.cpp:816
+#: dynamic/dynamic.cpp:823 mpd/mpdconnection.cpp:150
 msgid "Uknown"
 msgstr "Nieznany"
 
-#: dynamic/dynamic.cpp:818
+#: dynamic/dynamic.cpp:825
 msgid "Loading list of rules"
 msgstr "Ładowanie listy reguł"
 
-#: dynamic/dynamic.cpp:819
+#: dynamic/dynamic.cpp:826
 msgid "Saving rule"
 msgstr "Zapisywanie reguły"
 
-#: dynamic/dynamic.cpp:820
+#: dynamic/dynamic.cpp:827
 msgid "Deleting rule"
 msgstr "Usuwanie reguły"
 
-#: dynamic/dynamic.cpp:821
+#: dynamic/dynamic.cpp:828
 msgid "Setting active rule"
 msgstr "Ustawianie aktywnej reguły"
 
-#: dynamic/dynamic.cpp:822
+#: dynamic/dynamic.cpp:829
 msgid "Stopping dynamizer"
 msgstr "Zatrzymywanie dynamizera"
 
-#: dynamic/dynamic.cpp:823
+#: dynamic/dynamic.cpp:830
 msgid "Requesting ID details"
 msgstr "Pobieranie szczegółów ID"
 
-#: dynamic/dynamic.cpp:826
+#: dynamic/dynamic.cpp:833
 msgid "Awaiting response for previous command. (%1)"
 msgstr "Oczekiwanie na odpowiedź dla poprzedniej komendy. (%1)"
 
-#: dynamic/dynamic.cpp:981
+#: dynamic/dynamic.cpp:988
 msgid "Dynamizer is not active"
 msgstr "Dynamizer nie jest aktywny"
 
-#: dynamic/dynamic.cpp:989
+#: dynamic/dynamic.cpp:996
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "Odczyt dynamicznych reguł nie powiódł się. (%1)"
 
-#: dynamic/dynamic.cpp:1020
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to delete rules file. (%1)"
 msgstr "Usunięcie pliku z regułami nie powiodło się. (%1)"
 
-#: dynamic/dynamic.cpp:1027
+#: dynamic/dynamic.cpp:1034
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Kontrola stanu dynamizera nie powiodła się. (%1)"
 
-#: dynamic/dynamic.cpp:1036
+#: dynamic/dynamic.cpp:1043
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "Ustawianie dynamicznych reguł nie powiodło się. (%1)"
 
@@ -1636,11 +1619,11 @@ msgstr "Dodaj dynamiczne reguły"
 msgid "Edit Dynamic Rules"
 msgstr "Edytuj dynamiczne reguły"
 
-#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:151
+#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:150
 msgid "Remove Dynamic Rules"
 msgstr "Usuń dynamiczne reguły"
 
-#: dynamic/dynamicpage.cpp:150
+#: dynamic/dynamicpage.cpp:149
 msgid ""
 "Are you sure you wish to remove the selected rules?\n"
 "This cannot be undone."
@@ -1654,16 +1637,16 @@ msgstr "Dynamiczna reguła"
 
 #. i18n: file: dynamic/dynamicrules.ui:53
 #. i18n: ectx: property (text), widget (QPushButton, addBtn)
-#: dynamic/dynamicruledialog.cpp:136 po/rc.cpp:280 rc.cpp:280
+#: dynamic/dynamicruledialog.cpp:145 po/rc.cpp:341 rc.cpp:341
 msgid "Add"
 msgstr "Dodaj"
 
-#: dynamic/dynamicruledialog.cpp:202
+#: dynamic/dynamicruledialog.cpp:211
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr ""
 "<i><b>BŁĄD</b>: 'Od roku' powinno mieć mniejszą wartość niż 'Do roku'</i>"
 
-#: dynamic/dynamicruledialog.cpp:205
+#: dynamic/dynamicruledialog.cpp:214
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1679,27 +1662,27 @@ msgstr "PodobniArtyści"
 msgid "AlbumArtist"
 msgstr "ArtystaAlbumu"
 
-#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: file: devices/filenameschemedialog.ui:102
 #. i18n: ectx: property (text), widget (QPushButton, composer)
-#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:212 rc.cpp:212
 msgid "Composer"
 msgstr "Kompozytor"
 
-#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:48
+#: models/playqueuemodel.cpp:107 replaygain/rgdialog.cpp:129
 msgid "Album"
 msgstr "Album"
 
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:106
-#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:112
+#: po/rc.cpp:254 po/rc.cpp:380 rc.cpp:254 rc.cpp:380
 msgid "Genre"
 msgstr "Gatunek"
 
@@ -1773,88 +1756,87 @@ msgstr "Nadpisz reguły"
 msgid "Saving %1"
 msgstr "Zapisywanie %1"
 
-#: gui/cachesettings.cpp:168
+#: gui/cachesettings.cpp:173
 msgid "Deleting..."
 msgstr "Usuwanie..."
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Name"
 msgstr "Nazwa"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Item Count"
 msgstr "Liczba elementów"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Space Used"
 msgstr "Użyta przestrzeń"
 
-#: gui/cachesettings.cpp:234
+#: gui/cachesettings.cpp:239
 msgid "Total space used: %1"
 msgstr "Całkowita użyta przestrzeń: %1"
 
-#: gui/cachesettings.cpp:245
+#: gui/cachesettings.cpp:250
 msgid ""
-"To speed up loading of the music library, Cantata caches a local copy of the "
-"MPD listing. Cantata might also have cached covers, or lyrics, if these have "
-"been downloaded and could not be saved into the MPD folder (because Cantata "
-"cannot access it, or you have configured Cantata to not save these items "
-"there). Below is a summary of Cantata's cache usage."
+"Cantata caches a local copy of the MPD listing to speed up loading of the "
+"music library. Cantata might also have cached covers, lyrics, or artist "
+"images, if these have been downloaded and could not be saved into the MPD "
+"folder (because Cantata cannot access it, or you have configured Cantata to "
+"not save these items there). Below is a summary of Cantata's current cache "
+"usage."
 msgstr ""
-"Aby przyspieszyć ładowanie biblioteki muzycznej, Cantata zapisuje w pamięci "
-"podręcznej lokalne kopie list z MPD. Cantata może ponadto zapisać okładki, "
-"teksty jeśli te zostały pobrane i nie mogły zostać zapisane do katalogu MPD "
-"(ponieważ Cantata nie ma do niego dostępu albo jeśli wybrano w ustawieniach, "
-"aby ich tam nie zapisywać). Poniżej przedstawiono podsumowanie użycia "
-"pamięci podręcznej Cantaty."
+"Cantata zapisuje w pamięci podręcznej lokalne kopie list z MPD aby "
+"przyspieszyć ładowanie biblioteki muzycznej. Cantata może ponadto zapisać "
+"okładki, teksty i obrazy artystów jeśli te zostały pobrane i nie mogły zostać "
+"zapisane do katalogu MPD (ponieważ Cantata nie ma do niego dostępu albo jeśli "
+"wybrano w ustawieniach, aby ich tam nie zapisywać). Poniżej przedstawiono "
+"podsumowanie użycia pamięci podręcznej Cantaty."
 
-#: gui/cachesettings.cpp:257
+#: gui/cachesettings.cpp:263
 msgid "Covers"
 msgstr "Okładki"
 
-#: gui/cachesettings.cpp:258
+#: gui/cachesettings.cpp:264
+msgid "Scaled Covers"
+msgstr "Przeskalowane okładki"
+
+#: gui/cachesettings.cpp:265
 msgid "Backdrops"
 msgstr "Tło"
 
-#: gui/cachesettings.cpp:263 gui/interfacesettings.cpp:167
-#: gui/mainwindow.cpp:283 gui/preferencesdialog.cpp:85
-#: widgets/groupedview.cpp:256
-msgid "Streams"
-msgstr "Strumienie"
+#: gui/cachesettings.cpp:271
+msgid "Stream Listings"
+msgstr "Listy strumieni"
 
-#: gui/cachesettings.cpp:264
+#: gui/cachesettings.cpp:274
 msgid "Jamendo"
 msgstr "Jamendo"
 
-#: gui/cachesettings.cpp:265
+#: gui/cachesettings.cpp:275
 msgid "Magnatune"
 msgstr "Magnatune"
 
-#: gui/cachesettings.cpp:266
+#: gui/cachesettings.cpp:276
 msgid "Podcast Directories"
 msgstr "Katalogi podcastów"
 
-#: gui/cachesettings.cpp:273
+#: gui/cachesettings.cpp:285
 msgid "Delete All"
 msgstr "Usuń wszystko"
 
-#: gui/cachesettings.cpp:312
+#: gui/cachesettings.cpp:324
 msgid "Delete all '%1' items?"
 msgstr "Czy usunąć wszystkie '%1' elementów?"
 
-#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
+#: gui/cachesettings.cpp:325 gui/cachesettings.cpp:335
 msgid "Delete Cache Items"
 msgstr "Usuń elementy pamięci podręcznej"
 
-#: gui/cachesettings.cpp:322
+#: gui/cachesettings.cpp:334
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr "<p>Czy usunąć wszystkie z wymienionych?<ul>%1</ul></p>"
 
-#: gui/coverdialog.cpp:151 gui/main.cpp:231
-msgid "Last.fm"
-msgstr "Last.fm"
-
-#: gui/coverdialog.cpp:165
+#: gui/coverdialog.cpp:124
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1865,53 +1847,39 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:184
-msgctxt ""
-"Google\n"
-"width x height (file size)"
-msgid ""
-"Google\n"
-"%1 x %2 (%3)"
-msgstr ""
-"Google\n"
-"%1 x %2 (%3)"
-
-#: gui/coverdialog.cpp:204
+#: gui/coverdialog.cpp:126
 msgctxt ""
-"Discogs\n"
+"name\n"
 "width x height"
 msgid ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 msgstr ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 
-#: gui/coverdialog.cpp:238
-msgctxt ""
-"Current Cover\n"
-"width x height"
-msgid ""
-"Current Cover\n"
-"%1 x %2"
-msgstr ""
-"Obecna okładka\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:162
+msgid "Current Cover"
+msgstr "Obecna okładka"
+
+#: gui/coverdialog.cpp:211 gui/coverdialog.cpp:411
+msgid "CoverArt Archive"
+msgstr "Archiwum okładek"
 
-#: gui/coverdialog.cpp:256
+#: gui/coverdialog.cpp:242
 msgid "Image"
 msgstr "Obraz"
 
-#: gui/coverdialog.cpp:259
+#: gui/coverdialog.cpp:245
 msgid "Downloading..."
 msgstr "Pobieranie..."
 
-#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
+#: gui/coverdialog.cpp:290 gui/coverdialog.cpp:325
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "Obraz (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:446
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
@@ -1919,7 +1887,7 @@ msgstr ""
 "<p>Obraz dla tego artysty już istnieje a plik nie jest do zapisu.<p></p><i>"
 "%1</i></p>"
 
-#: gui/coverdialog.cpp:433
+#: gui/coverdialog.cpp:447
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
@@ -1927,13 +1895,16 @@ msgstr ""
 "<p>Okładka dla tego albumu już istnieje a plik nie jest do zapisu.<p></p><i>"
 "%1</i></p>"
 
-#: gui/coverdialog.cpp:440 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:234
-msgctxt "Album by Artist"
-msgid "%1 by %2"
-msgstr "%1 w wykonaniu  %2"
+#: gui/coverdialog.cpp:452
+msgid "'%1' Artist Image"
+msgstr "'%1' Obraz artysty"
+
+#: gui/coverdialog.cpp:454
+msgctxt "'Artist - Album' Album Cover"
+msgid "'%1 - %2' Album Cover"
+msgstr "'%1 - %2' Okładka albumu"
 
-#: gui/coverdialog.cpp:579
+#: gui/coverdialog.cpp:582
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1941,27 +1912,23 @@ msgstr ""
 "Ustawienie okładki nie powiodło się!\n"
 "Nie można pobrać do pliku tymczasowego!"
 
-#: gui/coverdialog.cpp:607
+#: gui/coverdialog.cpp:616
 msgid "Failed to download image!"
 msgstr "Pobieranie obrazu nie powiodło się!"
 
-#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
+#: gui/coverdialog.cpp:875 gui/coverdialog.cpp:877
 msgid "Load Local Cover"
 msgstr "Załaduj okładkę lokalną"
 
-#: gui/coverdialog.cpp:795
-msgid "Images (*.png *.jpg)"
-msgstr "Obrazy (*.png *.jpg)"
-
-#: gui/coverdialog.cpp:800
+#: gui/coverdialog.cpp:882
 msgid "File is already in list!"
 msgstr "Plik istnieje już na liście!"
 
-#: gui/coverdialog.cpp:804
+#: gui/coverdialog.cpp:886
 msgid "Failed to read image!"
 msgstr "Odczyt obrazu nie powiódł się!"
 
-#: gui/coverdialog.cpp:817
+#: gui/coverdialog.cpp:899
 msgid "Display"
 msgstr "Wyświetl"
 
@@ -1973,12 +1940,12 @@ msgstr "Wyświetl"
 #. i18n: ectx: property (text), widget (QPushButton, removeBtn)
 #. i18n: file: streams/streamssettings.ui:73
 #. i18n: ectx: property (text), widget (QPushButton, removeButton)
-#: gui/coverdialog.cpp:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
-#: rc.cpp:286 rc.cpp:765
+#: gui/coverdialog.cpp:900 gui/stdactions.cpp:90 po/rc.cpp:347 po/rc.cpp:917
+#: rc.cpp:347 rc.cpp:917
 msgid "Remove"
 msgstr "Usuń"
 
-#: gui/coverdialog.cpp:1181
+#: gui/coverdialog.cpp:1333
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1986,7 +1953,7 @@ msgstr ""
 "Ustawienie okładki nie powiodło się!\n"
 "Nie można wykonać kopii!"
 
-#: gui/coverdialog.cpp:1190
+#: gui/coverdialog.cpp:1342
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1994,7 +1961,7 @@ msgstr ""
 "Failed to set cover!\n"
 "Nie można zrobić kopii zapasowej oryginału!"
 
-#: gui/coverdialog.cpp:1239
+#: gui/coverdialog.cpp:1391
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -2002,164 +1969,252 @@ msgstr ""
 "Ustawienie okładki nie powiodło się!\n"
 "Nie można skopiować pliku do '%1'!"
 
+#: gui/coverdialog.cpp:1449 models/onlineservicesmodel.cpp:157
+msgid "Searching..."
+msgstr "Szukanie..."
+
 # w pliku doplphin.desktop jest "menedżer", więc zmieniam dla spójności
-#: gui/folderpage.cpp:45
+#: gui/folderpage.cpp:44
 msgid "Open In File Manager"
 msgstr "Otwórz w menedżerze plików"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Established"
 msgstr "Nawiązano połączenie"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Failed"
 msgstr "Połączenie nie powiodło się"
 
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
+#. i18n: file: support/shortcutssettingswidget.ui:78
+#. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
 #. i18n: file: support/shortcutssettingswidget.ui:78
 #. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
-#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
-#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
+#: gui/interfacesettings.cpp:48 gui/playbacksettings.cpp:46
+#: online/magnatuneservice.cpp:159 po/rc.cpp:6 po/rc.cpp:660 po/rc.cpp:751
+#: po/rc.cpp:778 po/rc.cpp:932 rc.cpp:6 rc.cpp:660 rc.cpp:751 rc.cpp:778
+#: rc.cpp:932
 msgid "None"
 msgstr "Brak"
 
-#: gui/interfacesettings.cpp:40
+#: gui/interfacesettings.cpp:49 gui/interfacesettings.cpp:160
 msgid "Small"
 msgstr "Małe"
 
-#: gui/interfacesettings.cpp:41
+#: gui/interfacesettings.cpp:50
 msgid "Medium"
 msgstr "Średnie"
 
-#: gui/interfacesettings.cpp:42
+#: gui/interfacesettings.cpp:51 gui/interfacesettings.cpp:159
 msgid "Large"
 msgstr "Duże"
 
-#: gui/interfacesettings.cpp:43
+#: gui/interfacesettings.cpp:52
 msgid "Extra Large"
 msgstr "Bardzo duże"
 
-#: gui/interfacesettings.cpp:48
+#: gui/interfacesettings.cpp:57
+msgid "Basic Tree (No Icons)"
+msgstr "Drzewo podstawowe (bez ikon)"
+
+#: gui/interfacesettings.cpp:58
 msgid "Simple Tree"
 msgstr "Proste drzewo"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:59
 msgid "Detailed Tree"
 msgstr "Szczegółowe drzewo"
 
-#. i18n: file: gui/interfacesettings.ui:329
+#. i18n: file: gui/interfacesettings.ui:449
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
+#: gui/interfacesettings.cpp:61 po/rc.cpp:639 rc.cpp:639
 msgid "Grouped Albums"
 msgstr "Grupuj Albumy"
 
-#: gui/interfacesettings.cpp:53
+#: gui/interfacesettings.cpp:63
 msgid "List"
 msgstr "Lista"
 
-#: gui/interfacesettings.cpp:55
+#: gui/interfacesettings.cpp:65
 msgid "Icon/List"
 msgstr "Ikony/Lista"
 
-#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+#. i18n: file: gui/interfacesettings.ui:454
+#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
+#: gui/interfacesettings.cpp:68 po/rc.cpp:642 rc.cpp:642
+msgid "Table"
+msgstr "Tabela"
+
+#: gui/interfacesettings.cpp:104
+msgid "Play queue"
+msgstr "Kolejka odtwarzania"
+
+#. i18n: file: gui/interfacesettings.ui:182
+#. i18n: ectx: attribute (title), widget (QWidget, tab)
+#: gui/interfacesettings.cpp:105 gui/mainwindow.cpp:307 po/rc.cpp:569
+#: rc.cpp:569
+msgid "Artists"
+msgstr "Artyści"
+
+#: gui/interfacesettings.cpp:107 gui/interfacesettings.cpp:138
+#: gui/mainwindow.cpp:309
 msgid "Folders"
 msgstr "Katalogi"
 
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:337
+#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
+#: gui/interfacesettings.cpp:108 gui/mainwindow.cpp:310 po/rc.cpp:609
+#: rc.cpp:609
+msgid "Playlists"
+msgstr "Playlisty"
+
+#: gui/interfacesettings.cpp:110
+msgid "Dynamic Playlists"
+msgstr "Dynamiczne playlisty"
+
+#: gui/interfacesettings.cpp:114
+msgid "Streams (e.g. Radio Stations)"
+msgstr "Strumienie (np. stacje radiowe)"
+
+#: gui/interfacesettings.cpp:121
+msgid "Online Services - Jamendo, Maganatune, SoundCloud, and Podcasts"
+msgstr "Serwisy online - Jamendo, Maganatune, SoundCloud, i podcasty"
+
+#: gui/interfacesettings.cpp:128
+msgid "Devices - UMS, MTP (e.g. Android), and AudioCDs"
+msgstr "Urządzenia - UMS, MTP (np. Android), i płyty AudioCDs"
+
+#: gui/interfacesettings.cpp:134
+msgid "Search (via MPD)"
+msgstr "Szukaj (przez MPD)"
+
+#: gui/interfacesettings.cpp:135
+msgid "Info - Current song information (artist, album, and lyrics)"
+msgstr ""
+"Informacje - szczegóły dotyczące obecnego utworu (artysta, album i teksty)"
+
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#: gui/interfacesettings.cpp:165 gui/interfacesettings.cpp:168
-#: gui/interfacesettings.cpp:171 gui/interfacesettings.cpp:174 po/rc.cpp:472
-#: po/rc.cpp:491 po/rc.cpp:512 po/rc.cpp:536 rc.cpp:472 rc.cpp:491 rc.cpp:512
-#: rc.cpp:536
+#: gui/interfacesettings.cpp:139 po/rc.cpp:554 po/rc.cpp:572 po/rc.cpp:591
+#: po/rc.cpp:612 po/rc.cpp:636 rc.cpp:554 rc.cpp:572 rc.cpp:591 rc.cpp:612
+#: rc.cpp:636
 msgid "Style:"
 msgstr "Styl:"
 
-#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
-#: gui/preferencesdialog.cpp:89
-msgid "Online"
-msgstr "On-line"
+#: gui/interfacesettings.cpp:161
+msgid "Tab-bar"
+msgstr "Pasek kart"
 
-#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
-msgid "Devices"
-msgstr "Urządzenia"
+#: gui/interfacesettings.cpp:162
+msgid "Left"
+msgstr "Z lewej"
 
-#: gui/interfacesettings.cpp:178
-msgid "Grouped by 'Album Artist'"
-msgstr "Pogrupowane według 'Artysta albumu'"
+#: gui/interfacesettings.cpp:162
+msgid "Right"
+msgstr "Z prawej"
 
-#: gui/interfacesettings.cpp:179
-msgid "Grouped under 'Various Artists'"
-msgstr "Pogrupowane według 'Various Artists'"
+#: gui/interfacesettings.cpp:163
+msgid "Top"
+msgstr "U góry"
 
-#: gui/main.cpp:213 gui/mainwindow.cpp:1941 gui/trayitem.cpp:98
-#: gui/trayitem.cpp:100 gui/trayitem.cpp:135 gui/trayitem.cpp:199
-#: gui/trayitem.cpp:209 gui/trayitem.cpp:212 gui/trayitem.cpp:215
-#: gui/trayitem.cpp:228 gui/trayitem.cpp:230
+#: gui/interfacesettings.cpp:164
+msgid "Bottom"
+msgstr "U dołu"
+
+#: gui/interfacesettings.cpp:391
+msgid "System default"
+msgstr "Domyślne systemowe"
+
+#: gui/main.cpp:224 gui/mainwindow.cpp:2075 gui/trayitem.cpp:112
+#: gui/trayitem.cpp:118 gui/trayitem.cpp:153 gui/trayitem.cpp:217
+#: gui/trayitem.cpp:227 gui/trayitem.cpp:230 gui/trayitem.cpp:233
+#: gui/trayitem.cpp:246 gui/trayitem.cpp:248
 msgid "Cantata"
 msgstr "Cantata"
 
-#: gui/main.cpp:214
+#: gui/main.cpp:225
 msgid "A KDE client for MPD"
 msgstr "Klient KDE dla odtwarzacza MPD "
 
-#: gui/main.cpp:216
-msgid "Copyright (c) 2011–2013 Craig Drummond"
-msgstr "Copyright (c) 2011–2013 Craig Drummond"
+#: gui/main.cpp:227
+msgid "© 2011-2014 Craig Drummond"
+msgstr "© 2011-2014 Craig Drummond"
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Maintainer"
 msgstr "Opiekun"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "UI Improvements"
 msgstr "Poprawki interfejsu"
 
-#: gui/main.cpp:222
+#: gui/main.cpp:233
 msgid "Sander Knopper"
 msgstr "Sander Knopper"
 
-#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
+#: gui/main.cpp:233 gui/main.cpp:234 gui/main.cpp:235 gui/main.cpp:236
 msgid "QtMPC author"
 msgstr "Autor QtMPC"
 
-#: gui/main.cpp:223
+#: gui/main.cpp:234
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:224
+#: gui/main.cpp:235
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:225
+#: gui/main.cpp:236
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
@@ -2167,101 +2222,105 @@ msgstr ""
 "Tła widoku kontekstowego (proszę rozpatrzeć przesłanie własnych obrazów na "
 "fanart.tv)"
 
-#: gui/main.cpp:230
+#: gui/main.cpp:238
 msgid "Wikipedia"
 msgstr "Wikipedia"
 
-#: gui/main.cpp:230 gui/main.cpp:231
+#: gui/main.cpp:238 gui/main.cpp:239
 msgid "Context view metadata"
 msgstr "Metadane widoku kontekstowego"
 
-#: gui/main.cpp:235
+#: gui/main.cpp:239
+msgid "Last.fm"
+msgstr "Last.fm"
+
+#: gui/main.cpp:243
 msgid "URL to open"
 msgstr "URL do otwarcia"
 
-#: gui/mainwindow.cpp:238
+#: gui/mainwindow.cpp:269
 msgid "Quit"
 msgstr "Zamknij"
 
-#: gui/mainwindow.cpp:242
+#: gui/mainwindow.cpp:273
 msgid "Show Window"
 msgstr "Pokaż okno"
 
 #. i18n: file: gui/initialsettingswizard.ui:469
 #. i18n: ectx: property (text), widget (QPushButton, connectButton)
-#: gui/mainwindow.cpp:245 po/rc.cpp:418 rc.cpp:418
+#: gui/mainwindow.cpp:276 po/rc.cpp:482 rc.cpp:482
 msgid "Connect"
 msgstr "Połącz"
 
-#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
+#: gui/mainwindow.cpp:277 gui/preferencesdialog.cpp:83
 msgid "Collection"
 msgstr "Kolekcja"
 
-#: gui/mainwindow.cpp:247
+#: gui/mainwindow.cpp:278
 msgid "Outputs"
 msgstr "Wyjścia"
 
-#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
+#: gui/mainwindow.cpp:279 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "Zatrzymaj po utworze"
 
-#: gui/mainwindow.cpp:249
+#: gui/mainwindow.cpp:280
 msgid "Add To Stored Playlist"
 msgstr "Dodaj do zapisanej playlisty"
 
-#: gui/mainwindow.cpp:250
+#: gui/mainwindow.cpp:281
 msgid "Remove From Play Queue"
 msgstr "Usuń z kolejki odtwarzania"
 
-#: gui/mainwindow.cpp:251
+#: gui/mainwindow.cpp:282
 msgid "Copy Track Info"
 msgstr "Skopiuj informację o utworze"
 
-#: gui/mainwindow.cpp:252
+#: gui/mainwindow.cpp:283
 msgid "Crop"
 msgstr "Usuń wszystkie poza"
 
-#: gui/mainwindow.cpp:253
+#: gui/mainwindow.cpp:284
 msgid "Shuffle Tracks"
 msgstr "Wymieszaj utwory"
 
-#: gui/mainwindow.cpp:254
+#: gui/mainwindow.cpp:285
 msgid "Shuffle Albums"
 msgstr "Wymieszaj albumy"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:286
 msgid "Add Stream URL"
 msgstr "Dodaj URL strumienia"
 
-#: gui/mainwindow.cpp:256
+#: gui/mainwindow.cpp:287
 msgid "Clear"
 msgstr "Wyczyść"
 
-#: gui/mainwindow.cpp:257
+#: gui/mainwindow.cpp:288
 msgid "Expanded Interface"
 msgstr "Interfejs rozszerzony"
 
-#: gui/mainwindow.cpp:258
+#: gui/mainwindow.cpp:289
 msgid "Show Current Song Information"
 msgstr "Pokaż informacje o obecnym utworze"
 
-#: gui/mainwindow.cpp:261
+#: gui/mainwindow.cpp:292
 msgid "Full Screen"
 msgstr "Pełen ekran"
 
-#: gui/mainwindow.cpp:263
+#: gui/mainwindow.cpp:294
 msgid "Random"
 msgstr "Losowo"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:295
 msgid "Repeat"
 msgstr "Powtarzaj"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid "Single"
 msgstr "Tryb pojedynczy"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
@@ -2270,11 +2329,11 @@ msgstr ""
 "utworze; utwór jest zapętlany, jeśli dodatkowo jest włączony tryb "
 "'Powtarzaj'."
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid "Consume"
 msgstr "Tryb konsumowania"
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
@@ -2282,108 +2341,109 @@ msgstr ""
 "Gdy tryb konsumowania jest aktywny, obecny utwór jest usuwany z kolejki po "
 "jego zakończeniu."
 
-#: gui/mainwindow.cpp:267
-msgid "Search Play Queue"
-msgstr "Szukaj w kolejce odtwarzania"
-
-#: gui/mainwindow.cpp:269
+#: gui/mainwindow.cpp:298
 msgid "Set Priority"
 msgstr "Ustaw priorytet"
 
-#: gui/mainwindow.cpp:271
+#: gui/mainwindow.cpp:300
 msgid "Play Stream"
 msgstr "Odtwarzaj strumień"
 
-#: gui/mainwindow.cpp:273
+#: gui/mainwindow.cpp:302
 msgid "Locate In Library"
 msgstr "Znajdź w bibliotece"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:304
 msgid "Edit Song Tags"
 msgstr "Edytuj tagi utworów"
 
-#. i18n: file: gui/interfacesettings.ui:304
+#. i18n: file: gui/interfacesettings.ui:429
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
+#: gui/mainwindow.cpp:306 po/rc.cpp:633 rc.cpp:633
 msgid "Play Queue"
 msgstr "Kolejka odtwarzania"
 
-#. i18n: file: gui/interfacesettings.ui:27
-#. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
-msgid "Artists"
-msgstr "Artyści"
-
-#. i18n: file: gui/interfacesettings.ui:202
-#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
-#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
-msgid "Playlists"
-msgstr "Playlisty"
-
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:312
 msgid "Dynamic"
 msgstr "Dynamiczny"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:315 gui/preferencesdialog.cpp:89
+#: widgets/groupedview.cpp:251
+msgid "Streams"
+msgstr "Strumienie"
+
+#: gui/mainwindow.cpp:318 gui/preferencesdialog.cpp:94
+msgid "Online"
+msgstr "On-line"
+
+#: gui/mainwindow.cpp:321
+msgid "Devices"
+msgstr "Urządzenia"
+
+#: gui/mainwindow.cpp:324
 msgid "Expand All"
 msgstr "Rozwiń wszystkie"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:325
 msgid "Collapse All"
 msgstr "Zwiń wszystkie"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:326
 msgid "Remove All Songs"
 msgstr "Usuń wszystkie utwory"
 
-#: gui/mainwindow.cpp:398
+#: gui/mainwindow.cpp:456
 msgid "Info"
 msgstr "Informacje"
 
-#: gui/mainwindow.cpp:405
-msgid "Auto Hide"
-msgstr "Automatycznie ukryj"
-
-#: gui/mainwindow.cpp:411
-msgid "Monochrome Icons"
-msgstr "Ikony monochromatyczne"
-
-#: gui/mainwindow.cpp:541
+#: gui/mainwindow.cpp:585
 msgid "Server information..."
 msgstr "Informacja serwera..."
 
-#: gui/mainwindow.cpp:552
+#: gui/mainwindow.cpp:588
+msgid "Refresh Database"
+msgstr "Odśwież bazę danych"
+
+#: gui/mainwindow.cpp:602
 msgid "Configure Cantata..."
 msgstr "Konfiguruj Cantatę..."
 
-#: gui/mainwindow.cpp:559
+#: gui/mainwindow.cpp:612
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "O programie Cantata..."
 
-#: gui/mainwindow.cpp:571
+#: gui/mainwindow.cpp:624
 msgid "&File"
 msgstr "&Plik"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:628
+msgid "&Edit"
+msgstr "&Edytuj"
+
+#: gui/mainwindow.cpp:631
 msgid "&Settings"
 msgstr "&Ustawienia"
 
-#: gui/mainwindow.cpp:589 support/dialog.cpp:97
+#: gui/mainwindow.cpp:646 support/dialog.cpp:81
 msgid "&Help"
 msgstr "&Pomoc"
 
-#: gui/mainwindow.cpp:948
+#: gui/mainwindow.cpp:1035
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
 "Nie udało się znaleźć żadnych utworów pasujących do reguł dynamicznej "
 "playlisty."
 
-#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
+#: gui/mainwindow.cpp:1157 mpd/mpdconnection.cpp:401
 msgid "Connecting to %1"
 msgstr "Łączenie z %1"
 
-#: gui/mainwindow.cpp:1151
+#: gui/mainwindow.cpp:1189
+msgid "Refresh MPD Database?"
+msgstr "Odświeżyć bazę danych MPD?"
+
+#: gui/mainwindow.cpp:1257
 msgid ""
 "Podcasts are currently being downloaded\n"
 "\n"
@@ -2393,35 +2453,35 @@ msgstr ""
 "\n"
 "Zamknięcie programu spowodowałoby przerwanie wszystkich pobrań."
 
-#: gui/mainwindow.cpp:1152
+#: gui/mainwindow.cpp:1258
 msgid "Abort downloads and quit"
 msgstr "Anuluj pobieranie i zakończ"
 
-#: gui/mainwindow.cpp:1447
+#: gui/mainwindow.cpp:1577
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "O programie Cantata"
 
-#: gui/mainwindow.cpp:1448
+#: gui/mainwindow.cpp:1578
 msgctxt "Qt-only"
 msgid ""
-"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html"
-"\">GPLv3</a>"
-msgstr ""
-"<b>Cantata %1</b><br/><br/>Klient MPD.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Wydano na warunkach licencji <a href=\"http://www.gnu.org/licenses/gpl."
+"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl."
 "html\">GPLv3</a>"
+msgstr ""
+"<b>Cantata %1</b><br/><br/>Klient MPD.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Wydano na warunkach licencji <a href=\"http://www.gnu.org/"
+"licenses/gpl.html\">GPLv3</a>"
 
-#: gui/mainwindow.cpp:1450
+#: gui/mainwindow.cpp:1580
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
-"QtMPC Authors<br/>"
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"The QtMPC Authors<br/>"
 msgstr ""
-"Program bazujący na <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) "
+"Program bazujący na <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © "
 "2007-2010  Autorzy QtMPC "
 
-#: gui/mainwindow.cpp:1451
+#: gui/mainwindow.cpp:1581
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
@@ -2430,7 +2490,7 @@ msgstr ""
 "Tło widoku kontekstowego za uprzejmością <a href=\"http://www.fanart.tv"
 "\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1452
+#: gui/mainwindow.cpp:1582
 msgctxt "Qt-only"
 msgid ""
 "Context view metadata courtesy of <a href=\"http://www.wikipedia.org"
@@ -2439,7 +2499,7 @@ msgstr ""
 "Metadane widoku kontekstowego za uprzejmością <a href=\"http://www.wikipedia."
 "org\">Wikipedii</a> i <a href=\"http://www.last.fm\">Last.fm</a>"
 
-#: gui/mainwindow.cpp:1453
+#: gui/mainwindow.cpp:1583
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
@@ -2447,126 +2507,140 @@ msgstr ""
 "Proszę rozpatrzeć przesłanie własnych obrazów na <a href=\"http://www.fanart."
 "tv\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1594
 msgid ""
-"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Uptime:</td><td>%4</td></"
-"tr><tr><td align=\"right\">Time playing:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right"
+"\">Protocol version: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Uptime: </td><td>%4</td></tr><tr><td align=\"right"
+"\">Time playing: </td><td>%5</td></tr>"
 msgstr ""
-"<tr><td colspan=\"2\"><b>Serwer</b></td></tr><tr><td align=\"right\">Wersja:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Czas pracy:</td><td>%4</"
-"td></tr><tr><td align=\"right\">Czas odtwarzania:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Serwer</b></td></tr><tr><td align=\"right\">"
+"Wersja protokołu: </td><td>%1.%2.%3</td></tr><tr><td "
+"align=\"right\">Czas pracy: </td><td>%4</td></tr><tr><td "
+"align=\"right\">Czas odtwarzania: </td><td>%5</td></tr>"
 
-#: gui/mainwindow.cpp:1472
+#: gui/mainwindow.cpp:1602
 msgid ""
 "<tr><td colspan=\"2\"><b>Database</b></td></tr><tr><td align=\"right"
-"\">Artists:</td><td>%1</td></tr><tr><td align=\"right\">Albums:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Songs:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL handlers:</td><td>%4</td></tr><tr><td align=\"right\">Total "
-"duration:</td><td>%5</td></tr><tr><td align=\"right\">Last update:</td><td>"
-"%6</td></tr></table></p>"
+"\">Artists: </td><td>%1</td></tr><tr><td align=\"right\">Albums: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Songs: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Total duration: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Last update: </td><td>%6</td></tr></"
+"table></p>"
 msgstr ""
 "<tr><td colspan=\"2\"><b>Baza danych</b></td></tr><tr><td align=\"right"
-"\">Artyści:</td><td>%1</td></tr><tr><td align=\"right\">Albumy:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Utwory:</td><td>%3</td></tr><tr><td align="
-"\"right\">Obsługa URL:</td><td>%4</td></tr><tr><td align=\"right\">Całkowity "
-"czas trwania:</td><td>%5</td></tr><tr><td align=\"right\">Ostatnia "
-"aktualizacja:</td><td>%6</td></tr></table></p>"
-
-#: gui/mainwindow.cpp:1481
+"\">Artyści: </td><td>%1</td></tr><tr><td align=\"right\">Albumy: <"
+"/td><td>%2</"
+"td></tr><tr><td align=\"right\">Utwory: </td><td>%3</td></tr><tr><td "
+"align=\"right\">Obsługa URL: </td><td>%4</td></tr><tr><td "
+"align=\"right\">Całkowity czas trwania: </td><td>%5</td></tr><"
+"tr><td align=\"right\">Ostatnia aktualizacja: </td><td>%6</td></tr>"
+"</table></p>"
+
+#: gui/mainwindow.cpp:1611
 msgid "Server Information"
 msgstr "Informacje serwera"
 
-#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
+#: gui/mainwindow.cpp:1859 gui/mainwindow.cpp:1866
 msgid "Cantata (%1)"
 msgstr "Cantata (%1)"
 
-#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
+#: gui/mainwindow.cpp:1862 gui/mainwindow.cpp:1869
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: Cantata (%2)"
 
-#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
+#: gui/mainwindow.cpp:1863 gui/mainwindow.cpp:1870
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: Cantata"
 
-#: gui/mainwindow.cpp:1728
+#: gui/mainwindow.cpp:1874
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: Cantata (%3)"
 
-#: gui/mainwindow.cpp:1730
+#: gui/mainwindow.cpp:1876
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: Cantata"
 
-#: gui/mainwindow.cpp:1773
+#: gui/mainwindow.cpp:1919
 msgid "(Stream)"
 msgstr "(Strumień)"
 
-#: gui/mainwindow.cpp:1775
+#: gui/mainwindow.cpp:1921
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
+#: gui/mainwindow.cpp:1939 widgets/groupedview.cpp:278
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1843
+#: gui/mainwindow.cpp:1989 mpd/mpdconnection.cpp:543 mpd/mpdconnection.cpp:550
 msgid "MPD reported the following error: %1"
 msgstr "MPD zgłosił następujący błąd: %1"
 
-#: gui/mainwindow.cpp:1990
+#: gui/mainwindow.cpp:2119
 msgid "Remove all songs from play queue?"
 msgstr "Usunąć wszystkie utwory z kolejki odtwarzania?"
 
-#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
+#: gui/mainwindow.cpp:2210 models/playqueuemodel.cpp:113
 msgid "Priority"
 msgstr "Priorytet"
 
-#: gui/mainwindow.cpp:2080
+#: gui/mainwindow.cpp:2210
 msgid "Enter priority (0..255):"
 msgstr "Wpisz priorytet (0..255):"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Playlist Name"
 msgstr "Nazwa playlisty"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Enter a name for the playlist:"
 msgstr "Proszę wpisać nazwę dla playlisty:"
 
-#: gui/mainwindow.cpp:2106
+#: gui/mainwindow.cpp:2236
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr "Playlista o nazwie <b>%1</b> już istnieje!<br/>Dodać do tej playlisty?"
 
-#: gui/mainwindow.cpp:2107
+#: gui/mainwindow.cpp:2237
 msgid "Existing Playlist"
 msgstr "Istniejąca playlista"
 
-#: gui/playbacksettings.cpp:42
-msgid "Do not fadeout"
-msgstr "Nie wyciszaj"
+#: gui/mainwindow.cpp:2303
+msgid "Stream URL"
+msgstr "URL strumienia"
 
-#: gui/playbacksettings.cpp:43
-msgid " ms"
-msgstr " ms"
+#: gui/mainwindow.cpp:2303
+msgid "Enter URL of stream:"
+msgstr "Podaj adres URL strumienia:"
+
+#: gui/mainwindow.cpp:2306
+msgid "Invalid, or unsupported, URL!"
+msgstr "Niepoprawny lub niewspierany adres URL!"
+
+#: gui/mainwindow.cpp:2889
+msgid "Can only edit tags of songs within MPD's music collection."
+msgstr ""
+"Można edytować tagi jedynie utworów znajdujących się w kolekcji muzyki MPD."
 
-#. i18n: file: devices/albumdetails.ui:165
+#. i18n: file: devices/albumdetails.ui:158
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
-#: gui/playbacksettings.cpp:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
-#: rc.cpp:79
+#: gui/playbacksettings.cpp:47 models/playqueuemodel.cpp:108 po/rc.cpp:110
+#: rc.cpp:110
 msgid "Track"
 msgstr "Utwór"
 
-#: gui/playbacksettings.cpp:51
+#: gui/playbacksettings.cpp:49
 msgid "Auto"
 msgstr "Automatycznie"
 
-#: gui/playbacksettings.cpp:164
+#: gui/playbacksettings.cpp:161
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
@@ -2574,9 +2648,9 @@ msgstr ""
 "<i>Połączono z %1<br/>Poniższe ustawienia dotyczą aktualnie połączonej "
 "kolekcji MPD.</i>"
 
-#. i18n: file: gui/playbacksettings.ui:26
+#. i18n: file: gui/playbacksettings.ui:114
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
+#: gui/playbacksettings.cpp:164 po/rc.cpp:769 rc.cpp:769
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
@@ -2584,7 +2658,7 @@ msgstr ""
 "<i>Brak połączenia.<br/>Poniższe ustawienia nie mogą być modyfikowane, "
 "ponieważ Cantata nie jest połączona z MPD.</i>"
 
-#: gui/playbacksettings.cpp:174
+#: gui/playbacksettings.cpp:171
 msgid ""
 "<p>Replay Gain is a proposed standard published in 2001 to normalize the "
 "perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It "
@@ -2609,11 +2683,19 @@ msgstr ""
 "odtwarzania jest losowa. W przeciwnym wypadku użyty jest tag albumu.</li></"
 "ul></p>"
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:95 widgets/playqueueview.cpp:160
+msgid "Stretch Columns To Fit Window"
+msgstr "Rozciągnij kolumny aby dopasować do okna"
+
+#: gui/playlistspage.cpp:146 tags/tageditor.cpp:828 tags/trackorganiser.cpp:72
 msgid "Rename"
 msgstr "Zmień nazwę"
 
-#: gui/playlistspage.cpp:190
+#: gui/playlistspage.cpp:147 models/playqueuemodel.cpp:156
+msgid "Remove Duplicates"
+msgstr "Usuń duplikaty"
+
+#: gui/playlistspage.cpp:309
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2621,130 +2703,188 @@ msgstr ""
 "Czy jesteś pewien, że chcesz usunąć zaznaczone playlisty?\n"
 "Ta operacja nie może zostać cofnięta."
 
-#: gui/playlistspage.cpp:191
+#: gui/playlistspage.cpp:310
 msgid "Remove Playlists"
 msgstr "Usuń playlisty"
 
-#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
+#: gui/playlistspage.cpp:330 gui/playlistspage.cpp:357
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr "Playlista o nazwie <b>%1</b> już istnieje!<br/>Nadpisać?"
 
-#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
+#: gui/playlistspage.cpp:331 gui/playlistspage.cpp:358
 msgid "Overwrite Playlist"
 msgstr "Nadpisz playlisty"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Rename Playlist"
 msgstr "Zmiana nazwy playlisty"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Enter new name for playlist:"
 msgstr "Proszę wpisać nową nazwę dla playlisty:"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/playlistspage.cpp:446
+msgid "Cannot add songs from '%1' to '%2'"
+msgstr "Nie można dodać utworów z '%1' do '%2'"
+
+#: gui/preferencesdialog.cpp:83
 msgid "Collection Settings"
 msgstr "Ustawienia kolekcji"
 
-#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: file: gui/playbacksettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
+#: gui/preferencesdialog.cpp:84 po/rc.cpp:742 rc.cpp:742
 msgid "Playback"
 msgstr "Odtwarzanie"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:84
 msgid "Playback Settings"
 msgstr "Ustawienia odtwarzania"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "Files"
 msgstr "Pliki"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "File Settings"
 msgstr "Ustawienia pliku"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface"
 msgstr "Interfejs"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface Settings"
 msgstr "Ustawienia interfejsu"
 
-#: gui/preferencesdialog.cpp:85
+#: gui/preferencesdialog.cpp:89
 msgid "Streams Settings"
 msgstr "Ustawienia strumieni"
 
-#: gui/preferencesdialog.cpp:89
+#: gui/preferencesdialog.cpp:94
 msgid "Online Providers"
 msgstr "Dostawcy online"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context"
 msgstr "Kontekst"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context View Settings"
 msgstr "Ustawienia widoku kontekstowego"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server"
 msgstr "Serwer HTTP"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server Settings"
 msgstr "Ustawienia serwera HTTP"
 
-#: gui/preferencesdialog.cpp:103
+#: gui/preferencesdialog.cpp:115
 msgid "Audio CD Settings"
 msgstr "Ustawienia płyt audio"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgid "Proxy"
 msgstr "Proxy"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "Ustawienia Proxy"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "Skróty"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "Ustawienia skrótów klawiszowych"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cache"
 msgstr "Pamięć podręczna"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cached Items"
 msgstr "Elementy w pamięci podręcznej"
 
-#: gui/preferencesdialog.cpp:116
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#: gui/preferencesdialog.cpp:128 po/rc.cpp:53 po/rc.cpp:65 po/rc.cpp:410
+#: rc.cpp:53 rc.cpp:65 rc.cpp:410
 msgid "Configure"
 msgstr "Konfiguruj"
 
-#: gui/serversettings.cpp:87
-msgid ""
-"<i> This folder will also be used to locate music files for transferring to "
-"(and from) devices.</i>"
-msgstr ""
-"<i> Ten katalog będzie dodatkowo użyty do odnajdywania plików w celu "
-"transferu do i z urządzeń.</i>"
-
-#: gui/serversettings.cpp:100
-msgid "Not used"
-msgstr "Nie używany"
-
-#. i18n: file: devices/remotedevicepropertieswidget.ui:75
-#. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2)
-#. i18n: file: devices/remotedevicepropertieswidget.ui:292
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#: gui/searchpage.cpp:200 po/rc.cpp:89 po/rc.cpp:371 po/rc.cpp:950 rc.cpp:89
+#: rc.cpp:371 rc.cpp:950
+msgid "Composer:"
+msgstr "Kompozytor:"
+
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#: gui/searchpage.cpp:205 po/rc.cpp:95 po/rc.cpp:962 rc.cpp:95 rc.cpp:962
+msgid "Genre:"
+msgstr "Gatunek:"
+
+#: gui/searchpage.cpp:206
+msgid "Date:"
+msgstr "Data:"
+
+#: gui/searchpage.cpp:208
+msgid "Any:"
+msgstr "Dowolne:"
+
+#: gui/searchpage.cpp:215
+msgid "No tracks found."
+msgstr "Nie znaleziono utworów."
+
+#: gui/serversettings.cpp:87
+msgid ""
+"<i> This folder will also be used to locate music files for transferring to "
+"(and from) devices.</i>"
+msgstr ""
+"<i> Ten katalog będzie dodatkowo użyty do odnajdywania plików w celu "
+"transferu do i z urządzeń.</i>"
+
+#: gui/serversettings.cpp:100
+msgid "Not used"
+msgstr "Nie używany"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:75
+#. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:292
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
@@ -2754,8 +2894,8 @@ msgstr "Nie używany"
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
-#: gui/serversettings.cpp:103 po/rc.cpp:208 po/rc.cpp:247 po/rc.cpp:705
-#: rc.cpp:208 rc.cpp:247 rc.cpp:705
+#: gui/serversettings.cpp:103 po/rc.cpp:269 po/rc.cpp:308 po/rc.cpp:857
+#: rc.cpp:269 rc.cpp:308 rc.cpp:857
 msgid "Host:"
 msgstr "Host:"
 
@@ -2804,7 +2944,7 @@ msgstr ""
 "zostanie zastąpiony przez nazwę artysty albumu obecnego utworu, natomiast "
 "%album% zostanie zastąpiony przez nazwę albumu.</i></p>"
 
-#: gui/serversettings.cpp:252
+#: gui/serversettings.cpp:257
 msgid ""
 "Which type of collection do you wish to connect to?<br/><ul><li>Standard - "
 "music collection may be shared, is on another machine, or is already setup</"
@@ -2817,81 +2957,65 @@ msgstr ""
 "współdzielona z innymi i Cantata skonfiguruje i będzie kontrolować instancję "
 "MPD</li></ul>"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Add Collection"
 msgstr "Dodaj kolekcję"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Standard"
 msgstr "Standardowa"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Basic"
 msgstr "Podstawowa"
 
-#: gui/serversettings.cpp:297
+#: gui/serversettings.cpp:302
 msgid "Delete <b>%1</b>?"
 msgstr "Usunąć <b>%1</b>?"
 
-#: gui/serversettings.cpp:298
+#: gui/serversettings.cpp:303
 msgid "Delete"
 msgstr "Usuń"
 
-#: gui/serversettings.cpp:336
+#: gui/serversettings.cpp:341
 msgid "New Collection %1"
 msgstr "Nowa kolekcja %1"
 
-#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
+#: gui/serversettings.cpp:357 mpd/mpdconnection.cpp:173
 msgid "Default"
 msgstr "Domyślne"
 
-#: gui/shortcutssettingspage.cpp:74
+#: gui/shortcutssettingspage.cpp:76
 msgid "Multi-Media Keys"
 msgstr "Klawisze multimedialne"
 
-#: gui/shortcutssettingspage.cpp:80
+#: gui/shortcutssettingspage.cpp:82
 msgid "Do not use media keys to control Cantata"
 msgstr "Nie używaj klawiszy multimedialnych do kontrolowania Cantaty"
 
-#: gui/shortcutssettingspage.cpp:81
+#: gui/shortcutssettingspage.cpp:83 gui/shortcutssettingspage.cpp:97
 msgid "Use media keys to control Cantata"
 msgstr "Użyj klawiszy multimedialnych do kontrolowania Cantaty"
 
-#: gui/shortcutssettingspage.cpp:84
+#: gui/shortcutssettingspage.cpp:86 gui/shortcutssettingspage.cpp:104
 msgid "Use media keys, as configured in desktop settings, to control Cantata"
 msgstr ""
 "Użyj klawiszy multimedialnych do kontrolowania Cantaty, zgodnie z "
 "ustawieniami pulpitu"
 
-#: gui/shortcutssettingspage.cpp:85
+#: gui/shortcutssettingspage.cpp:87 gui/shortcutssettingspage.cpp:105
 msgid ""
 "Use media keys, as configured in GNOME/Unity settings, to control Cantata"
 msgstr ""
 "Użyj klawiszy multimedialnych do kontrolowania Cantaty, zgodnie z "
 "ustawieniami GNOME/Unity"
 
-#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
-#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+#: gui/shortcutssettingspage.cpp:90 gui/shortcutssettingspage.cpp:107
+#: online/onlineservicespage.cpp:99 streams/streamspage.cpp:99
+#: support/fancytabwidget.cpp:825
 msgid "Configure..."
 msgstr "Konfiguruj..."
 
-#: gui/shortcutssettingspage.cpp:95
-msgid "Use media keys to control Cantata:"
-msgstr "Użyj klawiszy multimedialnych do kontrolowania Cantaty:"
-
-#: gui/shortcutssettingspage.cpp:106
-msgid "Use media keys, as configured in desktop settings, to control Cantata:"
-msgstr ""
-"Użyj klawiszy multimedialnych do kontrolowania Cantaty, zgodnie z "
-"ustawieniami globalnymi:"
-
-#: gui/shortcutssettingspage.cpp:107
-msgid ""
-"Use media keys, as configured in GNOME/Unity settings, to control Cantata:"
-msgstr ""
-"Użyj klawiszy multimedialnych do kontrolowania Cantaty, zgodnie z "
-"ustawieniami GNOME/Unity:"
-
 #: gui/stdactions.cpp:55
 msgid "Previous Track"
 msgstr "Poprzedni utwór"
@@ -2964,7 +3088,7 @@ msgstr "Inny priorytet..."
 msgid "Add To Playlist"
 msgstr "Dodaj do playlisty"
 
-#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:66
 msgid "Organize Files"
 msgstr "Organizuj pliki"
 
@@ -2972,7 +3096,7 @@ msgstr "Organizuj pliki"
 msgid "Edit Tags"
 msgstr "Edytuj tagi"
 
-#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:106
 msgid "ReplayGain"
 msgstr "ReplayGain"
 
@@ -2985,88 +3109,89 @@ msgid "Set Image"
 msgstr "Ustaw obraz"
 
 #: gui/stdactions.cpp:88
-msgid "Refresh Database"
-msgstr "Odśwież bazę danych"
-
-#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "Wstecz"
 
-#: gui/trayitem.cpp:192
+#: gui/stdactions.cpp:91
+msgid "Find"
+msgstr "Szukaj"
+
+#: gui/trayitem.cpp:210
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%1 na %2"
 
-#: gui/trayitem.cpp:193
+#: gui/trayitem.cpp:211
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%1 na %2 (%3)"
 
-#: gui/trayitem.cpp:195
+#: gui/trayitem.cpp:213
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%1 w wykonaniu %2 z %3"
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:214
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr "%1 w wykonaniu %2 z %3 (%4)"
 
-#: gui/trayitem.cpp:223
+#: gui/trayitem.cpp:241
 msgid "Now playing"
 msgstr "Teraz odtwarzane"
 
-#: http/httpserversettings.cpp:40
+#: http/httpserversettings.cpp:39
 msgid "Local loopback (%1)"
 msgstr "Lokalny loopback (%1)"
 
-#: http/httpserversettings.cpp:43
+#: http/httpserversettings.cpp:42
 msgid "Wired (%1)"
 msgstr "Przewodowy (%1)"
 
-#: http/httpserversettings.cpp:46
+#: http/httpserversettings.cpp:45
 msgid "Wireless (%1)"
 msgstr "Bezprzewodowy (%1)"
 
-#: http/httpserversettings.cpp:53
+#: http/httpserversettings.cpp:52
 msgid "First active interface"
 msgstr "Pierwszy aktywny interfejs"
 
-#: http/httpserversettings.cpp:98
-msgid "Inactive"
-msgstr "Nieaktywny"
+#: models/albumsmodel.cpp:260 models/musicmodel.cpp:254
+msgctxt "Album by Artist"
+msgid "%1 by %2"
+msgstr "%1 w wykonaniu  %2"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:221
+#: models/musicmodel.cpp:133
 msgid "Cue Sheet"
 msgstr "Plik .cue"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:220
+#: models/musicmodel.cpp:133
 msgid "Playlist"
 msgstr "Playlista"
 
-#: models/devicesmodel.cpp:108
+#: models/devicesmodel.cpp:116
 msgid "Configure Device"
 msgstr "Konfiguruj urządzenie"
 
-#: models/devicesmodel.cpp:109
+#: models/devicesmodel.cpp:117
 msgid "Refresh Device"
 msgstr "Odśwież urządzenie"
 
-#: models/devicesmodel.cpp:110
+#: models/devicesmodel.cpp:118
 msgid "Connect Device"
 msgstr "Połącz z urządzeniem"
 
-#: models/devicesmodel.cpp:111
+#: models/devicesmodel.cpp:119
 msgid "Disconnect Device"
 msgstr "Rozłącz urządzenie"
 
-#: models/devicesmodel.cpp:113
+#: models/devicesmodel.cpp:121
 msgid "Edit CD Details"
 msgstr "Edytuj szczegóły CD"
 
-#: models/devicesmodel.cpp:690
+#: models/devicesmodel.cpp:730
 msgid "No Devices Attached"
 msgstr "Brak podłączonych urządzeń"
 
@@ -3098,46 +3223,46 @@ msgstr "Zalogowano (wygaśnięcie: %1)"
 msgid "Session expired"
 msgstr "Sesja wygasła"
 
-#: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
+#: models/dirviewmodel.cpp:204 models/dirviewmodel.cpp:212
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:696
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "1 Element"
 msgstr[1] "%1 Elementy"
 msgstr[2] "%1 Elementów"
 
-#: models/dirviewmodel.cpp:190
+#: models/dirviewmodel.cpp:219
 msgid "Audio File"
 msgstr "Plik audio"
 
-#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
-#: models/musiclibraryitemroot.cpp:844
+#: models/musiclibraryitemartist.cpp:248 models/musiclibraryitemartist.cpp:261
+#: models/musiclibraryitemroot.cpp:840
 msgid "Single Tracks"
 msgstr "Pojedyncze utwory"
 
-#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
-#: widgets/groupedview.cpp:366
+#: models/musicmodel.cpp:190 models/onlineservicesmodel.cpp:167
+#: widgets/groupedview.cpp:364
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "1 Utwór"
 msgstr[1] "%1 Utwory"
 msgstr[2] "%1 Utworów"
 
-#: models/musicmodel.cpp:185
+#: models/musicmodel.cpp:196
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "1 Artysta"
 msgstr[1] "%1 Artystów"
 msgstr[2] "%1 Artystów"
 
-#: models/musicmodel.cpp:192
+#: models/musicmodel.cpp:203
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "1 Album"
 msgstr[1] "%1 Albumy"
 msgstr[2] "%1 Albumów"
 
-#: models/musicmodel.cpp:198
+#: models/musicmodel.cpp:209
 msgid "1 Episode"
 msgid_plural "%1 Episodes"
 msgstr[0] "1 Odcinek"
@@ -3146,191 +3271,198 @@ msgstr[2] "%1 Odcinków"
 
 #. i18n: file: online/onlinesettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: models/onlineservicesmodel.cpp:83 po/rc.cpp:720 rc.cpp:720
+#: models/onlineservicesmodel.cpp:91 po/rc.cpp:872 rc.cpp:872
 msgid "Configure Service"
 msgstr "Konfiguruj serwis"
 
-#: models/onlineservicesmodel.cpp:84
+#: models/onlineservicesmodel.cpp:92
 msgid "Refresh Service"
 msgstr "Odśwież serwis"
 
-#: models/onlineservicesmodel.cpp:85
+#: models/onlineservicesmodel.cpp:93
 msgid "Add Subscription"
 msgstr "Dodaj subskrypcję"
 
-#: models/onlineservicesmodel.cpp:86
+#: models/onlineservicesmodel.cpp:94
 msgid "Remove Subscription"
 msgstr "Usuń subskrypcję"
 
-#: models/onlineservicesmodel.cpp:87
+#: models/onlineservicesmodel.cpp:95
 msgid "Refresh Subscription"
 msgstr "Odśwież subskrypcję"
 
-#: models/onlineservicesmodel.cpp:137
+#: models/onlineservicesmodel.cpp:145
 msgid "Last Search:%1"
 msgstr "Ostatnie wyszukiwanie:%1"
 
-#: models/onlineservicesmodel.cpp:149
-msgid "Searching..."
-msgstr "Szukanie..."
-
-#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
-#: models/streamsmodel.cpp:670
+#: models/onlineservicesmodel.cpp:160 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:691
 msgid "Not Loaded"
 msgstr "Nie załadowano"
 
-#: models/onlineservicesmodel.cpp:155
+#: models/onlineservicesmodel.cpp:163
 msgid "Use search to locate tracks"
 msgstr "Użyj wyszukiwania do odnalezienia utworów"
 
-#: models/onlineservicesmodel.cpp:166
+#: models/onlineservicesmodel.cpp:174
 msgid "1 Podcast"
 msgid_plural "%1 Podcasts"
 msgstr[0] "1 Podcast"
 msgstr[1] "%1 Podcasty"
 msgstr[2] "%1 Podcastów"
 
-#: models/onlineservicesmodel.cpp:177
+#: models/onlineservicesmodel.cpp:185
 msgid "(Downloading: %1%)"
 msgstr "(Pobieranie: %1%)"
 
-#: models/onlineservicesmodel.cpp:235
+#: models/onlineservicesmodel.cpp:243
 msgctxt "podcast name (num unplayed episodes)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: models/playlistsmodel.cpp:77
+#: models/playlistsmodel.cpp:105
 msgid "New Playlist..."
 msgstr "Nowa playlista..."
 
-#: models/playqueuemodel.cpp:102
-msgctxt "Track Number (#)"
-msgid "#"
-msgstr "#"
+#: models/playlistsmodel.cpp:321
+msgid "Smart Playlist"
+msgstr "Inteligentna lista odtwarzania"
 
-#: models/playqueuemodel.cpp:103
+#: models/playqueuemodel.cpp:109
 msgid "Length"
 msgstr "Długość"
 
-#: models/playqueuemodel.cpp:104
+#: models/playqueuemodel.cpp:110
 msgid "Disc"
 msgstr "Płyta"
 
-#. i18n: file: devices/filenameschemedialog.ui:138
+#. i18n: file: devices/filenameschemedialog.ui:174
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
+#: models/playqueuemodel.cpp:111 po/rc.cpp:248 rc.cpp:248
 msgid "Year"
 msgstr "Rok"
 
-#: models/playqueuemodel.cpp:360
+#: models/playqueuemodel.cpp:158
+msgid "Undo"
+msgstr "Cofnij"
+
+#: models/playqueuemodel.cpp:160
+msgid "Redo"
+msgstr "Ponów"
+
+#: models/playqueuemodel.cpp:404
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(Priorytet: %1)</b>"
 
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:693
 msgid "Loading..."
 msgstr "Ładowanie..."
 
-#: models/streamsmodel.cpp:286
+#: models/streamsmodel.cpp:302
 msgid "Bookmarks"
 msgstr "Zakładki"
 
-#: models/streamsmodel.cpp:560
+#: models/streamsmodel.cpp:576
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:563
+#: models/streamsmodel.cpp:579
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:564
+#: models/streamsmodel.cpp:580
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:567
+#: models/streamsmodel.cpp:583
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:568
+#: models/streamsmodel.cpp:584
+msgid "Radio GFM"
+msgstr "Radio GFM"
+
+#: models/streamsmodel.cpp:585
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: models/streamsmodel.cpp:569
+#: models/streamsmodel.cpp:586
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:570
+#: models/streamsmodel.cpp:587
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:571
+#: models/streamsmodel.cpp:588
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:572
+#: models/streamsmodel.cpp:589
 msgid "Favorites"
 msgstr "Favourites"
 
-#: models/streamsmodel.cpp:573
+#: models/streamsmodel.cpp:590
 msgid "Listen Live"
 msgstr "Słuchaj na żywo"
 
-#: models/streamsmodel.cpp:578
+#: models/streamsmodel.cpp:595
 msgid "Bookmark Category"
 msgstr "Kategoria zakładek"
 
-#: models/streamsmodel.cpp:579
+#: models/streamsmodel.cpp:596
 msgid "Add Stream To Favorites"
 msgstr "Dodaj strumień do ulubionych"
 
-#: models/streamsmodel.cpp:580
+#: models/streamsmodel.cpp:597
 msgid "Configure Streams"
 msgstr "Konfiguruj strumienie"
 
-#: models/streamsmodel.cpp:660
+#: models/streamsmodel.cpp:681
 msgid "%1 (Read-Only)"
 msgstr "%1 (Tylko do odczytu)"
 
-#: models/streamsmodel.cpp:1241
+#: models/streamsmodel.cpp:1261
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr ""
 "Zapis listy strumieni nie powiódł się. Proszę sprawdzić, czy %1 może być "
 "zapisywany."
 
-#: models/streamsmodel.cpp:1639
+#: models/streamsmodel.cpp:1659
 msgid "All"
 msgstr "Wszystkie"
 
-#: mpd/mpdconnection.cpp:154
+#: mpd/mpdconnection.cpp:179
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "\"%1\""
 
-#: mpd/mpdconnection.cpp:156
+#: mpd/mpdconnection.cpp:181
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr "\"%1\" (%2:%3)"
 
-#: mpd/mpdconnection.cpp:372 mpd/mpdconnection.cpp:415
-#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
-#: mpd/mpdconnection.cpp:1036
+#: mpd/mpdconnection.cpp:406 mpd/mpdconnection.cpp:451
+#: mpd/mpdconnection.cpp:501 mpd/mpdconnection.cpp:1137
+#: mpd/mpdconnection.cpp:1164
 msgid "Connection to %1 failed"
 msgstr "Łączenie się z %1 nie powiodło się"
 
-#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
+#: mpd/mpdconnection.cpp:412 mpd/mpdconnection.cpp:455
 msgid "Connection to %1 failed - incorrect password"
 msgstr "Połączenie z %1 nie powiodło się - nieprawidłowe hasło"
 
-#: mpd/mpdconnection.cpp:455
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to send command to %1 - not connected"
 msgstr "Nie powiodło się wysyłanie komendy do %1 - nie połączono"
 
-#: mpd/mpdconnection.cpp:491
+#: mpd/mpdconnection.cpp:539
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr ""
 "Załadowanie nie powiodło się. Proszę upewnić się, że użytkownik \"mpd\" ma "
 "prawa odczytu."
 
-#: mpd/mpdconnection.cpp:493
+#: mpd/mpdconnection.cpp:541
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
@@ -3338,23 +3470,23 @@ msgstr ""
 "Załadowanie nie powiodło się. MPD może odtwarzać lokalne pliki tylko gdy "
 "jest połączony poprzez lokalne gniazdo."
 
-#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
+#: mpd/mpdconnection.cpp:547 mpd/mpdconnection.cpp:558
 msgid "Failed to send command. Disconnected from %1"
 msgstr "Wysyłanie komendy nie powiodło się. Rozłączono z %1"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1306
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr "Zmiana nazwy z <b>%1</b> na <b>%2</b> nie powiodła się"
 
-#: mpd/mpdconnection.cpp:1183
+#: mpd/mpdconnection.cpp:1318
 msgid "Failed to save <b>%1</b>"
 msgstr "Zapisanie <b>%1</b> nie powiodło się"
 
-#: mpd/mpdconnection.cpp:1196
+#: mpd/mpdconnection.cpp:1331
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr "Nie można dodać części pliku cue do playlisty!"
 
-#: mpd/mpdconnection.cpp:1199
+#: mpd/mpdconnection.cpp:1334
 msgid "You cannot add a playlist to another playlist!"
 msgstr "Nie można dodać playlisty do innej playlisty!"
 
@@ -3362,7 +3494,15 @@ msgstr "Nie można dodać playlisty do innej playlisty!"
 msgid "Personal"
 msgstr "Osobiste"
 
-#: mpd/song.cpp:343
+#: mpd/song.cpp:62
+msgid "Unknown"
+msgstr "Nieznany"
+
+#: mpd/song.cpp:63
+msgid "Various Artists"
+msgstr "Various Artists"
+
+#: mpd/song.cpp:427
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3432,8 +3572,8 @@ msgstr "Ustawienia Magnatune"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
-#: rc.cpp:711 rc.cpp:729
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:863 po/rc.cpp:881
+#: rc.cpp:863 rc.cpp:881
 msgid "Username:"
 msgstr "Użytkownik:"
 
@@ -3461,9 +3601,9 @@ msgstr "Użytkownik:"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPasswordLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:220 po/rc.cpp:238
-#: po/rc.cpp:412 po/rc.cpp:647 po/rc.cpp:714 po/rc.cpp:732 rc.cpp:220
-#: rc.cpp:238 rc.cpp:412 rc.cpp:647 rc.cpp:714 rc.cpp:732
+#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:281 po/rc.cpp:299
+#: po/rc.cpp:476 po/rc.cpp:802 po/rc.cpp:866 po/rc.cpp:884 rc.cpp:281
+#: rc.cpp:299 rc.cpp:476 rc.cpp:802 rc.cpp:866 rc.cpp:884
 msgid "Password:"
 msgstr "Hasło:"
 
@@ -3503,155 +3643,179 @@ msgstr "Pobieranie nie powiodło się"
 msgid "Download To Library"
 msgstr "Pobierz do biblioteki"
 
-#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
-msgid "Search For Podcasts"
-msgstr "Szukaj podcastów"
-
-#: online/onlineservicespage.cpp:63
+#: online/onlineservicespage.cpp:62
 msgid "Download Podcast Episodes"
 msgstr "Pobierz odcinki podcastu"
 
-#: online/onlineservicespage.cpp:64
+#: online/onlineservicespage.cpp:63
 msgid "Delete Downloaded Podcast Episodes"
 msgstr "Usuń pobrane odcinki podcastu"
 
-#: online/onlineservicespage.cpp:329
+#: online/onlineservicespage.cpp:320
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "Szukaj %1:"
 
-#: online/onlineservicespage.cpp:464
+#: online/onlineservicespage.cpp:458
 msgid "Re-download music listing for %1?"
 msgstr "Czy pobrać ponownie listę muzyki dla %1?"
 
-#: online/onlineservicespage.cpp:532
-msgid "Subscribe to Podcast"
-msgstr "Subskrybuj podcast"
-
-#: online/onlineservicespage.cpp:532
-msgid "Enter podcast URL:"
-msgstr "Podaj adres URL podcastu:"
-
-#: online/onlineservicespage.cpp:541
-msgid "Invalid URL!"
-msgstr "Nieprawidłowy URL!"
-
-#: online/onlineservicespage.cpp:546
-msgid "You are already subscribed to this URL!"
-msgstr "Subskrypcja o podanym URL już istnieje!"
-
-#: online/onlineservicespage.cpp:550
-msgid "Already downloading this URL!"
-msgstr "Już trwa pobieranie tego URL!"
-
-#: online/onlineservicespage.cpp:579
+#: online/onlineservicespage.cpp:544
 msgid "Unsubscribe from <b>%1</b>?"
 msgstr "Usunąć subskrypcję <b>%1</b>?"
 
-#: online/onlineservicespage.cpp:600
+#: online/onlineservicespage.cpp:565
 msgid "Refresh all podcast listings?"
 msgstr "Odświeżyć listę podcastów?"
 
-#: online/onlineservicespage.cpp:621
+#: online/onlineservicespage.cpp:586
 msgid "Refresh episode listing from <b>%1</b>?"
 msgstr "Odświeżyć listę podcastów z <b>%1</b>?"
 
-#: online/onlineservicespage.cpp:695
+#: online/onlineservicespage.cpp:652
 msgid "All selected podcasts have already been downloaded!"
 msgstr "Wszystkie zaznaczone podcasty zostały już pobrane!"
 
-#: online/onlineservicespage.cpp:699
+#: online/onlineservicespage.cpp:656
 msgid "Do you wish to download the following podcast episode?"
 msgstr "Czy pobrać następujący odcinek podcastu?"
 
-#: online/onlineservicespage.cpp:702
+#: online/onlineservicespage.cpp:659
 msgid "Do you wish to download the following podcast episodes?"
 msgstr "Czy pobrać następujące odcinki podcastu?"
 
-#: online/onlineservicespage.cpp:705
+#: online/onlineservicespage.cpp:662
 msgid "Do you wish to download the selected podcast episodes?"
 msgstr "Czy pobrać zaznaczone odcinki podcastu?"
 
-#: online/onlineservicespage.cpp:753
+#: online/onlineservicespage.cpp:710
 msgid "All selected downloaded podcast episodes have already been deleted!"
 msgstr "Wszystkie zaznaczone odcinki zostały już usunięte?"
 
-#: online/onlineservicespage.cpp:757
+#: online/onlineservicespage.cpp:714
 msgid ""
 "Do you wish to delete the downloaded file of the following podcast episode?"
 msgstr "Czy usunąć pobrany plik następującego odcinka podcastu?"
 
-#: online/onlineservicespage.cpp:760
+#: online/onlineservicespage.cpp:717
 msgid ""
 "Do you wish to the delete downloaded files of the following podcast episodes?"
 msgstr "Czy usunąć pobrane pliki następujących odcinków podcastu?"
 
-#: online/onlineservicespage.cpp:763
+#: online/onlineservicespage.cpp:720
 msgid ""
 "Do you wish to the delete downloaded files of the selected podcast episodes?"
 msgstr "Czy usunąć pobrane pliki zaznaczonych odcinków podcastu?"
 
-#: online/podcastsearchdialog.cpp:243
+#: online/podcastsearchdialog.cpp:253
 msgid "RSS:"
 msgstr "RSS:"
 
-#: online/podcastsearchdialog.cpp:245
+#: online/podcastsearchdialog.cpp:255
 msgid "Website:"
 msgstr "Strona:"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Podcast details"
 msgstr "Szczegóły podcastu"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Select a podcast to display its details"
 msgstr "Zaznacz podcast aby wyświetlić jego szczegóły"
 
-#: online/podcastsearchdialog.cpp:322
+#: online/podcastsearchdialog.cpp:333
 msgid "Enter search term..."
 msgstr "Wprowadź termin do wyszukiwania..."
 
-#: online/podcastsearchdialog.cpp:372
+#: online/podcastsearchdialog.cpp:383
 msgid "Failed to fetch podcasts from %1"
 msgstr "Pobieranie podcastów z %1 nie powiodło się"
 
-#: online/podcastsearchdialog.cpp:378
+#: online/podcastsearchdialog.cpp:389
 msgid "There was a problem parsing the response from %1"
 msgstr "Wystąpił problem podczas parsowania odpowiedzi z %1"
 
-#: online/podcastsearchdialog.cpp:439
+#: online/podcastsearchdialog.cpp:450
 msgid "Failed to download directory listing"
 msgstr "Pobranie listingu katalogów nie powiodło się"
 
-#: online/podcastsearchdialog.cpp:447
+#: online/podcastsearchdialog.cpp:458
 msgid "Failed to parse directory listing"
 msgstr "Parsowanie listingu katalogów nie powiodło się"
 
 #: online/podcastsearchdialog.cpp:508
+msgid "URL"
+msgstr "URL"
+
+#: online/podcastsearchdialog.cpp:517
+msgid "Enter podcast URL..."
+msgstr "Podaj adres URL podcastu..."
+
+#: online/podcastsearchdialog.cpp:518
+msgid "Load"
+msgstr "Załaduj"
+
+#: online/podcastsearchdialog.cpp:525
+msgid "Enter podcast URL below, and press 'Load'"
+msgstr "Wprowadź poniżej URL podcastu i wciśnij przycisk \"Załaduj\""
+
+#: online/podcastsearchdialog.cpp:552
+msgid "Invalid URL!"
+msgstr "Nieprawidłowy URL!"
+
+#: online/podcastsearchdialog.cpp:562
+msgid "Failed to fetch podcast!"
+msgstr "Pobieranie podcastu nie powiodło się!"
+
+#: online/podcastsearchdialog.cpp:567
+msgid "Failed to parse podcast."
+msgstr "Parsowanie podcastu nie powiodło się."
+
+#: online/podcastsearchdialog.cpp:571
+msgid ""
+"Cantata only supports audio podcasts! The URL entered contains only video "
+"podcasts."
+msgstr ""
+"Cantata obsługuje jedynie podcasty audio! Podany URL zawiera wyłącznie "
+"podcasty wideo."
+
+#: online/podcastsearchdialog.cpp:589
 msgid "Subscribe"
 msgstr "Subskrybuj"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:607
+msgid "Enter URL"
+msgstr "Wprowadź URL"
+
+#: online/podcastsearchdialog.cpp:607
+msgid "Manual podcast URL"
+msgstr "Ręczny URL podcastu"
+
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search %1"
 msgstr "Szukaj %1"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search for podcasts on %1"
 msgstr "Szukaj podcastów na %1"
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1"
 msgstr "Przeglądaj %1"
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1 podcasts"
 msgstr "Przeglądaj %1 podcastów"
 
-#: online/podcastsearchdialog.cpp:602
+#: online/podcastsearchdialog.cpp:639
+msgid "Add Podcast Subscription"
+msgstr "Dodaj subskrypcję podcastu"
+
+#: online/podcastsearchdialog.cpp:695
 msgid "Subscription added"
 msgstr "Dodano subskrypcję"
 
-#: online/podcastsearchdialog.cpp:604
+#: online/podcastsearchdialog.cpp:697
 msgid "You are already subscribed to this podcast!"
 msgstr "Subskrypcja do danego podcastu już istnieje!"
 
@@ -3659,92 +3823,172 @@ msgstr "Subskrypcja do danego podcastu już istnieje!"
 msgid "Podcasts"
 msgstr "Podcasty"
 
-#: online/podcastservice.cpp:284
+#: online/podcastservice.cpp:288
 msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
 msgstr ""
-"Cantata obsługuje jedynie podcasty audio! %1 zawiera wyłącznie podcasty wideo."
+"Cantata obsługuje jedynie podcasty audio! %1 zawiera wyłącznie podcasty "
+"wideo."
 
-#: online/podcastservice.cpp:286
+#: online/podcastservice.cpp:290
 msgid "Failed to parse %1"
 msgstr "Parsowanie %1 nie powiodło się"
 
-#: online/podcastservice.cpp:290
+#: online/podcastservice.cpp:294
 msgid "Failed to download %1"
 msgstr "Pobieranie %1 nie powiodło się"
 
-#: online/podcastsettingsdialog.cpp:58
+#: online/podcastsettingsdialog.cpp:59
 msgid "Check for new episodes:"
 msgstr "Sprawdź w poszukiwaniu nowych odcinków:"
 
-#: online/podcastsettingsdialog.cpp:59
+#: online/podcastsettingsdialog.cpp:60
 msgid "Download episodes to:"
 msgstr "Pobierz odcinki do:"
 
-#: online/podcastsettingsdialog.cpp:60
-msgid "Automatically download new episodes:"
-msgstr "Automatycznie pobieraj odcinki:"
+#: online/podcastsettingsdialog.cpp:67
+msgid "Automatically download new episodes"
+msgstr "Automatycznie pobieraj odcinki"
 
-#: online/podcastsettingsdialog.cpp:82
+#: online/podcastsettingsdialog.cpp:80
 msgid "Podcast Settings"
 msgstr "Ustawienia podcastów"
 
-#: online/podcastsettingsdialog.cpp:84
+#: online/podcastsettingsdialog.cpp:82
 msgid "Manually"
 msgstr "Ręcznie"
 
-#: online/podcastsettingsdialog.cpp:85
+#: online/podcastsettingsdialog.cpp:83
 msgid "Every 15 minutes"
 msgstr "Co 15 minut"
 
-#: online/podcastsettingsdialog.cpp:86
+#: online/podcastsettingsdialog.cpp:84
 msgid "Every 30 minutes"
 msgstr "Co 30 minut"
 
-#: online/podcastsettingsdialog.cpp:87
+#: online/podcastsettingsdialog.cpp:85
 msgid "Every hour"
 msgstr "Co godzinę"
 
-#: online/podcastsettingsdialog.cpp:88
+#: online/podcastsettingsdialog.cpp:86
 msgid "Every 2 hours"
 msgstr "Co 2 godziny"
 
-#: online/podcastsettingsdialog.cpp:89
+#: online/podcastsettingsdialog.cpp:87
 msgid "Every 6 hours"
 msgstr "Co 6 godzin"
 
-#: online/podcastsettingsdialog.cpp:90
+#: online/podcastsettingsdialog.cpp:88
 msgid "Every 12 hours"
 msgstr "Co 12 godzin"
 
-#: online/podcastsettingsdialog.cpp:91
+#: online/podcastsettingsdialog.cpp:89
 msgid "Every day"
 msgstr "Codziennie"
 
-#: online/podcastsettingsdialog.cpp:92
+#: online/podcastsettingsdialog.cpp:90
 msgid "Every week"
 msgstr "Co tydzień"
 
-#. i18n: file: context/othersettings.ui:19
-#. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
-#: po/rc.cpp:3 rc.cpp:3
-msgid "Use backdrop:"
-msgstr "Używaj tła:"
-
-#. i18n: file: context/othersettings.ui:32
-#. i18n: ectx: property (text), widget (BuddyLabel, contextDarkBackgroundLabel)
-#: po/rc.cpp:6 rc.cpp:6
-msgid "Dark background:"
-msgstr "Ciemnie tło:"
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:3 po/rc.cpp:657 rc.cpp:3 rc.cpp:657
+msgid "Background Image"
+msgstr "Obraz tła"
 
-#. i18n: file: context/othersettings.ui:45
-#. i18n: ectx: property (text), widget (BuddyLabel, wikipediaIntroOnlyLabel)
+#. i18n: file: context/othersettings.ui:36
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_artist)
 #: po/rc.cpp:9 rc.cpp:9
-msgid "Only show basic wikipedia text:"
-msgstr "Pokazuj tylko podstawowy tekst z Wikipedii:"
-
-#. i18n: file: context/othersettings.ui:86
+msgid "Artist image"
+msgstr "Obraz artysty"
+
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#: po/rc.cpp:12 po/rc.cpp:666 rc.cpp:12 rc.cpp:666
+msgid "Custom image:"
+msgstr "Własny obraz"
+
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#: po/rc.cpp:15 po/rc.cpp:669 rc.cpp:15 rc.cpp:669
+msgid "Blur:"
+msgstr "Rozmycie:"
+
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#: po/rc.cpp:18 po/rc.cpp:672 rc.cpp:18 rc.cpp:672
+msgid "10px"
+msgstr "10px"
+
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: po/rc.cpp:21 po/rc.cpp:675 rc.cpp:21 rc.cpp:675
+msgid "Opacity:"
+msgstr "Przezroczystość:"
+
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#: po/rc.cpp:25 po/rc.cpp:679 rc.cpp:25 rc.cpp:679
+#, no-c-format
+msgid "40%"
+msgstr "40%"
+
+#. i18n: file: context/othersettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, contextDarkBackground)
+#: po/rc.cpp:28 rc.cpp:28
+msgid "Dark background"
+msgstr "Ciemnie tło"
+
+#. i18n: file: context/othersettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, wikipediaIntroOnly)
+#: po/rc.cpp:31 rc.cpp:31
+msgid "Only show basic wikipedia text"
+msgstr "Pokazuj tylko podstawowy tekst z Wikipedii"
+
+#. i18n: file: context/othersettings.ui:178
+#. i18n: ectx: property (text), widget (QCheckBox, contextAlwaysCollapsed)
+#: po/rc.cpp:34 rc.cpp:34
+msgid "Always collapse into a single pane"
+msgstr "Zawsze zwiń do pojedynczego panelu"
+
+#. i18n: file: context/othersettings.ui:207
 #. i18n: ectx: property (text), widget (StateLabel, wikipediaIntroOnlyNote)
-#: po/rc.cpp:13 rc.cpp:13
+#: po/rc.cpp:38 rc.cpp:38
 #, no-c-format
 msgid ""
 "<i><b>NOTE:</b> Cantata does not show the full wikipedia pages (with images, "
@@ -3764,188 +4008,174 @@ msgstr ""
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:16 rc.cpp:16
+#: po/rc.cpp:41 rc.cpp:41
 msgid "Available:"
 msgstr "Dostępny:"
 
 #. i18n: file: context/togglelist.ui:24
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:19 rc.cpp:19
+#: po/rc.cpp:44 rc.cpp:44
 msgid "Selected:"
 msgstr "Wybrany:"
 
-#. i18n: file: devices/actiondialog.ui:30
+#. i18n: file: devices/actiondialog.ui:33
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:22 rc.cpp:22
+#: po/rc.cpp:47 rc.cpp:47
 msgid "Copy songs from:"
 msgstr "Kopiuj utwory z:"
 
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#: po/rc.cpp:25 po/rc.cpp:31 po/rc.cpp:49 po/rc.cpp:744 rc.cpp:25 rc.cpp:31
-#: rc.cpp:49 rc.cpp:744
+#: po/rc.cpp:50 po/rc.cpp:62 po/rc.cpp:896 rc.cpp:50 rc.cpp:62 rc.cpp:896
 msgid "TextLabel"
 msgstr "TextLabel"
 
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#: po/rc.cpp:28 po/rc.cpp:34 rc.cpp:28 rc.cpp:34
+#: po/rc.cpp:56 po/rc.cpp:68 rc.cpp:56 rc.cpp:68
 msgid "(Needs configuring)"
 msgstr "(Wymaga konfiguracji)"
 
-#. i18n: file: devices/actiondialog.ui:123
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:37 rc.cpp:37
-msgid "Overwrite songs:"
-msgstr "Nadpisz utwory:"
-
-#. i18n: file: devices/actiondialog.ui:150
+#. i18n: file: devices/actiondialog.ui:86
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:40 rc.cpp:40
+#: po/rc.cpp:59 rc.cpp:59
 msgid "Copy songs to:"
 msgstr "Kopiuj utwory do:"
 
-#. i18n: file: devices/actiondialog.ui:157
+#. i18n: file: devices/actiondialog.ui:149
 #. i18n: ectx: property (text), widget (QLabel, codecLabel)
-#: po/rc.cpp:43 rc.cpp:43
+#: po/rc.cpp:71 rc.cpp:71
 msgid "Destination format:"
 msgstr "Format docelowy:"
 
-#. i18n: file: devices/actiondialog.ui:171
+#. i18n: file: devices/actiondialog.ui:163
+#. i18n: ectx: property (text), widget (QCheckBox, overwrite)
+#: po/rc.cpp:74 rc.cpp:74
+msgid "Overwrite songs"
+msgstr "Nadpisz utwory"
+
+#. i18n: file: devices/actiondialog.ui:170
 #. i18n: ectx: property (text), widget (QLabel, songCountLabel)
-#: po/rc.cpp:46 rc.cpp:46
+#: po/rc.cpp:77 rc.cpp:77
 msgid "To copy:"
 msgstr "Do skopiowania:"
 
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#: po/rc.cpp:80 po/rc.cpp:968 po/rc.cpp:995 rc.cpp:80 rc.cpp:968 rc.cpp:995
+msgid ""
+"<i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i>"
+msgstr ""
+"<i><b>UWAGA:</b> Połączono z serwerem Mopidy (wymagane ręczne odświeżenie).<"
+"/i>"
+
 #. i18n: file: devices/albumdetails.ui:26
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:52 rc.cpp:52
+#: po/rc.cpp:83 rc.cpp:83
 msgid "Album Details"
 msgstr "Szczegóły albumu"
 
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#: po/rc.cpp:58 po/rc.cpp:298 po/rc.cpp:798 rc.cpp:58 rc.cpp:298 rc.cpp:798
-msgid "Composer:"
-msgstr "Kompozytor:"
-
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
-msgid "Genre:"
-msgstr "Gatunek:"
-
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#: po/rc.cpp:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
+#: po/rc.cpp:98 po/rc.cpp:965 rc.cpp:98 rc.cpp:965
 msgid "Year:"
 msgstr "Rok:"
 
-#. i18n: file: devices/albumdetails.ui:99
+#. i18n: file: devices/albumdetails.ui:102
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:70 rc.cpp:70
+#: po/rc.cpp:101 rc.cpp:101
 msgid "Disc:"
 msgstr "Płyta:"
 
-#. i18n: file: devices/albumdetails.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:73 rc.cpp:73
-msgid "Single artist:"
-msgstr "Pojedynczy artysta:"
+#. i18n: file: devices/albumdetails.ui:115
+#. i18n: ectx: property (text), widget (QCheckBox, singleArtist)
+#: po/rc.cpp:104 rc.cpp:104
+msgid "Single artist"
+msgstr "Pojedynczy artysta"
 
-#. i18n: file: devices/audiocdsettings.ui:20
+#. i18n: file: devices/audiocdsettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:119 rc.cpp:119
 msgid "Album and Track Information Retrieval"
 msgstr "Pobieranie informacji albumu i utworów"
 
-#. i18n: file: devices/audiocdsettings.ui:26
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:91 rc.cpp:91
-msgid "Automatically lookup:"
-msgstr "Automatycznie wyszukaj w:"
-
-#. i18n: file: devices/audiocdsettings.ui:39
+#. i18n: file: devices/audiocdsettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:122 rc.cpp:122
 msgid "Initially look up via:"
 msgstr "Najpierw wyszukaj poprzez:"
 
-#. i18n: file: devices/audiocdsettings.ui:52
+#. i18n: file: devices/audiocdsettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:125 rc.cpp:125
 msgid "CDDB Host:"
 msgstr "Host CDDB:"
 
-#. i18n: file: devices/audiocdsettings.ui:65
+#. i18n: file: devices/audiocdsettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:128 rc.cpp:128
 msgid "CDDB Port:"
 msgstr "Port CDDB:"
 
-#. i18n: file: devices/audiocdsettings.ui:88
+#. i18n: file: devices/audiocdsettings.ui:84
+#. i18n: ectx: property (text), widget (QCheckBox, cdAuto)
+#: po/rc.cpp:131 rc.cpp:131
+msgid "Lookup information as soon as CD is inserted"
+msgstr "Sprawdź informacje jak tylko płyta CD zostanie włożona"
+
+#. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:134 rc.cpp:134
 msgid "Audio Extraction"
 msgstr "Zgrywanie audio"
 
-#. i18n: file: devices/audiocdsettings.ui:94
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:106 rc.cpp:106
-msgid "Full paranoia mode (best quality):"
-msgstr "Tryb full paranoia mode (najlepsza jakość):"
+#. i18n: file: devices/audiocdsettings.ui:100
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaFull)
+#: po/rc.cpp:137 rc.cpp:137
+msgid "Full paranoia mode (best quality)"
+msgstr "Tryb full paranoia mode (najlepsza jakość)"
 
 #. i18n: file: devices/audiocdsettings.ui:107
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:109 rc.cpp:109
-msgid "Never skip on read error:"
-msgstr "Nigdy nie pomijaj przy błędach odczytu:"
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaNeverSkip)
+#: po/rc.cpp:140 rc.cpp:140
+msgid "Never skip on read error"
+msgstr "Nigdy nie pomijaj przy błędach odczytu"
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:112 rc.cpp:112
+#: po/rc.cpp:143 rc.cpp:143
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3973,188 +4203,261 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
 #. i18n: file: gui/serversettings.ui:325
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
-#: po/rc.cpp:115 po/rc.cpp:415 po/rc.cpp:433 po/rc.cpp:650 po/rc.cpp:671
-#: rc.cpp:115 rc.cpp:415 rc.cpp:433 rc.cpp:650 rc.cpp:671
+#: po/rc.cpp:146 po/rc.cpp:479 po/rc.cpp:497 po/rc.cpp:805 po/rc.cpp:826
+#: rc.cpp:146 rc.cpp:479 rc.cpp:497 rc.cpp:805 rc.cpp:826
 msgid "Music folder:"
 msgstr "Katalog z muzyką:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:149 rc.cpp:149
 msgid "Copy album covers as:"
 msgstr "Kopiuj okładki albumów jako:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: po/rc.cpp:152 rc.cpp:152
 msgid "Maximum cover size:"
 msgstr "Maksymalny rozmiar okładek:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:82
-#. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:124 rc.cpp:124
-msgid "'Various Artists' workaround:"
-msgstr "Obejście dla 'Various Artists':"
-
-#. i18n: file: devices/devicepropertieswidget.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, autoScanLabel)
-#: po/rc.cpp:127 rc.cpp:127
-msgid "Automatically scan music when attached:"
-msgstr "Automatycznie skanuj muzykę po podłączeniu:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:108
-#. i18n: ectx: property (text), widget (BuddyLabel, useCacheLabel)
-#: po/rc.cpp:130 rc.cpp:130
-msgid "Use cache:"
-msgstr "Używaj pamięci podręcznej:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:121
+#. i18n: file: devices/devicepropertieswidget.ui:85
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:133 rc.cpp:133
+#: po/rc.cpp:155 rc.cpp:155
 msgid "Default volume:"
 msgstr "Domyślny wolumin:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, fixVariousArtists)
+#: po/rc.cpp:158 rc.cpp:158
+msgid "'Various Artists' workaround"
+msgstr "Obejście dla 'Various Artists'"
+
+#. i18n: file: devices/devicepropertieswidget.ui:99
+#. i18n: ectx: property (text), widget (QCheckBox, autoScan)
+#: po/rc.cpp:161 rc.cpp:161
+msgid "Automatically scan music when attached"
+msgstr "Automatycznie skanuj muzykę po podłączeniu"
+
+#. i18n: file: devices/devicepropertieswidget.ui:106
+#. i18n: ectx: property (text), widget (QCheckBox, useCache)
+#: po/rc.cpp:164 rc.cpp:164
+msgid "Use cache"
+msgstr "Używaj pamięci podręcznej"
+
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#: po/rc.cpp:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
+#: po/rc.cpp:167 po/rc.cpp:971 rc.cpp:167 rc.cpp:971
 msgid "Filenames"
 msgstr "Nazwy plików"
 
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
-msgid "Use only ASCII characters:"
-msgstr "Używaj jedynie znaków ASCII:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
-msgid "Replace spaces with underscores:"
-msgstr "Zastąp spacje znakami podkreślenia:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
-msgid "Ignore 'The' in artist names:"
-msgstr "Ignoruj 'The' w nazwach artystów:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
+#: po/rc.cpp:170 po/rc.cpp:974 rc.cpp:170 rc.cpp:974
 msgid "Filename scheme:"
 msgstr "Schemat nazwy pliku:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
-msgid "VFAT safe:"
-msgstr "Bezpieczne dla VFAT:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:250
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#: po/rc.cpp:173 po/rc.cpp:977 rc.cpp:173 rc.cpp:977
+msgid "VFAT safe"
+msgstr "Bezpieczne dla VFAT"
+
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#: po/rc.cpp:176 po/rc.cpp:980 rc.cpp:176 rc.cpp:980
+msgid "Use only ASCII characters"
+msgstr "Używaj jedynie znaków ASCII"
+
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#: po/rc.cpp:179 po/rc.cpp:983 rc.cpp:179 rc.cpp:983
+msgid "Replace spaces with underscores"
+msgstr "Zastąp spacje znakami podkreślenia"
+
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#: po/rc.cpp:182 po/rc.cpp:986 rc.cpp:182 rc.cpp:986
+msgid "Ignore 'The' in artist names"
+msgstr "Ignoruj 'The' w nazwach artystów"
+
+#. i18n: file: devices/devicepropertieswidget.ui:192
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:185 rc.cpp:185
 msgid "Transcoding"
 msgstr "Konwertowanie"
 
-#. i18n: file: devices/devicepropertieswidget.ui:261
-#. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:157 rc.cpp:157
-msgid "Only transcode if source file is of a different format:"
-msgstr "Konwertuj tylko gdy plik wejściowy jest w innym formacie:"
+#. i18n: file: devices/devicepropertieswidget.ui:201
+#. i18n: ectx: property (text), widget (QCheckBox, transcoderWhenDifferent)
+#: po/rc.cpp:188 rc.cpp:188
+msgid "Only transcode if source file is of a different format"
+msgstr "Konwertuj tylko gdy plik wejściowy jest w innym formacie"
 
-#. i18n: file: devices/filenameschemedialog.ui:29
+#. i18n: file: devices/filenameschemedialog.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:191 rc.cpp:191
 msgid "Example:"
 msgstr "Przykład:"
 
-#. i18n: file: devices/filenameschemedialog.ui:58
+#. i18n: file: devices/filenameschemedialog.ui:67
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:194 rc.cpp:194
 msgid "About filename schemes"
 msgstr "O schematach nazwy pliku"
 
-#. i18n: file: devices/filenameschemedialog.ui:70
+#. i18n: file: devices/filenameschemedialog.ui:79
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumArtist)
+#: po/rc.cpp:197 rc.cpp:197
+msgid ""
+"The artist of the album. For most albums, this will be the same as the "
+"<i>Track Artist.</i> For compilations, this will often be <i>Various Artists."
+"</i>"
+msgstr ""
+"Artysta albumu. Dla większości albumów będzie to taka sama wartość jak <i>"
+"artysta utworu.</i> Dla kompilacji często przyjmie wartość <i>Various "
+"Artists.</i>"
+
+#. i18n: file: devices/filenameschemedialog.ui:82
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:200 rc.cpp:200
 msgid "Album Artist"
 msgstr "Artysta albumu"
 
-#. i18n: file: devices/filenameschemedialog.ui:77
+#. i18n: file: devices/filenameschemedialog.ui:89
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumTitle)
+#: po/rc.cpp:203 rc.cpp:203
+msgid "The name of the album."
+msgstr "Nazwa albumu."
+
+#. i18n: file: devices/filenameschemedialog.ui:92
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:206 rc.cpp:206
 msgid "Album Title"
 msgstr "Tytuł albumu"
 
-#. i18n: file: devices/filenameschemedialog.ui:91
+#. i18n: file: devices/filenameschemedialog.ui:99
+#. i18n: ectx: property (toolTip), widget (QPushButton, composer)
+#: po/rc.cpp:209 rc.cpp:209
+msgid "The composer."
+msgstr "Kompozytor."
+
+#. i18n: file: devices/filenameschemedialog.ui:109
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtist)
+#: po/rc.cpp:215 rc.cpp:215
+msgid "The artist of each track."
+msgstr "Artysta każdego utworu."
+
+#. i18n: file: devices/filenameschemedialog.ui:112
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:218 rc.cpp:218
 msgid "Track Artist"
 msgstr "Artysta utworu"
 
-#. i18n: file: devices/filenameschemedialog.ui:98
+#. i18n: file: devices/filenameschemedialog.ui:119
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackTitle)
+#: po/rc.cpp:221 rc.cpp:221
+msgid "The track title (without <i>Track Artist</i>)."
+msgstr "Tytuł utworu (bez <i>artysty utworu</i>)."
+
+#. i18n: file: devices/filenameschemedialog.ui:122
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:224 rc.cpp:224
 msgid "Track Title"
 msgstr "Tytuł utworu"
 
-#. i18n: file: devices/filenameschemedialog.ui:117
+#. i18n: file: devices/filenameschemedialog.ui:141
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtistAndTitle)
+#: po/rc.cpp:227 rc.cpp:227
+msgid ""
+"The track title (with <i>Track Artist</i>, if different to <i>Album Artist</"
+"i>)."
+msgstr ""
+"Tytuł utworu (z <i>artystą utworu</i>, jeśli różny od <i>artysty albumu</i>)."
+
+#. i18n: file: devices/filenameschemedialog.ui:144
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:230 rc.cpp:230
 msgid "Track Title (+Artist)"
 msgstr "Tytuł utworu (+Artysta)"
 
-#. i18n: file: devices/filenameschemedialog.ui:124
+#. i18n: file: devices/filenameschemedialog.ui:151
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackNo)
+#: po/rc.cpp:233 rc.cpp:233
+msgid "The track number."
+msgstr "Numer utworu."
+
+#. i18n: file: devices/filenameschemedialog.ui:154
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:184 rc.cpp:184
+#: po/rc.cpp:236 rc.cpp:236
 msgid "Track #"
 msgstr "Numer utworu"
 
-#. i18n: file: devices/filenameschemedialog.ui:131
+#. i18n: file: devices/filenameschemedialog.ui:161
+#. i18n: ectx: property (toolTip), widget (QPushButton, cdNo)
+#: po/rc.cpp:239 rc.cpp:239
+msgid ""
+"The album number of a multi-album album. Often compilations consist of "
+"several albums."
+msgstr ""
+"Numer płyty w wydaniach kilkupłytowych. Kompilacje często składają się z "
+"wielu płyt."
+
+#. i18n: file: devices/filenameschemedialog.ui:164
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:187 rc.cpp:187
+#: po/rc.cpp:242 rc.cpp:242
 msgid "CD #"
 msgstr "Numer CD"
 
+#. i18n: file: devices/filenameschemedialog.ui:171
+#. i18n: ectx: property (toolTip), widget (QPushButton, year)
+#: po/rc.cpp:245 rc.cpp:245
+msgid "The year of the album's release."
+msgstr "Rok wydania albumu."
+
+#. i18n: file: devices/filenameschemedialog.ui:181
+#. i18n: ectx: property (toolTip), widget (QPushButton, genre)
+#: po/rc.cpp:251 rc.cpp:251
+msgid "The genre of the album."
+msgstr "Gatunek albumu."
+
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:196 rc.cpp:196
+#: po/rc.cpp:257 rc.cpp:257
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -4164,17 +4467,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
-#: po/rc.cpp:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
+#: po/rc.cpp:260 po/rc.cpp:353 po/rc.cpp:848 rc.cpp:260 rc.cpp:353 rc.cpp:848
 msgid "Type:"
 msgstr "Typ:"
 
@@ -4186,14 +4489,16 @@ msgstr "Typ:"
 #. i18n: ectx: property (text), widget (BuddyLabel, nameLabel)
 #. i18n: file: gui/serversettings.ui:63
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
-#: rc.cpp:638
+#: po/rc.cpp:263 po/rc.cpp:793 streams/streamdialog.cpp:71 rc.cpp:263
+#: rc.cpp:793
 msgid "Name:"
 msgstr "Nazwa:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:205 rc.cpp:205
+#. i18n: file: gui/interfacesettings.ui:122
+#. i18n: ectx: property (title), widget (QGroupBox, optionsGroup)
+#: po/rc.cpp:266 rc.cpp:266 po/rc.cpp:551 rc.cpp:551
 msgid "Options"
 msgstr "Opcje"
 
@@ -4217,8 +4522,8 @@ msgstr "Opcje"
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: network/proxysettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPortLabel)
-#: po/rc.cpp:211 po/rc.cpp:250 po/rc.cpp:409 po/rc.cpp:644 po/rc.cpp:708
-#: rc.cpp:211 rc.cpp:250 rc.cpp:409 rc.cpp:644 rc.cpp:708
+#: po/rc.cpp:272 po/rc.cpp:311 po/rc.cpp:473 po/rc.cpp:799 po/rc.cpp:860
+#: rc.cpp:272 rc.cpp:311 rc.cpp:473 rc.cpp:799 rc.cpp:860
 msgid "Port:"
 msgstr "Port:"
 
@@ -4234,7 +4539,7 @@ msgstr "Port:"
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2x)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:322
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel)
-#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
+#: po/rc.cpp:275 po/rc.cpp:293 po/rc.cpp:314 rc.cpp:275 rc.cpp:293 rc.cpp:314
 msgid "User:"
 msgstr "Użytkownik:"
 
@@ -4246,7 +4551,7 @@ msgstr "Użytkownik:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:218
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2x)
-#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:278 po/rc.cpp:296 rc.cpp:278 rc.cpp:296
 msgid "Domain:"
 msgstr "Domena:"
 
@@ -4258,7 +4563,7 @@ msgstr "Domena:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:248
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2)
-#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
+#: po/rc.cpp:284 po/rc.cpp:302 rc.cpp:284 rc.cpp:302
 msgid "Share:"
 msgstr "Udział:"
 
@@ -4270,7 +4575,7 @@ msgstr "Udział:"
 #. i18n: ectx: property (text), widget (QLabel, label_4)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:263
 #. i18n: ectx: property (text), widget (QLabel, label_4x)
-#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
+#: po/rc.cpp:287 po/rc.cpp:305 rc.cpp:287 rc.cpp:305
 msgid ""
 "<i><b>NOTE:</b> If you enter a password here, it will be stored "
 "<b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the "
@@ -4283,7 +4588,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:229 rc.cpp:229
+#: po/rc.cpp:290 rc.cpp:290
 msgid "Service name:"
 msgstr "Nazwa serwisu:"
 
@@ -4295,19 +4600,19 @@ msgstr "Nazwa serwisu:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:390
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
+#: po/rc.cpp:317 po/rc.cpp:326 rc.cpp:317 rc.cpp:326
 msgid "Folder:"
 msgstr "Katalog:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:259 rc.cpp:259
+#: po/rc.cpp:320 rc.cpp:320
 msgid "Extra Options:"
 msgstr "Opcje dodatkowe:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:323 rc.cpp:323
 msgid ""
 "<i><b>NOTE:</b> Due to the way sshfs works, a suitable ssh-askpass "
 "application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter "
@@ -4319,7 +4624,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:329 rc.cpp:329
 msgid ""
 "<i><b>NOTE:</b> This dialog is only used to add remote devices (e.g. via "
 "Samba), or to access locally mounted folders. For normal media players, "
@@ -4333,112 +4638,100 @@ msgstr ""
 
 #. i18n: file: dynamic/dynamicpage.ui:26
 #. i18n: ectx: property (text), widget (StatusLabel, infoLabel)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:332 rc.cpp:332
 msgid "No dynamizer port defined in server settings."
 msgstr "Nie ustawiono portu dynamizera w ustawieniach serwera."
 
 #. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:274 rc.cpp:274
+#: po/rc.cpp:335 rc.cpp:335
 msgid "Remote dynamizer is not running."
 msgstr "Zdalny dynamizer nie działa."
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:277 rc.cpp:277
+#: po/rc.cpp:338 rc.cpp:338
 msgid "Name of Dynamic Rules"
 msgstr "Nazwa dynamicznych reguł"
 
 #. i18n: file: dynamic/dynamicrules.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, editBtn)
-#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
+#: po/rc.cpp:344 streams/streamspage.cpp:62 rc.cpp:344
 msgid "Edit"
 msgstr "Edytuj"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:350 rc.cpp:350
 msgid "About Rules"
 msgstr "O regułach"
 
-#. i18n: file: dynamic/dynamicrule.ui:38
+#. i18n: file: dynamic/dynamicrule.ui:37
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:356 rc.cpp:356
+msgid "Include songs that match the following:"
+msgstr "Zawieraj utwory posiadające w tagach:"
+
+#. i18n: file: dynamic/dynamicrule.ui:42
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:359 rc.cpp:359
+msgid "Exclude songs that match the following:"
+msgstr "Nie zawieraj utworów posiadających w tagach:"
+
+#. i18n: file: dynamic/dynamicrule.ui:63
+#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
+#: po/rc.cpp:365 rc.cpp:365
+msgid "Artists similar to:"
+msgstr "Artyści podobni do:"
+
+#. i18n: file: dynamic/dynamicrule.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:295 rc.cpp:295
+#: po/rc.cpp:368 rc.cpp:368
 msgid "Album Artist:"
 msgstr "Artysta albumu:"
 
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
-msgid "Album:"
-msgstr "Album:"
-
-#. i18n: file: dynamic/dynamicrule.ui:103
+#. i18n: file: dynamic/dynamicrule.ui:141
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:310 rc.cpp:310
+#: po/rc.cpp:383 rc.cpp:383
 msgid "From Year:"
 msgstr "Od roku:"
 
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#: po/rc.cpp:386 po/rc.cpp:392 rc.cpp:386 rc.cpp:392
 msgid "Any"
 msgstr "Dowolny"
 
-#. i18n: file: dynamic/dynamicrule.ui:126
+#. i18n: file: dynamic/dynamicrule.ui:164
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:316 rc.cpp:316
+#: po/rc.cpp:389 rc.cpp:389
 msgid "To Year:"
 msgstr "Do roku:"
 
-#. i18n: file: dynamic/dynamicrule.ui:149
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:322 rc.cpp:322
-msgid "Exact match:"
-msgstr "Dokładne dopasowanie:"
-
-#. i18n: file: dynamic/dynamicrule.ui:173
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:328 rc.cpp:328
-msgid "Include songs that match the following:"
-msgstr "Zawieraj utwory posiadające w tagach:"
-
-#. i18n: file: dynamic/dynamicrule.ui:178
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:331 rc.cpp:331
-msgid "Exclude songs that match the following:"
-msgstr "Nie zawieraj utworów posiadających w tagach:"
+#. i18n: file: dynamic/dynamicrule.ui:187
+#. i18n: ectx: property (text), widget (QCheckBox, exactCheck)
+#: po/rc.cpp:395 rc.cpp:395
+msgid "Exact match"
+msgstr "Dokładne dopasowanie"
 
-#. i18n: file: dynamic/dynamicrule.ui:186
-#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:334 rc.cpp:334
-msgid "Artists similar to:"
-msgstr "Artyści podobni do:"
-
-#. i18n: file: dynamic/dynamicrule.ui:236
+#. i18n: file: dynamic/dynamicrule.ui:231
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:337 rc.cpp:337
+#: po/rc.cpp:398 rc.cpp:398
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
 "<i><b>UWAGA</b> Należy wpisać tylko wartości dla tych tagów, które mają "
 "zostać przeszukane. </i>"
 
-#. i18n: file: dynamic/dynamicrule.ui:262
+#. i18n: file: dynamic/dynamicrule.ui:260
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:340 rc.cpp:340
+#: po/rc.cpp:401 rc.cpp:401
 msgid ""
 "<i><b>NOTE</b> For genre, end string with an asterisk to match various "
 "genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. </i>"
@@ -4446,69 +4739,63 @@ msgstr ""
 "<i><b>UWAGA</b> Dla gatunków, należy użyć gwiazdki * aby wybierać wiele "
 "gatunków np. 'rock*' wyszuka 'Hard Rock' oraz 'Rock and Roll'. </i>"
 
-#. i18n: file: gui/coverdialog.ui:23
-#. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:343 rc.cpp:343
-msgid "<html><head/><body><p>Cancel current query</p></body></html>"
-msgstr "<html><head/><body><p>Anuluj obecne zapytanie</p></body></html>"
-
-#. i18n: file: gui/coverdialog.ui:37
+#. i18n: file: gui/coverdialog.ui:30
 #. i18n: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:349 rc.cpp:349
-msgid "<html><head/><body><p>Add a local file</p></body></html>"
-msgstr "<html><head/><body><p>Dodaj lokalny plik</p></body></html>"
-
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:352 po/rc.cpp:442 rc.cpp:352 rc.cpp:442
-msgid "Save downloaded covers in music folder:"
-msgstr "Zapisz pobrane okładki w katalogu muzyki:"
-
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:355 po/rc.cpp:445 rc.cpp:355 rc.cpp:445
-msgid "Save downloaded lyrics in music folder:"
-msgstr "Zapisz pobrane teksty w katalogu muzyki:"
-
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#: po/rc.cpp:358 po/rc.cpp:448 rc.cpp:358 rc.cpp:448
-msgid "Save downloaded backdrops in music folder:"
-msgstr "Zapisz pobrane tła w katalogu muzyki:"
-
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:361 po/rc.cpp:451 rc.cpp:361 rc.cpp:451
-msgid "Save list of favorite streams in music folder:"
-msgstr "Zapisz listę ulubionych strumieni w katalogu muzyki:"
-
-#. i18n: file: gui/filesettings.ui:110
+#: po/rc.cpp:407 rc.cpp:407
+msgid "Add a local file"
+msgstr "Dodaj plik lokalny"
+
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#: po/rc.cpp:413 po/rc.cpp:506 rc.cpp:413 rc.cpp:506
+msgid "Save downloaded covers in music folder"
+msgstr "Zapisz pobrane okładki w katalogu muzyki"
+
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#: po/rc.cpp:416 po/rc.cpp:509 rc.cpp:416 rc.cpp:509
+msgid "Save downloaded lyrics in music folder"
+msgstr "Zapisz pobrane teksty w katalogu muzyki"
+
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#: po/rc.cpp:419 po/rc.cpp:512 rc.cpp:419 rc.cpp:512
+msgid "Save downloaded backdrops in music folder"
+msgstr "Zapisz pobrane tła w katalogu muzyki"
+
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#: po/rc.cpp:422 po/rc.cpp:515 rc.cpp:422 rc.cpp:515
+msgid "Save list of favorite streams in music folder"
+msgstr "Zapisz listę ulubionych strumieni w katalogu muzyki"
+
+#. i18n: file: gui/filesettings.ui:79
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:425 rc.cpp:425
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, lyrics, or "
 "backdrops, within the music folder, and you do not have write access to this "
@@ -4521,8 +4808,7 @@ msgid ""
 msgstr ""
 "<i><b>UWAGA:</b> Jeśli w ustawieniach Cantaty wybrana zostanie opcja zapisu "
 "okładek, tekstów lub obrazów tła w katalogu muzyki, a program nie ma dostępu "
-"lub "
-"możliwości zapisu do tego katalogu, wtedy Cantata powróci do zapisywania "
+"lub możliwości zapisu do tego katalogu, wtedy Cantata powróci do zapisywania "
 "tych plików w osobistym katalogu pamięci podręcznej. Jakkolwiek, w przypadku "
 "strumieni, przy braku możliwości zapisu możliwe jest jedynie przeglądanie i "
 "odtwarzanie strumieni zapisanych w katalogu muzyki, jednak nie ma możliwości "
@@ -4530,9 +4816,22 @@ msgstr ""
 "katalogu muzyki, wtedy będą one zapisywane w lokalnym katalogu konfiguracji "
 "i będą dostępne tylko dla obecnego użytkownika.</i>"
 
-#. i18n: file: gui/filesettings.ui:145
+#. i18n: file: gui/filesettings.ui:108
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:428 rc.cpp:428
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. (i.e. 'Artist/Album/Tracks')"
+"</i>"
+msgstr ""
+"<i><b>UWAGA:</b> Cantata może zapisać tła i obrazy artystów w katalogu z "
+"muzyką jeżeli ta ma hierarchię o głębokości 2 poziomów (tzn. "
+"'Artysta/Album/Utwory')"
+"</i>"
+
+#. i18n: file: gui/filesettings.ui:140
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:431 rc.cpp:431
 msgid ""
 "<i><b>NOTE:</b> If you change the location where streams are stored (i.e. "
 "you toggle the 'Save list of favorite streams in music folder' option), then "
@@ -4550,19 +4849,19 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:370 rc.cpp:370
+#: po/rc.cpp:434 rc.cpp:434
 msgid "Cantata First Run"
 msgstr "Pierwsze uruchomienie programu Cantata"
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:373 rc.cpp:373
+#: po/rc.cpp:437 rc.cpp:437
 msgid "Welcome to Cantata"
 msgstr "Witamy w programie Cantata"
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:440 rc.cpp:440
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4583,13 +4882,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:379 rc.cpp:379
+#: po/rc.cpp:443 rc.cpp:443
 msgid "<html><head/><body><p>Welcome to Cantata</p></body></html>"
 msgstr "<html><head/><body><p>Witaj w programie Cantata</p></body></html>"
 
 #. i18n: file: gui/initialsettingswizard.ui:128
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:382 rc.cpp:382
+#: po/rc.cpp:446 rc.cpp:446
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4606,13 +4905,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:166
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:385 rc.cpp:385
+#: po/rc.cpp:449 rc.cpp:449
 msgid "Standard multi-user/server setup"
 msgstr "Standardowa wielo-użytkownikowa/serwerowa konfiguracja"
 
 #. i18n: file: gui/initialsettingswizard.ui:179
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:388 rc.cpp:388
+#: po/rc.cpp:452 rc.cpp:452
 msgid ""
 "<i>Select this option if your music collection is shared between users, your "
 "MPD instance is running on another machine, or you already have a personal "
@@ -4629,13 +4928,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:211
 #. i18n: ectx: property (text), widget (QRadioButton, basic)
-#: po/rc.cpp:391 rc.cpp:391
+#: po/rc.cpp:455 rc.cpp:455
 msgid "Basic single user setup"
 msgstr "Podstawowa konfiguracja dla pojedynczego użytkownika"
 
 #. i18n: file: gui/initialsettingswizard.ui:224
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
-#: po/rc.cpp:394 rc.cpp:394
+#: po/rc.cpp:458 rc.cpp:458
 msgid ""
 "<i>Select this option if your music collection is not shared with others, "
 "and you wish Cantata to configure and control the MPD instance.</i>"
@@ -4645,7 +4944,7 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:397 rc.cpp:397
+#: po/rc.cpp:461 rc.cpp:461
 msgid ""
 "<html><head/><body><p>For more information on MPD itself, please refer to "
 "the MPD website <a href=\"http://www.musicpd.org\"><span style=\" text-"
@@ -4661,13 +4960,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:400 rc.cpp:400
+#: po/rc.cpp:464 rc.cpp:464
 msgid "Connection details"
 msgstr "Szczegóły połączenia"
 
 #. i18n: file: gui/initialsettingswizard.ui:341
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:403 rc.cpp:403
+#: po/rc.cpp:467 rc.cpp:467
 msgid ""
 "The settings below are the basic settings required by Cantata. Please enter "
 "the relevant details, and use the 'Connect' button to test the connection."
@@ -4684,19 +4983,21 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: gui/serversettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
-#: po/rc.cpp:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
+#: po/rc.cpp:470 po/rc.cpp:796 rc.cpp:470 rc.cpp:796
 msgid "Host (or local socket):"
 msgstr "Host (albo gniazdo lokalne):"
 
 #. i18n: file: gui/initialsettingswizard.ui:494
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:421 rc.cpp:421
+#: po/rc.cpp:485 rc.cpp:485
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
-"lyrics, etc.</i>"
+"lyrics, etc. If you're MPD instance is on a remote host, you may set this to "
+"a HTTP URL.</i>"
 msgstr ""
 "<i><b>UWAGA:</b> Ustawienie 'Katalog z muzyką' jest używane do wyszukiwania "
-"okładek, tekstów, itp.</i>"
+"okładek, tekstów, itp. Jeżeli używana jest instancja MPD na zdalnym hoście, "
+"to można użyć adresu URL w postaci HTTP.</i>"
 
 # Polskie zasady pisowni wymagają, aby kropkę stawiać za nawiasem
 #. i18n: file: gui/initialsettingswizard.ui:520
@@ -4707,7 +5008,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
 #. i18n: file: gui/serversettings.ui:225
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#: po/rc.cpp:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
+#: po/rc.cpp:488 po/rc.cpp:820 rc.cpp:488 rc.cpp:820
 msgid ""
 "<i><b>NOTE:</b> When using a local socket the full absolute path to the "
 "socket needs to be set. (Port number is not required.)</i>"
@@ -4717,25 +5018,25 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:553
 #. i18n: ectx: property (text), widget (QLabel, label_13)
-#: po/rc.cpp:427 rc.cpp:427
+#: po/rc.cpp:491 rc.cpp:491
 msgid "Music folder"
 msgstr "Katalog z muzyką"
 
 #. i18n: file: gui/initialsettingswizard.ui:576
 #. i18n: ectx: property (text), widget (QLabel, label_12)
-#: po/rc.cpp:430 rc.cpp:430
+#: po/rc.cpp:494 rc.cpp:494
 msgid "Please choose the folder containing your music collection."
 msgstr "Proszę wybrać katalog zawierający kolekcję z muzyką."
 
 #. i18n: file: gui/initialsettingswizard.ui:662
 #. i18n: ectx: property (text), widget (QLabel, label_6f)
-#: po/rc.cpp:436 rc.cpp:436
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Covers, Lyrics, and Streams"
 msgstr "Okładki, teksty i strumienie"
 
 #. i18n: file: gui/initialsettingswizard.ui:685
 #. i18n: ectx: property (text), widget (QLabel, label_5f)
-#: po/rc.cpp:439 rc.cpp:439
+#: po/rc.cpp:503 rc.cpp:503
 msgid ""
 "<p>Cantata will download missing covers, and lyrics, from the internet. "
 "Cantata also allows you to save a list of internet streams (e.g. Radio "
@@ -4749,9 +5050,9 @@ msgstr ""
 "przechowywać odpowiednie pliki w folderze muzyki, czy w prywatnym folderze "
 "pamięci podręcznej.</p>"
 
-#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: file: gui/initialsettingswizard.ui:758
 #. i18n: ectx: property (text), widget (QLabel, persNote)
-#: po/rc.cpp:454 rc.cpp:454
+#: po/rc.cpp:518 rc.cpp:518
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
 "the music folder, and you do not have write access to this folder, then "
@@ -4772,27 +5073,40 @@ msgstr ""
 "katalogu muzyki, wtedy będą one zapisywane w lokalnym katalogu konfiguracji "
 "i będą dostępne tylko dla obecnego użytkownika.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:824
-#. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:457 rc.cpp:457
+#. i18n: file: gui/initialsettingswizard.ui:784
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:521 rc.cpp:521
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. i.e. 'Artist/Album/Tracks'."
+"</i>"
+msgstr ""
+"<i><b>UWAGA:</b> Cantata może zapisać tła i obrazy artystów w katalogu z "
+"muzyką jeżeli ta ma hierarchię o głębokości 2 poziomów tzn. "
+"'Artysta/Album/Utwory'."
+"</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:810
+#. i18n: ectx: property (text), widget (StateLabel, httpNote)
+#: po/rc.cpp:524 rc.cpp:524
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata "
 "currently cannot upload files to external HTTP servers. Therefore, the above "
-"settings should be left disabled.</i>"
+"settings should be left un-checked.</i>"
 msgstr ""
 "<i><b>UWAGA:</b> 'Katalog muzyki' został ustawiony na adres HTTP i Cantata "
 "obecnie nie potrafi wysyłać plików do zewnętrznych serwerów HTTP. Dlatego "
-"powyższe ustawienie powinno zostać wyłączone.</i>"
+"powyższe ustawienie powinno zostać odznaczone.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:857
+#. i18n: file: gui/initialsettingswizard.ui:843
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:460 rc.cpp:460
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Finished!"
 msgstr "Zakończono!"
 
-#. i18n: file: gui/initialsettingswizard.ui:880
+#. i18n: file: gui/initialsettingswizard.ui:866
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:463 rc.cpp:463
+#: po/rc.cpp:530 rc.cpp:530
 msgid ""
 "Cantata is now configured! If you wish to further configure Cantata (to add "
 "extra MPD hosts, etc) then Canta's configuration dialog may be accessed from "
@@ -4803,9 +5117,9 @@ msgstr ""
 "dostępnego z menu, które otwierane jest przez guzik w prawym górnym rogu "
 "głównego okna Cantaty."
 
-#. i18n: file: gui/initialsettingswizard.ui:918
+#. i18n: file: gui/initialsettingswizard.ui:904
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:466 rc.cpp:466
+#: po/rc.cpp:533 rc.cpp:533
 msgid ""
 "<b>Warning:</b> You are not currently a member of the 'users' group. Cantata "
 "will function better (saving of album covers, lyrics, etc. with the correct "
@@ -4819,210 +5133,306 @@ msgstr ""
 "grupy. Po dodaniu się do grupy należy się wylogować i zalogować ponownie, "
 "aby te ustawienia zadziałały."
 
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:36
+#. i18n: ectx: attribute (title), widget (QWidget, sidebarTab)
+#: po/rc.cpp:536 rc.cpp:536
+msgid "Sidebar"
+msgstr "Panel boczny"
+
+#. i18n: file: gui/interfacesettings.ui:42
+#. i18n: ectx: property (title), widget (QGroupBox, viewsGroup)
+#: po/rc.cpp:539 rc.cpp:539
+msgid "Views"
+msgstr "Widok"
+
+#. i18n: file: gui/interfacesettings.ui:48
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:542 rc.cpp:542
+msgid "Use the checkboxes below to configure the list of active views."
+msgstr "Użyj poniższych pól wyboru aby skonfigurować listę aktywnych widoków."
+
+#. i18n: file: gui/interfacesettings.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, sbPlayQueueLabel)
+#: po/rc.cpp:545 rc.cpp:545
+msgid ""
+"<i><b>NOTE:</b> By default, the play queue appears to the side of the other "
+"views. If you enable the option above, then it will be merged into the "
+"sidebar as per other views.</i>"
+msgstr ""
+"<i><b>UWAGA:</b> Domyślnie kolejka odtwarzania wyświetlana jest z boku innych "
+"widoków. Przy zaznaczeniu powyższej opcji, zostanie ona włączona do panelu "
+"bocznego jako jeden z pozostałych widoków.</i>"
+
+#. i18n: file: gui/interfacesettings.ui:106
+#. i18n: ectx: property (text), widget (StateLabel, sbInfoLabel)
+#: po/rc.cpp:548 rc.cpp:548
+msgid ""
+"<i><b>NOTE:</b> By default, the 'Info' (current song information) view is "
+"accessible by pressing its icon in the main toolbar. If you enable the "
+"option above, then it will be merged into the sidebar as per other views.</i>"
+msgstr ""
+"<i><b>UWAGA:</b> Domyślnie widok \"Informacje\" jest dostępny przez ikonę na "
+"głównym pasku narzędziowym. Po zaznaczeniu powyższej opcji, zostanie on"
+"umieszczony na pasku bocznym, tak jak inne widoki.</i>"
+
+#. i18n: file: gui/interfacesettings.ui:144
+#. i18n: ectx: property (text), widget (BuddyLabel, sbPositionLabel)
+#: po/rc.cpp:557 rc.cpp:557
+msgid "Position:"
+msgstr "Pozycja:"
+
+#. i18n: file: gui/interfacesettings.ui:157
+#. i18n: ectx: property (text), widget (QCheckBox, sbIconsOnly)
+#: po/rc.cpp:560 rc.cpp:560
+msgid "Only show icons, no text"
+msgstr "Pokazuj tylko ikony, bez tekstu"
+
+#. i18n: file: gui/interfacesettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, sbMonoIcons)
+#: po/rc.cpp:563 rc.cpp:563
+msgid "Use monochrome icons"
+msgstr "Użyj ikon monochromatycznych"
+
+#. i18n: file: gui/interfacesettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, sbAutoHide)
+#: po/rc.cpp:566 rc.cpp:566
+msgid "Auto-hide"
+msgstr "Automatycznie ukryj"
+
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#: po/rc.cpp:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
+#: po/rc.cpp:575 po/rc.cpp:594 rc.cpp:575 rc.cpp:594
 msgid "Covers:"
 msgstr "Okładki:"
 
-#. i18n: file: gui/interfacesettings.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:478 rc.cpp:478
-msgid "Show artist images:"
-msgstr "Pokaż obrazy artystów:"
+#. i18n: file: gui/interfacesettings.ui:219
+#. i18n: ectx: property (text), widget (QCheckBox, libraryArtistImage)
+#: po/rc.cpp:578 rc.cpp:578
+msgid "Show artist images"
+msgstr "Pokaż obrazy artystów"
 
-#. i18n: file: gui/interfacesettings.ui:81
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:481 rc.cpp:481
-msgid "Show album year:"
-msgstr "Pokaż rok albumu:"
+#. i18n: file: gui/interfacesettings.ui:226
+#. i18n: ectx: property (text), widget (QCheckBox, libraryYear)
+#: po/rc.cpp:581 rc.cpp:581
+msgid "Show album year"
+msgstr "Pokaż rok albumu"
 
-#. i18n: file: gui/interfacesettings.ui:123
+#. i18n: file: gui/interfacesettings.ui:258
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:484 rc.cpp:484
+#: po/rc.cpp:584 rc.cpp:584
 msgid ""
 "<i><b>NOTE:</b> When looking for artist images, Cantata will look for either "
 "artist.jpg, artist.png, 'Artist'.jpg, or 'Artist'.png,\n"
 "within the folder of the current track, or within its parent folder. If no "
-"image is found, Cantata will attempt to download one. When the image is "
-"displayed, it will be cropped (either top/bottom, or left/right) to provide "
-"a square image.</i>"
+"image is found, Cantata will attempt to download one.</i>"
 msgstr ""
 "<i><b>UWAGA:</b> W trakcie poszukiwania obrazów artystów, Cantata będzie "
 "próbowała znaleźć pliki o nazwie artist.jpg, artist.png, 'Artist'.jpg, or "
 "'Artist'.png,\n"
 "wewnątrz katalogu z obecnym utworem, albo w katalogu nadrzędnym. Jeśli żaden "
-"obraz nie zostanie znaleziony, to Cantata spróbuje pobrać obraz z sieci. "
-"Wyświetlany obraz jest przycięty (albo z góry i z dołu, albo z lewej i z "
-"prawej) tak, aby uzyskać kwadratowy kształt.</i>"
+"obraz nie zostanie znaleziony, to Cantata spróbuje pobrać go z sieci.</i>"
 
-#. i18n: file: gui/interfacesettings.ui:172
+#. i18n: file: gui/interfacesettings.ui:307
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:497 rc.cpp:497
+#: po/rc.cpp:597 rc.cpp:597
 msgid "Sort albums:"
 msgstr "Sortuj albumy:"
 
-#. i18n: file: gui/interfacesettings.ui:183
+#. i18n: file: gui/interfacesettings.ui:318
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:500 rc.cpp:500
+#: po/rc.cpp:600 rc.cpp:600
 msgid "Album/Artist"
 msgstr "Album/Artysta"
 
-#. i18n: file: gui/interfacesettings.ui:188
+#. i18n: file: gui/interfacesettings.ui:323
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:503 rc.cpp:503
+#: po/rc.cpp:603 rc.cpp:603
 msgid "Artist/Album"
 msgstr "Artysta/Album"
 
-#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: file: gui/interfacesettings.ui:328
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:506 rc.cpp:506
+#: po/rc.cpp:606 rc.cpp:606
 msgid "Artist/Year/Album"
 msgstr "Artysta/Rok/Album"
 
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#: po/rc.cpp:515 po/rc.cpp:545 rc.cpp:515 rc.cpp:545
-msgid "Initially collapse albums:"
-msgstr "Zwiń albumy przy uruchomieniu:"
-
-#. i18n: file: gui/interfacesettings.ui:242
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#: po/rc.cpp:615 po/rc.cpp:645 rc.cpp:615 rc.cpp:645
+msgid "Initially collapse albums"
+msgstr "Zwiń albumy przy uruchomieniu"
+
+#. i18n: file: gui/interfacesettings.ui:367
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:518 rc.cpp:518
+#: po/rc.cpp:618 rc.cpp:618
 msgid "Other Views"
 msgstr "Inne widoki"
 
-#. i18n: file: gui/interfacesettings.ui:251
+#. i18n: file: gui/interfacesettings.ui:376
 #. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
-#: po/rc.cpp:521 rc.cpp:521
+#: po/rc.cpp:621 rc.cpp:621
 msgid "Folder view style:"
 msgstr "Styl widoku katalogów:"
 
-#. i18n: file: gui/interfacesettings.ui:264
+#. i18n: file: gui/interfacesettings.ui:389
 #. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
-#: po/rc.cpp:524 rc.cpp:524
+#: po/rc.cpp:624 rc.cpp:624
 msgid "Streams view style:"
 msgstr "Styl widoku strumieni:"
 
-#. i18n: file: gui/interfacesettings.ui:277
+#. i18n: file: gui/interfacesettings.ui:402
 #. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
-#: po/rc.cpp:527 rc.cpp:527
+#: po/rc.cpp:627 rc.cpp:627
 msgid "Online view style:"
 msgstr "Styl widoku serwisów on-line:"
 
-#. i18n: file: gui/interfacesettings.ui:290
+#. i18n: file: gui/interfacesettings.ui:415
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:530 rc.cpp:530
+#: po/rc.cpp:630 rc.cpp:630
 msgid "Devices view style:"
 msgstr "Styl widoku urządzeń:"
 
-#. i18n: file: gui/interfacesettings.ui:324
-#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:539 rc.cpp:539
-msgid "Table"
-msgstr "Tabela"
-
-#. i18n: file: gui/interfacesettings.ui:354
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueAutoExpandLabel)
-#: po/rc.cpp:548 rc.cpp:548
-msgid "Automatically expand current album:"
-msgstr "Automatycznie rozwijaj obecny album:"
-
-#. i18n: file: gui/interfacesettings.ui:371
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueScrollLabel)
-#: po/rc.cpp:551 rc.cpp:551
-msgid "Scroll to current track:"
-msgstr "Przewiń do obecnego utworu:"
-
-# wg mnie o wiele lepiej oddaje to sens funkcji
-# (ale nie oryginalne brzmnienie)
-#. i18n: file: gui/interfacesettings.ui:384
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueBackgroundLabel)
-#: po/rc.cpp:554 rc.cpp:554
-msgid "Use current album cover as background:"
-msgstr "Używaj obecnej okładki jako tła:"
-
-#. i18n: file: gui/interfacesettings.ui:397
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueConfirmClearLabel)
-#: po/rc.cpp:557 rc.cpp:557
-msgid "Prompt before clearing:"
-msgstr "Pytaj przed czyszczeniem:"
-
-#. i18n: file: gui/interfacesettings.ui:411
+#. i18n: file: gui/interfacesettings.ui:469
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueAutoExpand)
+#: po/rc.cpp:648 rc.cpp:648
+msgid "Automatically expand current album"
+msgstr "Automatycznie rozwijaj obecny album"
+
+#. i18n: file: gui/interfacesettings.ui:476
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueScroll)
+#: po/rc.cpp:651 rc.cpp:651
+msgid "Scroll to current track"
+msgstr "Przewiń do obecnego utworu"
+
+#. i18n: file: gui/interfacesettings.ui:483
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueConfirmClear)
+#: po/rc.cpp:654 rc.cpp:654
+msgid "Prompt before clearing"
+msgstr "Pytaj przed czyszczeniem"
+
+#. i18n: file: gui/interfacesettings.ui:509
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_cover)
+#: po/rc.cpp:663 rc.cpp:663
+msgid "Current album cover"
+msgstr "Okładka obecnego albumu"
+
+#. i18n: file: gui/interfacesettings.ui:638
 #. i18n: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:560 rc.cpp:560
+#: po/rc.cpp:682 rc.cpp:682
 msgid "External"
 msgstr "Zewnętrzne"
 
-#. i18n: file: gui/interfacesettings.ui:417
-#. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:563 rc.cpp:563
-msgid "Show icon in notification area:"
-msgstr "Pokarz ikonę w tacce systemowej:"
-
-#. i18n: file: gui/interfacesettings.ui:437
-#. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:566 rc.cpp:566
-msgid "Minimize to notification area when closed:"
-msgstr "Minimalizuj do tacki systemowej przy zamykaniu:"
-
-#. i18n: file: gui/interfacesettings.ui:457
-#. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:569 rc.cpp:569
-msgid "Show popup messages when changing tracks:"
-msgstr "Pokazuj wyskakujące okienka przy zmianie utworu:"
-
-#. i18n: file: gui/interfacesettings.ui:475
+#. i18n: file: gui/interfacesettings.ui:644
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayPopup)
+#: po/rc.cpp:685 rc.cpp:685
+msgid "Show popup messages when changing tracks"
+msgstr "Pokazuj wyskakujące okienka przy zmianie utworu"
+
+#. i18n: file: gui/interfacesettings.ui:654
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayCheckBox)
+#: po/rc.cpp:688 rc.cpp:688
+msgid "Show icon in notification area"
+msgstr "Pokarz ikonę w tacce systemowej"
+
+#. i18n: file: gui/interfacesettings.ui:664
+#. i18n: ectx: property (text), widget (QCheckBox, minimiseOnClose)
+#: po/rc.cpp:691 rc.cpp:691
+msgid "Minimize to notification area when closed"
+msgstr "Minimalizuj do tacki systemowej przy zamykaniu"
+
+#. i18n: file: gui/interfacesettings.ui:671
+#. i18n: ectx: property (title), widget (QGroupBox, startupState)
+#: po/rc.cpp:694 rc.cpp:694
+msgid "On Start-up"
+msgstr "Przy uruchomieniu"
+
+#. i18n: file: gui/interfacesettings.ui:677
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateShow)
+#: po/rc.cpp:697 rc.cpp:697
+msgid "Show main window"
+msgstr "Pokaż główne okno"
+
+#. i18n: file: gui/interfacesettings.ui:684
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateHide)
+#: po/rc.cpp:700 rc.cpp:700
+msgid "Hide main window"
+msgstr "Ukryj główne okno"
+
+#. i18n: file: gui/interfacesettings.ui:691
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateRestore)
+#: po/rc.cpp:703 rc.cpp:703
+msgid "Restore previous state"
+msgstr "Przywróć poprzedni stan"
+
+#. i18n: file: gui/interfacesettings.ui:715
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:572 rc.cpp:572
+#: po/rc.cpp:706 rc.cpp:706
 msgid "General"
 msgstr "Ogólne"
 
-#. i18n: file: gui/interfacesettings.ui:486
-#. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:575 rc.cpp:575
-msgid "Group single track albums:"
-msgstr "Grupuj pojedyncze utwory:"
-
-#. i18n: file: gui/interfacesettings.ui:503
-#. i18n: ectx: property (text), widget (BuddyLabel, useComposerLabel)
-#: po/rc.cpp:578 rc.cpp:578
-msgid "Group albums by composer:"
-msgstr "Grupuj albumy na podstawie kompozytora:"
-
-#. i18n: file: gui/interfacesettings.ui:520
-#. i18n: ectx: property (text), widget (BuddyLabel, groupMultipleLabel)
-#: po/rc.cpp:581 rc.cpp:581
-msgid "Multiple artist albums:"
-msgstr "Wiele artystów albumu:"
-
-#. i18n: file: gui/interfacesettings.ui:533
-#. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:584 rc.cpp:584
-msgid "Show delete action in context menus:"
-msgstr "Pokazuj akcję usuwania w menu kontekstowym:"
-
-#. i18n: file: gui/interfacesettings.ui:550
-#. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:587 rc.cpp:587
-msgid "Enforce single-click activation of items:"
-msgstr "Wymuś aktywację elementów przy pojedynczym kliknięciu:"
-
-#. i18n: file: gui/interfacesettings.ui:591
+#. i18n: file: gui/interfacesettings.ui:726
+#. i18n: ectx: property (text), widget (QCheckBox, groupSingle)
+#: po/rc.cpp:709 rc.cpp:709
+msgid "Group single track albums"
+msgstr "Grupuj pojedyncze utwory"
+
+#. i18n: file: gui/interfacesettings.ui:733
+#. i18n: ectx: property (text), widget (QCheckBox, useComposer)
+#: po/rc.cpp:712 rc.cpp:712
+msgid "Group albums by composer"
+msgstr "Grupuj albumy na podstawie kompozytora"
+
+#. i18n: file: gui/interfacesettings.ui:740
+#. i18n: ectx: property (text), widget (QCheckBox, groupMultiple)
+#: po/rc.cpp:715 rc.cpp:715
+msgid "Group multiple artist albums under 'Various Artists'"
+msgstr "Grupuj wielu artystów albumu jako 'Various Artists'"
+
+#. i18n: file: gui/interfacesettings.ui:747
+#. i18n: ectx: property (text), widget (QCheckBox, fetchCovers)
+#: po/rc.cpp:718 rc.cpp:718
+msgid "Fetch missing covers from Last.fm"
+msgstr "Pobierz brakujące okładki z Last.fm"
+
+#. i18n: file: gui/interfacesettings.ui:754
+#. i18n: ectx: property (text), widget (QCheckBox, cacheScaledCovers)
+#: po/rc.cpp:721 rc.cpp:721
+msgid "Cache scaled covers"
+msgstr "Zapisz przeskalowane okładki w pamięci podręcznej"
+
+#. i18n: file: gui/interfacesettings.ui:761
+#. i18n: ectx: property (text), widget (QCheckBox, showDeleteAction)
+#: po/rc.cpp:724 rc.cpp:724
+msgid "Show delete action in context menus"
+msgstr "Pokazuj akcję usuwania w menu kontekstowym"
+
+#. i18n: file: gui/interfacesettings.ui:768
+#. i18n: ectx: property (text), widget (QCheckBox, forceSingleClick)
+#: po/rc.cpp:727 rc.cpp:727
+msgid "Enforce single-click activation of items"
+msgstr "Wymuś aktywację elementów przy pojedynczym kliknięciu"
+
+#. i18n: file: gui/interfacesettings.ui:775
+#. i18n: ectx: property (text), widget (BuddyLabel, langLabel)
+#: po/rc.cpp:730 rc.cpp:730
+msgid "Language:"
+msgstr "Język:"
+
+#. i18n: file: gui/interfacesettings.ui:806
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:590 rc.cpp:590
+#: po/rc.cpp:733 rc.cpp:733
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
@@ -5030,87 +5440,101 @@ msgstr ""
 "<i><b>UWAGA:</b> Zmiana opcji 'Wymuś aktywację elementów przy pojedynczym "
 "kliknięciu' wymaga restartu Cantaty.</i>"
 
-#. i18n: file: gui/mainwindow.ui:287
+#. i18n: file: gui/interfacesettings.ui:835
+#. i18n: ectx: property (text), widget (StateLabel, langNoteLabel)
+#: po/rc.cpp:736 rc.cpp:736
+msgid ""
+"<i><b>NOTE:</b> Changing the language setting will require a re-start of "
+"Cantata.</i>"
+msgstr "<i><b>UWAGA:</b> Zmiana ustawienia jeżyka wymaga restartu Cantaty.</i>"
+
+#. i18n: file: gui/mainwindow.ui:298
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:593 rc.cpp:593
+#: po/rc.cpp:739 rc.cpp:739
 msgid "[Dynamic]"
 msgstr "[Dynamiczne]"
 
-#. i18n: file: gui/playbacksettings.ui:20
+#. i18n: file: gui/playbacksettings.ui:38
+#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
+#: po/rc.cpp:745 rc.cpp:745
+msgid "Fadeout on stop:"
+msgstr "Wycisz przy zatrzymaniu:"
+
+#. i18n: file: gui/playbacksettings.ui:48
+#. i18n: ectx: property (suffix), widget (QSpinBox, stopFadeDuration)
+#: po/rc.cpp:748 rc.cpp:748
+msgid " ms"
+msgstr " ms"
+
+#. i18n: file: gui/playbacksettings.ui:58
+#. i18n: ectx: property (text), widget (QCheckBox, stopOnExit)
+#: po/rc.cpp:754 rc.cpp:754
+msgid "Stop playback on exit"
+msgstr "Zatrzymaj odtwarzanie przy wyjściu"
+
+#. i18n: file: gui/playbacksettings.ui:65
+#. i18n: ectx: property (text), widget (QCheckBox, stopDynamizerOnExit)
+#: po/rc.cpp:757 rc.cpp:757
+msgid "Stop dynamizer on exit"
+msgstr "Zatrzymaj dynamizer przy wyjściu"
+
+#. i18n: file: gui/playbacksettings.ui:72
+#. i18n: ectx: property (text), widget (QCheckBox, inhibitSuspend)
+#: po/rc.cpp:760 rc.cpp:760
+msgid "Inhibit suspend whilst playing"
+msgstr "Powstrzymaj przejście w stan wstrzymania podczas odtwarzania"
+
+#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:763 rc.cpp:763
+msgid ""
+"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
+"shown allowing you to choose whether to stop playback now, or after the "
+"current track.</i>"
+msgstr ""
+"<i><b>UWAGA:</b> Przy przyciśnięciu i przytrzymaniu przycisku stop otwarte "
+"zostanie menu pozwalające na wybór, czy odtwarzanie ma zostać zatrzymane "
+"natychmiast, czy po obecnym utworze.</i>"
+
+#. i18n: file: gui/playbacksettings.ui:108
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:596 rc.cpp:596
+#: po/rc.cpp:766 rc.cpp:766
 msgid "Output"
 msgstr "Wyjście"
 
-#. i18n: file: gui/playbacksettings.ui:41
+#. i18n: file: gui/playbacksettings.ui:129
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:602 rc.cpp:602
-msgid "Crossfading:"
-msgstr "Crossfading:"
+#: po/rc.cpp:772 rc.cpp:772
+msgid "Crossfade between tracks:"
+msgstr "Przenikanie między utworami:"
 
-#. i18n: file: gui/playbacksettings.ui:51
-#. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:605 rc.cpp:605
-msgid " seconds"
-msgstr " sekund"
+#. i18n: file: gui/playbacksettings.ui:139
+#. i18n: ectx: property (suffix), widget (QSpinBox, crossfading)
+#: po/rc.cpp:775 rc.cpp:775
+msgid " s"
+msgstr "s"
 
-#. i18n: file: gui/playbacksettings.ui:61
+#. i18n: file: gui/playbacksettings.ui:152
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:608 rc.cpp:608
+#: po/rc.cpp:781 rc.cpp:781
 msgid "Replay gain:"
 msgstr "Replay gain:"
 
-#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: file: gui/playbacksettings.ui:195
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:611 rc.cpp:611
+#: po/rc.cpp:784 rc.cpp:784
 msgid "About replay gain"
 msgstr "O ReplayGain:"
 
-#. i18n: file: gui/playbacksettings.ui:104
+#. i18n: file: gui/playbacksettings.ui:204
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:614 rc.cpp:614
-msgid "Devices:"
-msgstr "Urządzenia:"
-
-#. i18n: file: gui/playbacksettings.ui:141
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:620 rc.cpp:620
-msgid "Fadeout on stop:"
-msgstr "Wycisz przy zatrzymaniu:"
-
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:623 rc.cpp:623
-msgid "Stop playback on exit:"
-msgstr "Zatrzymaj odtwarzanie przy wyjściu:"
-
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:626 rc.cpp:626
-msgid "Stop dynamizer on exit:"
-msgstr "Zatrzymaj dynamizer przy wyjściu:"
-
-#. i18n: file: gui/playbacksettings.ui:184
-#. i18n: ectx: property (text), widget (BuddyLabel, inhibitSuspendLabel)
-#: po/rc.cpp:629 rc.cpp:629
-msgid "Inhibit suspend whilst playing:"
-msgstr "Powstrzymaj przejście w stan wstrzymania podczas odtwarzania:"
-
-#. i18n: file: gui/playbacksettings.ui:217
-#. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:632 rc.cpp:632
-msgid ""
-"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
-"shown allowing you to choose whether to stop playback now, or after the "
-"current track.</i>"
-msgstr ""
-"<i><b>UWAGA:</b> Przy przyciśnięciu i przytrzymaniu przycisku stop otwarte "
-"zostanie menu pozwalające na wybór, czy odtwarzanie ma zostać zatrzymane "
-"natychmiast, czy po obecnym utworze.</i>"
+#: po/rc.cpp:787 rc.cpp:787
+msgid "Use the checkboxes below to control the active outputs."
+msgstr "Użyj poniższych pól wyboru aby kontrolować aktywne wyjścia."
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:635 rc.cpp:635
+#: po/rc.cpp:790 rc.cpp:790
 msgid "Collection:"
 msgstr "Kolekcja:"
 
@@ -5122,25 +5546,25 @@ msgstr "Kolekcja:"
 #. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
 #. i18n: file: gui/serversettings.ui:338
 #. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
-#: po/rc.cpp:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
+#: po/rc.cpp:808 po/rc.cpp:829 rc.cpp:808 rc.cpp:829
 msgid "Cover filename:"
 msgstr "Nazwa pliku okładki:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:656 rc.cpp:656
+#: po/rc.cpp:811 rc.cpp:811
 msgid "Dynamizer port:"
 msgstr "Port dynamizera:"
 
 #. i18n: file: gui/serversettings.ui:168
 #. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
-#: po/rc.cpp:659 rc.cpp:659
+#: po/rc.cpp:814 rc.cpp:814
 msgid "HTTP stream URL:"
 msgstr "URL strumienia HTTP:"
 
 #. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:662 rc.cpp:662
+#: po/rc.cpp:817 rc.cpp:817
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art "
 "(either the value specified above, or <code>cover.jpg / cover.png</code> if "
@@ -5156,19 +5580,19 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:277
 #. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
-#: po/rc.cpp:668 rc.cpp:668
+#: po/rc.cpp:823 rc.cpp:823
 msgid ""
 "<i><b>NOTE:</b> 'HTTP Stream URL' is only of use if you have MPD configured "
 "to output to a HTTP stream, and you wish Cantata to be able to play that "
 "stream.</i>"
 msgstr ""
 "<i><b>UWAGA:</b> Opcja 'URL strumienia HTTP' używana jest wyłącznie wtedy, "
-"gdy wyjściem MPD "
-"jest strumień HTTP, a Cantata ma mieć możliwość jego odtwarzania.</i>"
+"gdy wyjściem MPD jest strumień HTTP, a Cantata ma mieć możliwość jego "
+"odtwarzania.</i>"
 
 #. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:677 rc.cpp:677
+#: po/rc.cpp:832 rc.cpp:832
 msgid ""
 "<i><b>NOTE:</b> If you change the 'Music folder' setting, then you will need "
 "to manually update the music database. This can be performed by pressing the "
@@ -5181,7 +5605,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:379
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel_2)
-#: po/rc.cpp:680 rc.cpp:680
+#: po/rc.cpp:835 rc.cpp:835
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -5191,19 +5615,13 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:683 rc.cpp:683
+#: po/rc.cpp:838 rc.cpp:838
 msgid "Network interface:"
 msgstr "Interfejs sieciowy:"
 
-#. i18n: file: http/httpserversettings.ui:38
-#. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:686 rc.cpp:686
-msgid "Current URL:"
-msgstr "Obecny URL:"
-
-#. i18n: file: http/httpserversettings.ui:73
+#. i18n: file: http/httpserversettings.ui:57
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:689 rc.cpp:689
+#: po/rc.cpp:841 rc.cpp:841
 msgid ""
 "<i><b>NOTE:</b> MPD usually only plays songs that are stored within its "
 "folders. Cantata contains a minimal HTTP server that can be used to serve "
@@ -5221,35 +5639,31 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:693 rc.cpp:693
+#: po/rc.cpp:845 rc.cpp:845
 msgid "Mode:"
 msgstr "Tryb:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:699 rc.cpp:699
+#: po/rc.cpp:851 rc.cpp:851
 msgid "HTTP Proxy"
 msgstr "HTTP Proxy"
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:702 rc.cpp:702
+#: po/rc.cpp:854 rc.cpp:854
 msgid "SOCKS Proxy"
 msgstr "SOCKS Proxy"
 
 #. i18n: file: online/onlinesettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:717 rc.cpp:717
-msgid ""
-"The following is a list of online providers, to hide a provider simply un-"
-"check its entry in this list."
-msgstr ""
-"Poniżej przedstawiono listę dostawców online, aby ukryć dostawcę należy "
-"odznaczyć dany wpis na tej liście."
+#: po/rc.cpp:869 rc.cpp:869
+msgid "Use the checkboxes below to configure the list of active services."
+msgstr "Użyj poniższych pól wyboru aby skonfigurować listę aktywnych serwisów."
 
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:723 rc.cpp:723
+#: po/rc.cpp:875 rc.cpp:875
 msgid ""
 "You can listen for free without an account, but Premium members can listen "
 "to higher quality streams without advertisements. Visit <a href=\"http://www."
@@ -5263,48 +5677,48 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:726 rc.cpp:726
+#: po/rc.cpp:878 rc.cpp:878
 msgid "Premium Account"
 msgstr "Konto premium"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:735 rc.cpp:735
+#: po/rc.cpp:887 rc.cpp:887
 msgid "Stream type:"
 msgstr "Typ strumienia:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:738 rc.cpp:738
+#: po/rc.cpp:890 rc.cpp:890
 msgid "Status:"
 msgstr "Stan:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:109
 #. i18n: ectx: property (text), widget (QPushButton, loginButton)
-#: po/rc.cpp:741 streams/digitallyimportedsettings.cpp:130
-#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
+#: po/rc.cpp:893 streams/digitallyimportedsettings.cpp:131
+#: streams/digitallyimportedsettings.cpp:137 rc.cpp:893
 msgid "Login"
 msgstr "Login"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:747 rc.cpp:747
+#: po/rc.cpp:899 rc.cpp:899
 msgid "Session expiry:"
 msgstr "Wygaśnięcie sesji:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:151
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:750 rc.cpp:750
+#: po/rc.cpp:902 rc.cpp:902
 msgid ""
 "<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
 "RockRadio.com, and Sky.fm</i>"
 msgstr ""
-"<i><b>UWAGA:</b> Te ustawienia odnoszą się do Digitally Imported, "
-"JazzRadio.com, RockRadio.com, oraz Sky.fm.</i>"
+"<i><b>UWAGA:</b> Te ustawienia odnoszą się do Digitally Imported, JazzRadio."
+"com, RockRadio.com, oraz Sky.fm.</i>"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:161
 #. i18n: ectx: property (text), widget (QLabel, note2Label)
-#: po/rc.cpp:753 rc.cpp:753
+#: po/rc.cpp:905 rc.cpp:905
 msgid ""
 "<i><b>NOTE:</b> If you enter account details, then a 'DI' status item will "
 "appear under the list of streams. This will indicate if you are logged in or "
@@ -5316,155 +5730,146 @@ msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:756 rc.cpp:756
-msgid ""
-"The following is a list of the top-level stream categories, to hide a "
-"category simply un-check its entry in this list."
+#: po/rc.cpp:908 rc.cpp:908
+msgid "Use the checkboxes below to configure the list of active providers."
 msgstr ""
-"Poniżej znajduje się lista głównych kategorii strumieni, aby je ukryć należy "
-"odznaczyć dany wpis na tej liście."
+"Użyj poniższych pól wyboru aby skonfigurować listę aktywnych dostawców."
 
 #. i18n: file: streams/streamssettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: po/rc.cpp:759 rc.cpp:759
+#: po/rc.cpp:911 rc.cpp:911
 msgid "Configure Provider"
 msgstr "Konfiguruj dostawcę"
 
 #. i18n: file: streams/streamssettings.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, installButton)
-#: po/rc.cpp:762 rc.cpp:762
+#: po/rc.cpp:914 rc.cpp:914
 msgid "Install"
 msgstr "Instaluj"
 
 #. i18n: file: streams/streamssettings.ui:80
 #. i18n: ectx: property (text), widget (QLabel, note)
-#: po/rc.cpp:768 rc.cpp:768
+#: po/rc.cpp:920 rc.cpp:920
 msgid ""
 "<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
 "removed.</i>"
 msgstr ""
-"<i><b>UWAGA:</b> Wbudowane kategorie wyświetlone są kursywą i nie mogą zostać "
-"usunięte.</i>"
+"<i><b>UWAGA:</b> Wbudowane kategorie wyświetlone są kursywą i nie mogą "
+"zostać usunięte.</i>"
 
 #. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:771 rc.cpp:771
+#: po/rc.cpp:923 rc.cpp:923
 msgid "Search:"
 msgstr "Szukaj:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:65
 #. i18n: ectx: property (title), widget (QGroupBox, actionBox)
-#: po/rc.cpp:774 rc.cpp:774
+#: po/rc.cpp:926 rc.cpp:926
 msgid "Shortcut for Selected Action"
 msgstr "Skrót dla zaznaczonej akcji"
 
 #. i18n: file: support/shortcutssettingswidget.ui:71
 #. i18n: ectx: property (text), widget (QRadioButton, useDefault)
-#: po/rc.cpp:777 rc.cpp:777
+#: po/rc.cpp:929 rc.cpp:929
 msgid "Default:"
 msgstr "Domyślny:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:85
 #. i18n: ectx: property (text), widget (QRadioButton, useCustom)
-#: po/rc.cpp:783 rc.cpp:783
+#: po/rc.cpp:935 rc.cpp:935
 msgid "Custom:"
 msgstr "Własny:"
 
-#. i18n: file: tags/tageditor.ui:25
-#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:786 rc.cpp:786
-msgid "Track:"
-msgstr "Utwór:"
-
 #. i18n: file: tags/tageditor.ui:64
 #. i18n: ectx: property (text), widget (StateLabel, albumArtistLabel)
-#: po/rc.cpp:795 rc.cpp:795
+#: po/rc.cpp:947 rc.cpp:947
 msgid "Album artist:"
 msgstr "Artysta albumu:"
 
 #. i18n: file: tags/tageditor.ui:103
 #. i18n: ectx: property (text), widget (StateLabel, trackLabel)
-#: po/rc.cpp:804 rc.cpp:804
+#: po/rc.cpp:956 rc.cpp:956
 msgid "Track number:"
 msgstr "Numer utworu:"
 
 #. i18n: file: tags/tageditor.ui:116
 #. i18n: ectx: property (text), widget (StateLabel, discLabel)
-#: po/rc.cpp:807 rc.cpp:807
+#: po/rc.cpp:959 rc.cpp:959
 msgid "Disc number:"
 msgstr "Numer płyty:"
 
-#. i18n: file: tags/trackorganiser.ui:155
+#. i18n: file: tags/trackorganiser.ui:115
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:834 rc.cpp:834
+#: po/rc.cpp:989 rc.cpp:989
 msgid "Original Name"
 msgstr "Obecna nazwa"
 
-#. i18n: file: tags/trackorganiser.ui:160
+#. i18n: file: tags/trackorganiser.ui:120
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:837 rc.cpp:837
+#: po/rc.cpp:992 rc.cpp:992
 msgid "New Name"
 msgstr "Nowa nazwa"
 
-#: po/rc.cpp:838 rc.cpp:838
+#: po/rc.cpp:996 rc.cpp:996
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "Piotr Wicijowski"
 
-#: po/rc.cpp:839 rc.cpp:839
+#: po/rc.cpp:997 rc.cpp:997
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "piotr[dot]wicijowski[at]gmail[dot]com"
 
-#: replaygain/rgdialog.cpp:121
+#: replaygain/rgdialog.cpp:116
 msgid "Show All Tracks"
 msgstr "Pokaż wszystkie utwory"
 
-#: replaygain/rgdialog.cpp:122
+#: replaygain/rgdialog.cpp:117
 msgid "Show Untagged Tracks"
 msgstr "Pokaż utwory bez tagów"
 
-#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:124 tags/trackorganiser.cpp:79
 msgid "Remove From List"
 msgstr "Usuń z listy"
 
-#: replaygain/rgdialog.cpp:136
+#: replaygain/rgdialog.cpp:131
 msgid "Album Gain"
 msgstr "Gain albumu"
 
-#: replaygain/rgdialog.cpp:137
+#: replaygain/rgdialog.cpp:132
 msgid "Track Gain"
 msgstr "Gain utworu"
 
-#: replaygain/rgdialog.cpp:138
+#: replaygain/rgdialog.cpp:133
 msgid "Album Peak"
 msgstr "Peak albumu"
 
-#: replaygain/rgdialog.cpp:139
+#: replaygain/rgdialog.cpp:134
 msgid "Track Peak"
 msgstr "Peak utworu"
 
-#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
+#: replaygain/rgdialog.cpp:154 replaygain/rgdialog.cpp:283
 msgid "Scan"
 msgstr "Skanuj"
 
-#: replaygain/rgdialog.cpp:238
+#: replaygain/rgdialog.cpp:233
 msgid "Update ReplayGain tags in tracks?"
 msgstr "Uaktualnić tagi ReplayGain w utworach?"
 
-#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
+#: replaygain/rgdialog.cpp:233 replaygain/rgdialog.cpp:234
 msgid "Update Tags"
 msgstr "Uaktualnij tagi"
 
-#: replaygain/rgdialog.cpp:252
+#: replaygain/rgdialog.cpp:247
 msgid "Abort scanning of tracks?"
 msgstr "Przerwać skanowanie plików?"
 
-#: replaygain/rgdialog.cpp:261
+#: replaygain/rgdialog.cpp:256
 msgid "Abort reading of existing tags?"
 msgstr "Przerwać czytanie istniejących tagów?"
 
-#: replaygain/rgdialog.cpp:287
+#: replaygain/rgdialog.cpp:282
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
@@ -5472,63 +5877,63 @@ msgstr ""
 "Skanować <b>wszystkie</b> utwory?<br><br><i>UWAGA: Wszystkie utwory "
 "posiadają istniejące tagi ReplayGain.</i>"
 
-#: replaygain/rgdialog.cpp:289
+#: replaygain/rgdialog.cpp:284
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr ""
 "Czy przeskanować wszystkie utwory, czy tylko te bez istniejących tagów?"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "Untagged Tracks"
 msgstr "Utwory bez tagów"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "All Tracks"
 msgstr "Wszystkie utwory"
 
-#: replaygain/rgdialog.cpp:300
+#: replaygain/rgdialog.cpp:295
 msgid "Scanning tracks..."
 msgstr "Skanowanie utworów..."
 
-#: replaygain/rgdialog.cpp:367
+#: replaygain/rgdialog.cpp:362
 msgid "Reading existing tags..."
 msgstr "Czytanie istniejących tagów..."
 
-#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+#: replaygain/rgdialog.cpp:414 tags/tageditor.cpp:798
 msgctxt "filename (Timeout)"
 msgid "%1 (Timeout)"
 msgstr "%1 (timeout)"
 
-#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:802
 msgctxt "filename (Corrupt tags?)"
 msgid "%1 (Corrupt tags?)"
 msgstr "%1 (Uszkodzone tagi?)"
 
-#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
+#: replaygain/rgdialog.cpp:432 tags/tageditor.cpp:812
 msgid "Failed to update the tags of the following tracks:"
 msgstr "Uaktualnianie tagów następujących utworów nie powiodło się:"
 
-#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
-#: tags/trackorganiser.cpp:451
+#: replaygain/rgdialog.cpp:473 tags/tageditor.cpp:885
+#: tags/trackorganiser.cpp:483
 msgid "Device is not connected."
 msgstr "Urządzenie nie jest podłączone."
 
-#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
-#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
+#: replaygain/rgdialog.cpp:513 replaygain/rgdialog.cpp:520
+#: replaygain/rgdialog.cpp:599 replaygain/rgdialog.cpp:601
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:520 replaygain/rgdialog.cpp:521
-#: replaygain/rgdialog.cpp:527 replaygain/rgdialog.cpp:528
-#: replaygain/rgdialog.cpp:579 replaygain/rgdialog.cpp:580
-#: replaygain/rgdialog.cpp:581 replaygain/rgdialog.cpp:582
+#: replaygain/rgdialog.cpp:516 replaygain/rgdialog.cpp:517
+#: replaygain/rgdialog.cpp:523 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:575 replaygain/rgdialog.cpp:576
+#: replaygain/rgdialog.cpp:577 replaygain/rgdialog.cpp:578
 msgid "Failed"
 msgstr "Nie powiodło się"
 
-#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
+#: replaygain/rgdialog.cpp:651 tags/trackorganiser.cpp:428
 msgid "Remove the selected tracks from the list?"
 msgstr "Usunąć zaznaczone utwory z listy?"
 
-#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
+#: replaygain/rgdialog.cpp:652 tags/trackorganiser.cpp:429
 msgid "Remove Tracks"
 msgstr "Usuń utwory"
 
@@ -5548,19 +5953,19 @@ msgstr "AAC 64k"
 msgid "AAC 128k"
 msgstr "AAC 128k"
 
-#: streams/digitallyimportedsettings.cpp:109
+#: streams/digitallyimportedsettings.cpp:110
 msgid "Logged out"
 msgstr "Wylogowano"
 
-#: streams/digitallyimportedsettings.cpp:112
+#: streams/digitallyimportedsettings.cpp:113
 msgid "Logging in..."
 msgstr "Logowanie..."
 
-#: streams/digitallyimportedsettings.cpp:136
+#: streams/digitallyimportedsettings.cpp:137
 msgid "Logout"
 msgstr "Wyloguj"
 
-#: streams/streamdialog.cpp:71
+#: streams/streamdialog.cpp:72
 msgid "URL:"
 msgstr "URL:"
 
@@ -5584,7 +5989,7 @@ msgstr "Edytuj strumień"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>BŁAD:</b> Niewłaściwy protokół</i>"
 
-#: streams/streamfetcher.cpp:205
+#: streams/streamfetcher.cpp:209
 msgid "Fetching %1"
 msgstr "Pobieranie %1"
 
@@ -5600,79 +6005,79 @@ msgstr "Eksportuj ulubione strumienie"
 msgid "Add New Stream To Favorites"
 msgstr "Dodaj nowy strumień do ulubionych"
 
-#: streams/streamspage.cpp:124
+#: streams/streamspage.cpp:125
 msgctxt "Service name"
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:243
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|strumienie XML"
 
-#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
+#: streams/streamspage.cpp:243 streams/streamspage.cpp:245
 msgid "Import Streams"
 msgstr "Importuj strumienie"
 
-#: streams/streamspage.cpp:245
+#: streams/streamspage.cpp:246
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "Strumienie XML (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:253
+#: streams/streamspage.cpp:254
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr ""
 "Import <b>%1</b> nie powiódł się!<br/>Proszę upewnić się, że plik jest "
 "odpowiedniego typu."
 
-#: streams/streamspage.cpp:265
+#: streams/streamspage.cpp:266
 msgid "*.xml|XML Streams"
 msgstr "*.xml|Strumienie XML"
 
-#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
+#: streams/streamspage.cpp:266 streams/streamspage.cpp:268
 msgid "Export Streams"
 msgstr "Eksportuj strumienie"
 
-#: streams/streamspage.cpp:267
+#: streams/streamspage.cpp:268
 msgid "XML Streams (*.xml)"
 msgstr "Strumienie XML (*.xml)"
 
-#: streams/streamspage.cpp:279
+#: streams/streamspage.cpp:280
 msgid "Failed to create <b>%1</b>!"
 msgstr "Nie powiodło się utworzenie <b>%1</b>!"
 
-#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
+#: streams/streamspage.cpp:297 streams/streamspage.cpp:493
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "Strumień już istnieje!<br/><b>%1</b>"
 
-#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
+#: streams/streamspage.cpp:299 streams/streamspage.cpp:495
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "Strumień o nazwie <b>%1</b> już istnieje!"
 
-#: streams/streamspage.cpp:318
+#: streams/streamspage.cpp:319
 msgid "Bookmark added"
 msgstr "Dodano zakładkę"
 
-#: streams/streamspage.cpp:320
+#: streams/streamspage.cpp:321
 msgid "Already bookmarked"
 msgstr "Już w zakładkach"
 
-#: streams/streamspage.cpp:366
+#: streams/streamspage.cpp:367
 msgid "Added to favorites"
 msgstr "Dodano do ulubionych"
 
-#: streams/streamspage.cpp:368
+#: streams/streamspage.cpp:369
 msgid "Already in favorites"
 msgstr "Już w ulubionych"
 
-#: streams/streamspage.cpp:393
+#: streams/streamspage.cpp:394
 msgid "Reload <b>%1</b> streams?"
 msgstr "Przeładować <b>%1</b> strumieni(e)?"
 
-#: streams/streamspage.cpp:411
+#: streams/streamspage.cpp:412
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr "Czy na pewno usunąć zakładkę <b>%1</b>?"
 
-#: streams/streamspage.cpp:417
+#: streams/streamspage.cpp:418
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr "Czy na pewno usunąć wszystkie <b>%1</b> zakładek?"
 
@@ -5680,15 +6085,15 @@ msgstr "Czy na pewno usunąć wszystkie <b>%1</b> zakładek?"
 # 1 zaznaczony strumień
 # 2-4 zaznaczone strumienie
 # 5+ zaznaczonych strumieni (jak teraz)
-#: streams/streamspage.cpp:445
+#: streams/streamspage.cpp:446
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "Czy jesteś pewien, że chcesz usunąć %1 zaznaczonych strumieni?"
 
-#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
+#: streams/streamspage.cpp:450 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "Czy na pewno usunąć <b>%1</b>?"
 
-#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+#: streams/streamspage.cpp:561 streams/streamspage.cpp:577
 msgid "Search %1:"
 msgstr "Szukaj %1:"
 
@@ -5728,139 +6133,90 @@ msgstr "Zapisanie listy strumieni nie powiodło się!"
 msgid "Failed to remove streams folder!"
 msgstr "Usunięcie katalogu strumieni nie powiodło się!"
 
-#: support/dialog.cpp:89
+#: support/dialog.cpp:73
 msgid "&OK"
 msgstr "&Ok"
 
-#: support/dialog.cpp:90
+#: support/dialog.cpp:74
 msgid "&Cancel"
 msgstr "&Anuluj"
 
-#: support/dialog.cpp:91
+#: support/dialog.cpp:75
 msgid "&Yes"
 msgstr "&Tak"
 
-#: support/dialog.cpp:92
+#: support/dialog.cpp:76
 msgid "&No"
 msgstr "&Nie"
 
-#: support/dialog.cpp:93
+#: support/dialog.cpp:77
 msgid "&Discard"
 msgstr "&Odrzuć"
 
-#: support/dialog.cpp:94
+#: support/dialog.cpp:78
 msgid "&Save"
 msgstr "Zapi&sz"
 
-#: support/dialog.cpp:95
+#: support/dialog.cpp:79
 msgid "&Apply"
 msgstr "&Zastosuj"
 
-#: support/dialog.cpp:96
+#: support/dialog.cpp:80
 msgid "&Close"
 msgstr "Zam&knij"
 
-#: support/dialog.cpp:98
+#: support/dialog.cpp:82
 msgid "&Overwrite"
 msgstr "Nad&pisz"
 
-#: support/dialog.cpp:99
+#: support/dialog.cpp:83
 msgid "&Reset"
 msgstr "&Resetuj"
 
-#: support/dialog.cpp:100
+#: support/dialog.cpp:84
 msgid "&Continue"
 msgstr "&Kontynuuj"
 
-#: support/dialog.cpp:101
+#: support/dialog.cpp:85
 msgid "&Delete"
 msgstr "&Skasuj"
 
-#: support/dialog.cpp:102
+#: support/dialog.cpp:86
 msgid "&Stop"
 msgstr "&Stop"
 
-#: support/dialog.cpp:103
+#: support/dialog.cpp:87
 msgid "&Remove"
 msgstr "&Usuń"
 
-#: support/dialog.cpp:104
+#: support/dialog.cpp:88
 msgid "&Previous"
 msgstr "&Poprzedni"
 
-#: support/dialog.cpp:105
+#: support/dialog.cpp:89
 msgid "&Next"
 msgstr "&Następny"
 
-#: support/fancytabwidget.cpp:957
-msgid "Icons Only"
-msgstr "Tylko ikony"
-
-#: support/fancytabwidget.cpp:958
-msgid "Style"
-msgstr "Styl"
-
-#: support/fancytabwidget.cpp:959
-msgid "Large Sidebar"
-msgstr "Duży panel boczny"
-
-#: support/fancytabwidget.cpp:960
-msgid "Small Sidebar"
-msgstr "Mały panel boczny"
-
-#: support/fancytabwidget.cpp:961
-msgid "Top Bar"
-msgstr "Górny pasek"
-
-#: support/fancytabwidget.cpp:962
-msgid "Bottom Bar"
-msgstr "Dolny pasek"
-
-#: support/fancytabwidget.cpp:963
-msgid "Tabs On Side"
-msgstr "Karty z boku"
-
-#: support/fancytabwidget.cpp:964
-msgid "Tabs On Top"
-msgstr "Kary u góry"
-
-#: support/fancytabwidget.cpp:965
-msgid "Tabs On Bottom"
-msgstr "Kary u dołu"
-
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Password"
 msgstr "Hasło"
 
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Please enter password:"
 msgstr "Proszę podać hasło:"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:123
+#: support/messagebox.cpp:50 support/messagebox.cpp:124
 msgid "Warning"
 msgstr "Ostrzeżenie"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:118
+#: support/messagebox.cpp:50 support/messagebox.cpp:119
 msgid "Question"
 msgstr "Pytanie"
 
-#: support/messagebox.cpp:107 support/messagebox.cpp:113
-#: support/messagebox.h:62
-msgid "Error"
-msgstr "Błąd"
-
 #: support/messagebox.h:65
 msgid "Information"
 msgstr "Informacja"
 
-#: support/onoffbutton.cpp:47
-msgid "ON"
-msgstr "WŁ."
-
-#: support/onoffbutton.cpp:48
-msgid "OFF"
-msgstr "WYŁ."
-
 #: support/pathrequester.cpp:50
 msgid "Select Folder"
 msgstr "Wybierz katalog:"
@@ -5904,33 +6260,33 @@ msgstr[0] "1 dzień %2"
 msgstr[1] "%1 dni %2"
 msgstr[2] "%1 dni %2"
 
-#: tags/tageditor.cpp:134
+#: tags/tageditor.cpp:147
 msgid "Tags"
 msgstr "Tagi"
 
-#: tags/tageditor.cpp:147
+#: tags/tageditor.cpp:160
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr "Ustaw tag 'Artysta Albumu' na podstawie tagu 'Artysta'"
 
-#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
+#: tags/tageditor.cpp:261 tags/tageditor.cpp:592
 msgid "All tracks"
 msgstr "Wszystkie utwory"
 
-#: tags/tageditor.cpp:295
+#: tags/tageditor.cpp:323
 msgid "(Various)"
 msgstr "(różne)"
 
-#: tags/tageditor.cpp:336
+#: tags/tageditor.cpp:368
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr ""
 "Czy zastosować obejście dla 'Various Artists' we <b>wszystkich</b> utworach?"
 
-#: tags/tageditor.cpp:378
+#: tags/tageditor.cpp:410
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr ""
 "Czy cofnąć obejście dla 'Various Artists' we <b>wszystkich</b> utworach?"
 
-#: tags/tageditor.cpp:428
+#: tags/tageditor.cpp:460
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5938,17 +6294,17 @@ msgstr ""
 "Czy ustawić tag 'Artystę Albumu' na podstawie tagu 'Artysta' (jeśli 'Artysta "
 "Albumu' jest pusty) dla <b>wszystkich</b> utworów?"
 
-#: tags/tageditor.cpp:429
+#: tags/tageditor.cpp:461
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr ""
 "Czy ustawić tag 'Artystę Albumu' na podstawie tagu 'Artysta' (jeśli 'Artysta "
 "Albumu' jest pusty)?"
 
-#: tags/tageditor.cpp:430
+#: tags/tageditor.cpp:462
 msgid "Album Artist from Artist"
 msgstr "Artysta Albumu na podstawie Artysty"
 
-#: tags/tageditor.cpp:463
+#: tags/tageditor.cpp:495
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5956,52 +6312,52 @@ msgstr ""
 "Czy ustawić pierwszą dużą literę tagów 'Title', 'Artist', 'Album artist', "
 "oraz 'Album' we <b>wszystkich</b> utworach?"
 
-#: tags/tageditor.cpp:496
+#: tags/tageditor.cpp:528
 msgid "Adjust the value of each track number by:"
 msgstr "Zwiększ wartość numeru każdego utworu o:"
 
-#: tags/tageditor.cpp:554
+#: tags/tageditor.cpp:586
 msgid "All tracks [modified]"
 msgstr "Wszystkie utwory [zmodyfikowano]"
 
-#: tags/tageditor.cpp:556
+#: tags/tageditor.cpp:588
 msgid "%1 [modified]"
 msgstr "%1 [zmodyfikowano]"
 
-#: tags/tageditor.cpp:783
+#: tags/tageditor.cpp:827
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr "Czy również zmienić nazwy plików tak, aby pasowały do tagów?"
 
-#: tags/tageditor.cpp:784
+#: tags/tageditor.cpp:828
 msgid "Rename Files"
 msgstr "Zmień nazwy plików"
 
-#: tags/trackorganiser.cpp:150
+#: tags/trackorganiser.cpp:164
 msgid "Abort renaming of files?"
 msgstr "Przerwać zmianę nazw plików?"
 
-#: tags/trackorganiser.cpp:263
+#: tags/trackorganiser.cpp:279
 msgid "Source file does not exist!<br/>%1"
 msgstr "Plik źródłowy nie istnieje!<br/>%1"
 
-#: tags/trackorganiser.cpp:282
+#: tags/trackorganiser.cpp:298
 msgid "Destination file already exists!<br/>%1"
 msgstr "Docelowy plik już istnieje!<br/>%1"
 
-#: tags/trackorganiser.cpp:304
+#: tags/trackorganiser.cpp:320
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "Tworzenie katalogu docelowego nie powiodło się!<br/>%1"
 
-#: tags/trackorganiser.cpp:325
+#: tags/trackorganiser.cpp:341
 msgid "Failed to rename %1 to %2"
 msgstr "Nie powiodła się zmiana nazwy z %1 na %2"
 
-#: widgets/coverwidget.cpp:267
+#: widgets/coverwidget.cpp:280
 msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
 msgstr "<tr><td align=\"right\"><b>Kompozytor:</b></td><td>%1</td></tr>"
 
-#: widgets/coverwidget.cpp:269
+#: widgets/coverwidget.cpp:282
 msgid ""
 "<tr><td align=\"right\"><b>Artist:</b></td><td>%1</td></tr><tr><td align="
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Year:"
@@ -6011,37 +6367,41 @@ msgstr ""
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Rok:</"
 "b></td><td>%3</td></tr>"
 
-#: widgets/genrecombo.cpp:54
+#: widgets/genrecombo.cpp:44
+msgid "Filter On Genre"
+msgstr "Filtruj według gatunku"
+
+#: widgets/genrecombo.cpp:66
 msgid "All Genres"
 msgstr "Wszystkie gatunki"
 
-#: widgets/groupedview.cpp:267
+#: widgets/groupedview.cpp:265
 msgctxt "album (albumYear)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: widgets/groupedview.cpp:269
+#: widgets/groupedview.cpp:267
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: widgets/itemview.cpp:480
+#: widgets/itemview.cpp:561
 msgid "Go Back"
 msgstr "Idź wstecz"
 
-#: widgets/itemview.cpp:485
+#: widgets/itemview.cpp:566
 msgid "Go Home"
 msgstr "Idź na samą górę"
 
-#: widgets/menubutton.cpp:36
+#: widgets/menubutton.cpp:39
 msgid "Menu"
 msgstr "Menu"
 
-#: widgets/searchwidget.cpp:62
+#: widgets/searchwidget.cpp:63
 msgid "Search..."
 msgstr "Szukaj..."
 
-#: widgets/searchwidget.cpp:66
+#: widgets/searchwidget.cpp:67
 msgid "Close Search Bar"
 msgstr "Zamknij pasek wyszukiwania"
 
@@ -6053,7 +6413,7 @@ msgstr "Zalogowano do %1"
 msgid "<b>NOT</b> logged into %1"
 msgstr "<b>NIE</b> zalogowano do %1"
 
-#: widgets/songdialog.cpp:48
+#: widgets/songdialog.cpp:49
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
 "\" setting, and MPD's \"music_directory\" setting.</p>"
@@ -6061,7 +6421,7 @@ msgstr ""
 "<p>Brak dostępu do plików utworów!<br/><br/>Proszę sprawdzić ustawienia "
 "Cantaty \"Katalog z muzyką\" oraz ustawienie MPD \"music_directory\".</p>"
 
-#: widgets/songdialog.cpp:51
+#: widgets/songdialog.cpp:52
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check that the device is still "
 "attached.</p>"
@@ -6069,28 +6429,24 @@ msgstr ""
 "<p>Brak dostępu do plików utworów!<br/><br/>Proszę sprawdzić, czy urządzenie "
 "jest nadal podłączone.</p>"
 
-#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:115 widgets/volumeslider.cpp:230
+#: widgets/volumeslider.cpp:237
 msgid "Mute"
 msgstr "Wycisz"
 
-#: widgets/volumeslider.cpp:199
+#: widgets/volumeslider.cpp:198
 msgid "Muted"
 msgstr "Wyciszono"
 
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:237
 msgid "Unmute"
 msgstr "Wyłącz wyciszenie"
 
-#: widgets/volumeslider.cpp:276
-msgid "Volume Disabled"
-msgstr "Głośność wyłączona"
-
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1% (Muted)"
 msgstr "Głośność %1% (wyciszono)"
 
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1%"
 msgstr "Głośność %1%"
 
@@ -6194,6 +6550,183 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Episodes"
 msgstr "Odcinki: %1"
 
+#~ msgid "Transcoding failed.<br/><br/<hr/>%1"
+#~ msgstr "Konwertowanie nie powiodło się.<br/><br/<hr/>%1"
+
+#~ msgid "Failed to download track.<br/><br/<hr/>%1"
+#~ msgstr "Pobieranie utworu nie powiodło się.<br/><br/<hr/>%1"
+
+#~ msgid "<b>Error</b><br/>"
+#~ msgstr "<b>Błąd</b><br/>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
+#~ "td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Artysta:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Numer:</td><td>%3</"
+#~ "td></tr>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Destination file:</td><td>%2</td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Plik źródłowy:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Plik docelowy:</td><td>%2</td></tr>"
+
+#~ msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
+#~ msgstr "<tr><td align=\"right\">Plik:</td><td>%1</td></tr>"
+
+#~ msgid ""
+#~ "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
+#~ "i></tr>"
+#~ msgstr ""
+#~ "<tr><i><td align=\"right\"><i>Pozostały czas:</i></td><td><i>%5</i></td></"
+#~ "i></tr>"
+
+#~ msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
+#~ msgstr "<tr><td>%album%</td><td>%1</td><td>Nazwa albumu.</td></tr>"
+
+#~ msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
+#~ msgstr "<tr><td>%composer%</td><td>%1</td><td>Kompozytor.</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
+#~ msgstr "<tr><td>%artist%</td><td>%1</td><td>Artysta utworu.</td></tr>"
+
+#~ msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
+#~ msgstr "<tr><td>%track%</td><td>%1</td><td>Numer utworu.</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></"
+#~ "tr>"
+#~ msgstr "<tr><td>%year%</td><td>%1</td><td>Rok wydania albumu.</td></tr>"
+
+#~ msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
+#~ msgstr "<tr><td>%genre%</td><td>%1</td><td>Gatunek albumu.</td></tr>"
+
+#~ msgctxt ""
+#~ "Google\n"
+#~ "width x height (file size)"
+#~ msgid ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+#~ msgstr ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+
+#~ msgctxt ""
+#~ "Discogs\n"
+#~ "width x height"
+#~ msgid ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+#~ msgstr ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+
+#~ msgid "Grouped by 'Album Artist'"
+#~ msgstr "Pogrupowane według 'Artysta albumu'"
+
+#~ msgid "Search Play Queue"
+#~ msgstr "Szukaj w kolejce odtwarzania"
+
+#~ msgid "Do not fadeout"
+#~ msgstr "Nie wyciszaj"
+
+#~ msgid "Inactive"
+#~ msgstr "Nieaktywny"
+
+#~ msgctxt "Track Number (#)"
+#~ msgid "#"
+#~ msgstr "#"
+
+#~ msgid "Search For Podcasts"
+#~ msgstr "Szukaj podcastów"
+
+#~ msgid "Subscribe to Podcast"
+#~ msgstr "Subskrybuj podcast"
+
+#~ msgid "You are already subscribed to this URL!"
+#~ msgstr "Subskrypcja o podanym URL już istnieje!"
+
+#~ msgid "Already downloading this URL!"
+#~ msgstr "Już trwa pobieranie tego URL!"
+
+#~ msgid "Use backdrop"
+#~ msgstr "Używaj tła"
+
+#~ msgid "Automatically lookup"
+#~ msgstr "Automatycznie wyszukaj w"
+
+#~ msgid "<html><head/><body><p>Cancel current query</p></body></html>"
+#~ msgstr "<html><head/><body><p>Anuluj obecne zapytanie</p></body></html>"
+
+#~ msgid "<html><head/><body><p>Add a local file</p></body></html>"
+#~ msgstr "<html><head/><body><p>Dodaj lokalny plik</p></body></html>"
+
+# wg mnie o wiele lepiej oddaje to sens funkcji
+# (ale nie oryginalne brzmnienie)
+#~ msgid "Use current album cover as background:"
+#~ msgstr "Używaj obecnej okładki jako tła:"
+
+#~ msgid "Multiple artist albums:"
+#~ msgstr "Wiele artystów albumu:"
+
+#~ msgid "Crossfading:"
+#~ msgstr "Crossfading:"
+
+#~ msgid " seconds"
+#~ msgstr " sekund"
+
+#~ msgid "Devices:"
+#~ msgstr "Urządzenia:"
+
+#~ msgid "Current URL:"
+#~ msgstr "Obecny URL:"
+
+#~ msgid ""
+#~ "The following is a list of online providers, to hide a provider simply un-"
+#~ "check its entry in this list."
+#~ msgstr ""
+#~ "Poniżej przedstawiono listę dostawców online, aby ukryć dostawcę należy "
+#~ "odznaczyć dany wpis na tej liście."
+
+#~ msgid ""
+#~ "The following is a list of the top-level stream categories, to hide a "
+#~ "category simply un-check its entry in this list."
+#~ msgstr ""
+#~ "Poniżej znajduje się lista głównych kategorii strumieni, aby je ukryć "
+#~ "należy odznaczyć dany wpis na tej liście."
+
+#~ msgid "Icons Only"
+#~ msgstr "Tylko ikony"
+
+#~ msgid "Style"
+#~ msgstr "Styl"
+
+#~ msgid "Small Sidebar"
+#~ msgstr "Mały panel boczny"
+
+#~ msgid "Tabs On Side"
+#~ msgstr "Karty z boku"
+
+#~ msgid "Tabs On Top"
+#~ msgstr "Kary u góry"
+
+#~ msgid "Tabs On Bottom"
+#~ msgstr "Kary u dołu"
+
+#~ msgid "ON"
+#~ msgstr "WŁ."
+
+#~ msgid "OFF"
+#~ msgstr "WYŁ."
+
+#~ msgid "Volume Disabled"
+#~ msgstr "Głośność wyłączona"
+
 #~ msgid ""
 #~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
 #~ msgstr ""
@@ -6266,9 +6799,6 @@ msgstr "Odcinki: %1"
 #~ msgid "Biography"
 #~ msgstr "Biografia"
 
-#~ msgid "Source: %1"
-#~ msgstr "Źródło: %1"
-
 #~ msgid "Stop Immediately"
 #~ msgstr "Zatrzymaj natychmiast"
 
@@ -6329,9 +6859,6 @@ msgstr "Odcinki: %1"
 #~ "Ustawienia o nazwie %1 już istnieją!\n"
 #~ "Nadpisać?"
 
-#~ msgid "Set Cover"
-#~ msgstr "Ustaw okładkę"
-
 #~ msgctxt ""
 #~ "<title> by <artist>\n"
 #~ "Failed\n"
@@ -6354,9 +6881,6 @@ msgstr "Odcinki: %1"
 #~ msgid "Failed to reconnect to %1"
 #~ msgstr "Nie powiodło się ponowne łączenie z %1"
 
-#~ msgid "Loaded"
-#~ msgstr "Załadowano"
-
 #~ msgid "Add Online Service"
 #~ msgstr "Dodaj serwis on-line"
 
@@ -6488,9 +7012,6 @@ msgstr "Odcinki: %1"
 #~ msgid "Category:"
 #~ msgstr "Kategoria:"
 
-#~ msgid "Radio Stations"
-#~ msgstr "Stacje radiowe"
-
 #~ msgid "From %1"
 #~ msgstr "Z %1"
 
@@ -6644,9 +7165,6 @@ msgstr "Odcinki: %1"
 #~ msgid "Uptime:"
 #~ msgstr "Czas działania:"
 
-#~ msgid "Time playing:"
-#~ msgstr "Czas odtwarzania:"
-
 #~ msgid "Database"
 #~ msgstr "Baza danych"
 
@@ -6849,12 +7367,6 @@ msgstr "Odcinki: %1"
 #~ msgid "Other Protocol"
 #~ msgstr "Inny protokół"
 
-#~ msgid "1 Artist, "
-#~ msgid_plural "%1 Artists, "
-#~ msgstr[0] "1 Artysta, "
-#~ msgstr[1] "%1 Artystów, "
-#~ msgstr[2] "%1 Artystów, "
-
 #~ msgid "1 Album, "
 #~ msgid_plural "%1 Albums, "
 #~ msgstr[0] "1 Album, "
@@ -6878,9 +7390,6 @@ msgstr "Odcinki: %1"
 #~ msgid "Device is currently busy."
 #~ msgstr "Urządzenie jest obecnie zajęte."
 
-#~ msgid "No lyrics found"
-#~ msgstr "Nie znaleziono tekstów"
-
 #~ msgid "Library View"
 #~ msgstr "Widok biblioteki"
 
@@ -6908,9 +7417,6 @@ msgstr "Odcinki: %1"
 #~ msgid "Delete Songs From Device"
 #~ msgstr "Usuń utwory z urządzenia"
 
-#~ msgid "Clear Playlist"
-#~ msgstr "Wyczyść playlistę"
-
 #~ msgid ""
 #~ "The MPD connection died unexpectedly.<br/>TThis error is unrecoverable, "
 #~ "please restart %1."
diff --git a/po/ru.po b/po/ru.po
index 043f887..3f8e06a 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-14 20:26+0000\n"
+"POT-Creation-Date: 2014-02-02 20:02+0000\n"
 "PO-Revision-Date: 2013-11-20 22:05+0400\n"
 "Last-Translator: Julia Dronova <juliette.tux at gmail.com>\n"
 "Language-Team: Russian <kde-russian at lists.kde.ru>\n"
@@ -22,14 +22,13 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "Обновить сведения об альбоме"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:307
-#: gui/cachesettings.cpp:262
+#: context/albumview.cpp:71 gui/cachesettings.cpp:269
 msgid "Album Information"
 msgstr "Сведения об альбоме"
 
-#. i18n: file: devices/albumdetails.ui:143
+#. i18n: file: devices/albumdetails.ui:136
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
+#: context/albumview.cpp:175 po/rc.cpp:107 rc.cpp:107
 msgid "Tracks"
 msgstr "Дорожки"
 
@@ -37,22 +36,22 @@ msgstr "Дорожки"
 msgid "Refresh Artist Information"
 msgstr "Обновить сведения об исполнителе"
 
-#: context/artistview.cpp:92 context/contextwidget.cpp:306
-#: gui/cachesettings.cpp:260
+#: context/artistview.cpp:92 gui/cachesettings.cpp:267
 msgid "Artist Information"
 msgstr "Сведения об исполнителе"
 
-#. i18n: file: gui/interfacesettings.ui:137
+#. i18n: file: gui/interfacesettings.ui:272
 #. i18n: ectx: attribute (title), widget (QWidget, tab_2)
-#: context/artistview.cpp:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
+#: context/artistview.cpp:314 gui/interfacesettings.cpp:106
+#: gui/mainwindow.cpp:308 po/rc.cpp:588 rc.cpp:588
 msgid "Albums"
 msgstr "Альбомы"
 
-#: context/artistview.cpp:333
+#: context/artistview.cpp:337
 msgid "Web Links"
 msgstr "Ссылки"
 
-#: context/artistview.cpp:419
+#: context/artistview.cpp:424
 msgid "Similar Artists"
 msgstr "Похожие исполнители"
 
@@ -60,22 +59,31 @@ msgstr "Похожие исполнители"
 msgid "Lyrics Providers"
 msgstr "Источники текстов"
 
-#: context/contextsettings.cpp:37
+#: context/contextsettings.cpp:37 gui/cachesettings.cpp:278
 msgid "Wikipedia Languages"
 msgstr "Языки Wikipedia"
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
-#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1388
+#: models/streamsmodel.cpp:1434 models/streamsmodel.cpp:1642
 msgid "Other"
 msgstr "Другое"
 
-#: context/contextwidget.cpp:98
+#: context/contextwidget.cpp:293
 msgid "Reset Spacing"
 msgstr "Перенастроить отступ"
 
-#: context/contextwidget.cpp:308 context/songview.cpp:105
-#: gui/cachesettings.cpp:259
-msgid "Lyrics"
+#: context/contextwidget.cpp:506
+#, fuzzy
+msgid "&Artist"
+msgstr "Исполнитель"
+
+#: context/contextwidget.cpp:507
+msgid "Al&bum"
+msgstr ""
+
+#: context/contextwidget.cpp:508
+#, fuzzy
+msgid "&Lyrics"
 msgstr "Слова песни"
 
 #: context/lastfmengine.cpp:63
@@ -100,37 +108,38 @@ msgstr ""
 "Если этот поиск не принесёт новых результатов, слова песни будут привязаны к "
 "названию оригинала и к изначальному артисту, как это показано в Cantata."
 
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#: context/lyricsdialog.cpp:64 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
-#: rc.cpp:61 rc.cpp:304 rc.cpp:789
+#: context/lyricsdialog.cpp:64 gui/searchpage.cpp:204 po/rc.cpp:92
+#: po/rc.cpp:377 po/rc.cpp:941 rc.cpp:92 rc.cpp:377 rc.cpp:941
 msgid "Title:"
 msgstr "Название:"
 
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#: context/lyricsdialog.cpp:66 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
-#: rc.cpp:55 rc.cpp:292 rc.cpp:792
+#: context/lyricsdialog.cpp:66 devices/actiondialog.cpp:800
+#: gui/searchpage.cpp:197 po/rc.cpp:86 po/rc.cpp:362 po/rc.cpp:944 rc.cpp:86
+#: rc.cpp:362 rc.cpp:944
 msgid "Artist:"
 msgstr "Исполнитель:"
 
@@ -142,95 +151,125 @@ msgstr "Искать слова песни"
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "Сайты для поиска текстов песен"
 
-#: context/lyricsettings.cpp:66
-msgid "(Polish Translations)"
-msgstr "(Переводы на польский)"
+#: context/othersettings.cpp:45 gui/coverdialog.cpp:877
+#: gui/interfacesettings.cpp:174
+msgid "Images (*.png *.jpg)"
+msgstr "Изображения (*.png *.jpg)"
 
-#: context/lyricsettings.cpp:67
-msgid "(Portuguese Translations)"
-msgstr "(Переводы на португальский)"
+#: context/othersettings.cpp:47 gui/interfacesettings.cpp:176
+msgctxt "pixels"
+msgid "10px"
+msgstr ""
+
+#: context/othersettings.cpp:102 gui/interfacesettings.cpp:524
+#, fuzzy
+msgctxt "value%"
+msgid "%1%"
+msgstr "%1 %2%"
+
+#: context/othersettings.cpp:107 gui/interfacesettings.cpp:529
+#, c-format
+msgctxt "pixels"
+msgid "%1px"
+msgstr ""
 
-#: context/songview.cpp:89
+#: context/songview.cpp:90
 msgid "Refresh Lyrics"
 msgstr "Обновить слова песни"
 
-#: context/songview.cpp:90
+#: context/songview.cpp:91
 msgid "Edit Lyrics"
 msgstr "Изменить слова песни"
 
-#: context/songview.cpp:91
+#: context/songview.cpp:92
 msgid "Save Lyrics"
 msgstr "Сохранить слова песни"
 
-#: context/songview.cpp:92
+#: context/songview.cpp:93
 msgid "Cancel Editing Lyrics"
 msgstr "Отменить изменение слов песни"
 
-#: context/songview.cpp:93
+#: context/songview.cpp:94
 msgid "Delete Lyrics File"
 msgstr "Удалить файл со словами песни"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:106 gui/cachesettings.cpp:266
+msgid "Lyrics"
+msgstr "Слова песни"
+
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort editing of lyrics?"
 msgstr "Прервать изменение слов песни?"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort Editing"
 msgstr "Прервать изменение"
 
-#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
-#: replaygain/rgdialog.cpp:252 replaygain/rgdialog.cpp:253
-#: replaygain/rgdialog.cpp:261 replaygain/rgdialog.cpp:262
-#: tags/trackorganiser.cpp:150
+#: context/songview.cpp:120 context/songview.cpp:139 context/songview.cpp:198
+#: replaygain/rgdialog.cpp:247 replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:256 replaygain/rgdialog.cpp:257
+#: tags/trackorganiser.cpp:164
 msgid "Abort"
 msgstr "Прервать"
 
-#: context/songview.cpp:121
+#: context/songview.cpp:122
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr "Удалить сохранённый файл со словами песни и снова загрузить?"
 
-#: context/songview.cpp:121 context/songview.cpp:122
-#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
+#: context/songview.cpp:122 context/songview.cpp:123
+#: online/onlineservicespage.cpp:458 online/onlineservicespage.cpp:459
 msgid "Re-download"
 msgstr "Загрузить снова"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Current playing song has changed, still perform search?"
 msgstr "Текущая песня сменилась, произвести поиск всё равно?"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Song Changed"
 msgstr "Песня изменена"
 
-#: context/songview.cpp:148
+#: context/songview.cpp:149
 msgid "Perform Search"
 msgstr "Произвести поиск"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save updated lyrics?"
 msgstr "Сохранить обновлённые слова песни?"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save"
 msgstr "Сохранить"
 
-#: context/songview.cpp:185
+#: context/songview.cpp:186
 msgid "Failed to save lyrics."
 msgstr "Сбой сохранения слов песни"
 
-#: context/songview.cpp:207
+#: context/songview.cpp:208
 msgid "Delete lyrics file?"
 msgstr "Удалить файл со словами песни?"
 
-#: context/songview.cpp:207 gui/mainwindow.cpp:292
-#: widgets/messageoverlay.cpp:43
-msgid "Cancel"
-msgstr "Отмена"
+#: context/songview.cpp:208
+#, fuzzy
+msgid "Delete File"
+msgstr "Выбрать файл"
 
-#: context/songview.cpp:431
+#: context/songview.cpp:462
 msgid "Fetching lyrics via %1"
 msgstr "Загрузка слов песни с %1"
 
+#: context/ultimatelyricsprovider.cpp:200
+msgid "(Polish Translations)"
+msgstr "(Переводы на польский)"
+
+#: context/ultimatelyricsprovider.cpp:201
+msgid "(Portuguese Translations)"
+msgstr "(Переводы на португальский)"
+
+#: context/view.cpp:91 gui/mainwindow.cpp:328 widgets/messageoverlay.cpp:44
+msgid "Cancel"
+msgstr "Отмена"
+
 #: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "Список дорожек"
@@ -253,7 +292,7 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "альбом|рейтинг|саундтрек"
 
-#: context/wikipediasettings.cpp:99
+#: context/wikipediasettings.cpp:114
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
@@ -261,8 +300,8 @@ msgstr ""
 "Выбрать языки Википедии, на которых будет искаться информация об исполнителе "
 "и об альбоме."
 
-#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
-#: online/podcastsearchdialog.cpp:393
+#: context/wikipediasettings.cpp:115 models/streamsmodel.cpp:598
+#: online/podcastsearchdialog.cpp:404
 msgid "Reload"
 msgstr "Обновить"
 
@@ -270,37 +309,47 @@ msgstr "Обновить"
 msgid "Cantata is playing a track"
 msgstr "Cantata проигрывает трек"
 
-#: devices/actiondialog.cpp:76
+#: devices/actiondialog.cpp:83
 msgid "Songs To Be Copied"
 msgstr "Песни, которые нужно скопировать"
 
-#: devices/actiondialog.cpp:146
+#: devices/actiondialog.cpp:153
 msgid "<b>INVALID</b>"
 msgstr "<b>НЕДОПУСТИМО</b>"
 
-#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
+#: devices/actiondialog.cpp:167 devices/actiondialog.cpp:170
 msgid "<i>(When different)</i>"
 msgstr "<i>(если отличается)</i>"
 
-#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:185 tags/tageditor.cpp:713
+#: tags/trackorganiser.cpp:444
+msgid ""
+"Cantata has detected that you are connected to a Mopidy server.\n"
+"\n"
+"Currently it is not possible for Cantata to force Mopidy to refresh its "
+"local music listing. Therefore, you will need to stop Cantata, manually "
+"refresh Mopidy's database, and restart Cantata for any changes to be active."
+msgstr ""
+
+#: devices/actiondialog.cpp:211 devices/synccollectionwidget.cpp:274
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "Исполнители:%1, альбомы:%2, песни:%3"
 
-#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
-#: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
+#: devices/actiondialog.cpp:271 devices/mtpdevice.cpp:1622
+#: devices/remotefsdevice.cpp:571 devices/umsdevice.cpp:103
 msgid "%1 free"
 msgstr "%1 свободно"
 
-#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
+#: devices/actiondialog.cpp:284 devices/actiondialog.cpp:288
 msgid "Local Music Library"
 msgstr "Локальная музыкальная библиотека"
 
-#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
+#: devices/actiondialog.cpp:286 devices/albumdetailsdialog.cpp:104
+#: gui/preferencesdialog.cpp:115 widgets/groupedview.cpp:251
 msgid "Audio CD"
 msgstr "Аудио-CD"
 
-#: devices/actiondialog.cpp:293
+#: devices/actiondialog.cpp:309
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -312,7 +361,7 @@ msgstr ""
 "Чтобы иметь возможность скопировать эти песни, их необходимо перекодировать "
 "в файлы меньшего размера."
 
-#: devices/actiondialog.cpp:300
+#: devices/actiondialog.cpp:316
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -320,17 +369,17 @@ msgstr ""
 "На целевом устройстве недостаточно места.\n"
 "Выбранным песням необходимо %1, но доступно всего %2."
 
-#: devices/actiondialog.cpp:349
+#: devices/actiondialog.cpp:365
 msgid "Copy Songs"
 msgstr "Копировать песни"
 
-#: devices/actiondialog.cpp:349 devices/devicespage.cpp:503
-#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: devices/actiondialog.cpp:365 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:214 gui/folderpage.cpp:270 gui/librarypage.cpp:257
 #: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "Удалить песни"
 
-#: devices/actiondialog.cpp:380
+#: devices/actiondialog.cpp:402
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
@@ -338,15 +387,15 @@ msgstr ""
 "<p>Целевое устройство не настроено.<br/>Продолжить с настройками по "
 "умолчанию?</p>"
 
-#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
+#: devices/actiondialog.cpp:403 devices/actiondialog.cpp:407
 msgid "Not Configured"
 msgstr "Не настроено"
 
-#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
+#: devices/actiondialog.cpp:404 devices/actiondialog.cpp:408
 msgid "Use Defaults"
 msgstr "Использовать параметры по умолчанию"
 
-#: devices/actiondialog.cpp:384
+#: devices/actiondialog.cpp:406
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
@@ -354,222 +403,248 @@ msgstr ""
 "<p>Устройство-источник не настроено.<br/>Продолжить с настройками по "
 "умолчанию?</p>"
 
-#: devices/actiondialog.cpp:446
+#: devices/actiondialog.cpp:468
 msgid "Are you sure you wish to stop?"
 msgstr "Точно остановить?"
 
-#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
+#: devices/actiondialog.cpp:468 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "Остановить"
 
-#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
-#: tags/trackorganiser.cpp:446
+#: devices/actiondialog.cpp:513 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:468 tags/tageditor.cpp:880
+#: tags/trackorganiser.cpp:478
 msgid "Device has been removed!"
 msgstr "Устройство было удалено."
 
-#: devices/actiondialog.cpp:491
+#: devices/actiondialog.cpp:515
 msgid "Device is not connected!"
 msgstr "Устройство не подключено."
 
-#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
-#: tags/trackorganiser.cpp:456
+#: devices/actiondialog.cpp:517 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:478 tags/tageditor.cpp:890
+#: tags/trackorganiser.cpp:488
 msgid "Device is busy?"
 msgstr "Устройство занято?"
 
-#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:519 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "Устройство было изменено?"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:586
 msgid "Clearing unused folders"
 msgstr "Очищение неиспользуемых папок"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "Рассчитать ReplayGain для скопированных с диска треков?"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "ReplyGain"
 msgstr "ReplyGain"
 
-#: devices/actiondialog.cpp:578
+#: devices/actiondialog.cpp:602
 msgid "Calculate"
 msgstr "Рассчитать"
 
-#: devices/actiondialog.cpp:634
-msgid "The destination filename already exists!<hr/>%1"
+#: devices/actiondialog.cpp:661
+#, fuzzy
+msgid "The destination filename already exists!"
 msgstr "Целевой файл уже существует.<hr/>%1"
 
-#: devices/actiondialog.cpp:637
-msgid "Song already exists!<hr/>%1"
+#: devices/actiondialog.cpp:664
+#, fuzzy
+msgid "Song already exists!"
 msgstr "Песня уже существует<hr/>%1"
 
-#: devices/actiondialog.cpp:640
-msgid "Song does not exist!<hr/>%1"
+#: devices/actiondialog.cpp:667
+#, fuzzy
+msgid "Song does not exist!"
 msgstr "Песня не существует<hr/>%1"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:670
+#, fuzzy
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
-"permissions.<hr/>%1"
+"permissions."
 msgstr "Сбой создания целевой папки.<br/>Проверьте необходимые права.<hr/>%1"
 
-#: devices/actiondialog.cpp:646
-msgid "Source file no longer exists?<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:673
+#, fuzzy
+msgid "Source file no longer exists?"
 msgstr "Исходный файл больше не существует?<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:649
-msgid "Failed to copy.<hr/>%1"
+#: devices/actiondialog.cpp:676
+#, fuzzy
+msgid "Failed to copy."
 msgstr "Сбой копирования.<hr/>%1"
 
-#: devices/actiondialog.cpp:650
-msgid "Failed to delete.<hr/>%1"
+#: devices/actiondialog.cpp:676
+#, fuzzy
+msgid "Failed to delete."
 msgstr "Сбой удаления.<hr/>%1"
 
-#: devices/actiondialog.cpp:653
-msgid "Not connected to device.<hr/>%1"
+#: devices/actiondialog.cpp:679
+#, fuzzy
+msgid "Not connected to device."
 msgstr "Не подключено к устройству.<hr/>%1"
 
-#: devices/actiondialog.cpp:656
-msgid "Selected codec is not available.<hr/>%1"
+#: devices/actiondialog.cpp:682
+#, fuzzy
+msgid "Selected codec is not available."
 msgstr "Выбранный кодек недоступен.<hr/>%1"
 
-#: devices/actiondialog.cpp:659
-msgid "Transcoding failed.<br/><br/<hr/>%1"
-msgstr "Сбой перекодирования.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:685
+#, fuzzy
+msgid "Transcoding failed."
+msgstr "Перекодирование"
 
-#: devices/actiondialog.cpp:662
+#: devices/actiondialog.cpp:688
+#, fuzzy
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
-"devices.)<hr/>%1"
+"devices.)"
 msgstr ""
 "Сбой создания временного файла.<br/>(Требуется для перекодирования на MTP "
 "устройства)<hr/>%1"
 
-#: devices/actiondialog.cpp:665
-msgid "Failed to read source file.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:691
+#, fuzzy
+msgid "Failed to read source file."
 msgstr "Сбой чтения исходного файла.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:668
-msgid "Failed to write to destination file.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:694
+#, fuzzy
+msgid "Failed to write to destination file."
 msgstr "Сбой записи в целевой файл.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:671
-msgid "No space left on device.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:697
+#, fuzzy
+msgid "No space left on device."
 msgstr "Недостаточно места на устройстве.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:674
-msgid "Failed to update metadata.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:700
+#, fuzzy
+msgid "Failed to update metadata."
 msgstr "Сбой обновления метаданных<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:677
-msgid "Failed to download track.<br/><br/<hr/>%1"
-msgstr "Сбой загрузки трека.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:703
+#, fuzzy
+msgid "Failed to download track."
+msgstr "Сбой загрузки"
 
-#: devices/actiondialog.cpp:680
-msgid "Failed to lock device.<hr/>%1"
+#: devices/actiondialog.cpp:706
+#, fuzzy
+msgid "Failed to lock device."
 msgstr "Сбой блокирования устройства.<hr/>%1"
 
-#: devices/actiondialog.cpp:709
+#: devices/actiondialog.cpp:735
 msgid "Local Music Library Properties"
 msgstr "Свойства локальной музыкальной библиотеки"
 
-#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
-msgid "<b>Error</b><br/>"
-msgstr "<b>Ошибка</b><br/>"
+#: devices/actiondialog.cpp:776 devices/actiondialog.cpp:790
+#: support/messagebox.cpp:108 support/messagebox.cpp:114
+#: support/messagebox.h:62
+msgid "Error"
+msgstr "Ошибка"
 
-#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:780 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Skip"
 msgstr "Пропустить"
 
-#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:781 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Auto Skip"
 msgstr "Авто-пропуск"
 
-#: devices/actiondialog.cpp:759
+#: devices/actiondialog.cpp:785
 msgid "Retry"
 msgstr "Повторить"
 
-#: devices/actiondialog.cpp:774
-msgid ""
-"<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
-"td></tr>"
-msgstr ""
-"<tr><td align=\"right\">Исполнитель:</td><td>%1</td></tr><tr><td align="
-"\"right\">Альбом:</td><td>%2</td></tr><tr><td align=\"right\">Трек:</td><td>"
-"%3</td></tr>"
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#: devices/actiondialog.cpp:801 gui/searchpage.cpp:203 po/rc.cpp:374
+#: po/rc.cpp:953 rc.cpp:374 rc.cpp:953
+msgid "Album:"
+msgstr "Альбом:"
 
-#: devices/actiondialog.cpp:781
-msgid ""
-"<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
-"\"right\">Destination file:</td><td>%2</td></tr>"
+#. i18n: file: tags/tageditor.ui:25
+#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
+#: devices/actiondialog.cpp:802 po/rc.cpp:938 rc.cpp:938
+msgid "Track:"
+msgstr "Трек:"
+
+#: devices/actiondialog.cpp:806
+msgid "Source file:"
 msgstr ""
-"<tr><td align=\"right\">Исходный файл:</td><td>%1</td></tr><tr><td align="
-"\"right\">Целевой файл:</td><td>%2</td></tr>"
 
-#: devices/actiondialog.cpp:786
-msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
-msgstr "<tr><td align=\"right\">Файл:</td><td>%1</td></tr>"
+#: devices/actiondialog.cpp:807
+#, fuzzy
+msgid "Destination file:"
+msgstr "Целевой формат:"
+
+#: devices/actiondialog.cpp:809 gui/searchpage.cpp:207
+#, fuzzy
+msgid "File:"
+msgstr "&Файл"
 
-#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
-#: gui/cachesettings.cpp:230
+#: devices/actiondialog.cpp:815 gui/cachesettings.cpp:179
+#: gui/cachesettings.cpp:235
 msgid "Calculating..."
 msgstr "Вычисление..."
 
-#: devices/actiondialog.cpp:799
+#: devices/actiondialog.cpp:822
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (примерно)"
 
-#: devices/actiondialog.cpp:802
-msgid ""
-"<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
-"i></tr>"
+#: devices/actiondialog.cpp:824
+msgid "Time remaining:"
 msgstr ""
-"<tr><i><td align=\"right\"><i>Осталось времени:</i></td><td><i>%5</i></td></"
-"i></tr>"
 
-#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: devices/actiondialog.cpp:847 devices/fsdevice.cpp:762
 #: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "Сохранение кеша"
 
-#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
+#: devices/albumdetailsdialog.cpp:139 devices/albumdetailsdialog.cpp:236
+#: tags/tageditor.cpp:158 tags/tageditor.cpp:373
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "Применить обходное решение «несколько исполнителей»"
 
-#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
+#: devices/albumdetailsdialog.cpp:140 devices/albumdetailsdialog.cpp:260
+#: tags/tageditor.cpp:159 tags/tageditor.cpp:418
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "Откатить обходное решение «несколько исполнителей»"
 
-#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
-#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
+#: devices/albumdetailsdialog.cpp:141 devices/albumdetailsdialog.cpp:278
+#: tags/tageditor.cpp:161 tags/tageditor.cpp:499
 msgid "Capitalize"
 msgstr "Перевести в верхний режим"
 
-#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
-#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
+#: devices/albumdetailsdialog.cpp:142 devices/albumdetailsdialog.cpp:295
+#: tags/tageditor.cpp:162 tags/tageditor.cpp:528
 msgid "Adjust Track Numbers"
 msgstr "Настроить номера треков"
 
-#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
+#: devices/albumdetailsdialog.cpp:144 tags/tageditor.cpp:156
 msgid "Tools"
 msgstr "Инструменты"
 
-#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:369
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "Применить обходное решение «несколько исполнителей»?"
 
-#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
+#: devices/albumdetailsdialog.cpp:234 tags/tageditor.cpp:371
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -578,11 +653,11 @@ msgstr ""
 "«Несколько исполнителей» и значение «Название» на \"TrackArtist - TrackTitle"
 "\"</i>"
 
-#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:411
 msgid "Revert \"Various Artists\" workaround"
 msgstr "Откатить обходное решение «несколько исполнителей»"
 
-#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
+#: devices/albumdetailsdialog.cpp:255 tags/tageditor.cpp:413
 msgid ""
 "<i>Where the 'Album artist' is the same as 'Artist' and the 'Title' is of "
 "the format \"TrackArtist - TrackTitle\", 'Artist' will be taken from 'Title' "
@@ -597,38 +672,28 @@ msgstr ""
 "\"Wibble - Wobble\", тогда «Исполнитель» будет иметь значение «Wibble», а "
 "«Название» — «Wobble»</i>"
 
-#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
+#: devices/albumdetailsdialog.cpp:261 tags/tageditor.cpp:419
 msgid "Revert"
 msgstr "Откатить"
 
-#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
+#: devices/albumdetailsdialog.cpp:277 tags/tageditor.cpp:497
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr ""
 "Первая буква в значениях «Название», «Исполнитель», «Исполнитель альбома» и "
 "«Альбом» будет заглавной."
 
-#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
+#: devices/albumdetailsdialog.cpp:295 tags/tageditor.cpp:529
 msgid "Adjust track number by:"
 msgstr "Настроить номера треков по:"
 
-#: devices/albumdetailsdialog.cpp:335 devices/cddbinterface.cpp:143
-#: devices/deviceoptions.cpp:358 devices/musicbrainz.cpp:202
-#: devices/musicbrainz.cpp:324 gui/mainwindow.cpp:1771 gui/mainwindow.cpp:1784
-#: models/musiclibraryitemroot.cpp:362 models/musiclibraryitemroot.cpp:520
-#: models/playqueuemodel.cpp:325 mpd/mpdparseutils.cpp:249
-#: mpd/mpdparseutils.cpp:409 mpd/song.cpp:228 mpd/song.cpp:233
-#: mpd/song.cpp:272 mpd/song.cpp:299 widgets/groupedview.cpp:260
-msgid "Unknown"
-msgstr "Неизвестно"
-
 #: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "Чтение диска"
 
-#: devices/audiocddevice.cpp:353 gui/mainwindow.cpp:2199
-#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
-#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
+#: devices/audiocddevice.cpp:358 gui/mainwindow.cpp:2345
+#: gui/searchpage.cpp:220 models/albumsmodel.cpp:245 models/musicmodel.cpp:217
+#: models/playlistsmodel.cpp:309 models/playlistsmodel.cpp:324
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "%1 трек (%2)"
@@ -653,7 +718,7 @@ msgid "Failed to open CD device"
 msgstr "Сбой открытия устройства CD"
 
 #: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
-#: devices/musicbrainz.cpp:217
+#: devices/musicbrainz.cpp:216
 msgid "Track %1"
 msgstr "Трек %1"
 
@@ -673,19 +738,19 @@ msgstr "Ошибка CDDB: %1"
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr "Найдено несколько совпадений. Выберите релевантный ниже:"
 
-#. i18n: file: devices/albumdetails.ui:170
+#. i18n: file: devices/albumdetails.ui:163
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:66
-#: models/playqueuemodel.cpp:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
-#: rc.cpp:82
+#: models/playqueuemodel.cpp:106 po/rc.cpp:113 replaygain/rgdialog.cpp:128
+#: rc.cpp:113
 msgid "Artist"
 msgstr "Исполнитель"
 
-#. i18n: file: devices/albumdetails.ui:175
+#. i18n: file: devices/albumdetails.ui:168
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:76
-#: models/playqueuemodel.cpp:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
-#: rc.cpp:85
+#: models/playqueuemodel.cpp:105 po/rc.cpp:116 replaygain/rgdialog.cpp:130
+#: rc.cpp:116
 msgid "Title"
 msgstr "Название"
 
@@ -764,7 +829,7 @@ msgstr ""
 "данные исполнителя из тега «Название» и удалить имя исполнителя из тега "
 "«Название»</p>"
 
-#: devices/devicepropertieswidget.cpp:99
+#: devices/devicepropertieswidget.cpp:98
 msgid ""
 "<p>If you enable this, then Cantata will create a cache of the device's "
 "music library. This will help to speed up subsequent library scans (as the "
@@ -782,19 +847,19 @@ msgstr ""
 "на значок «обновить» в списке устройств. Файл кеша буде удалён, а содержимое "
 "устройства будет просканировано заново.</p>"
 
-#: devices/devicepropertieswidget.cpp:204
+#: devices/devicepropertieswidget.cpp:209
 msgid "Do not transcode"
 msgstr "Не перекодировать"
 
-#: devices/devicepropertieswidget.cpp:212
+#: devices/devicepropertieswidget.cpp:216
 msgid "Encoder"
 msgstr "Кодировщик"
 
-#: devices/devicepropertieswidget.cpp:228
+#: devices/devicepropertieswidget.cpp:231
 msgid "Transcode to %1"
 msgstr "Перекодировать в %1"
 
-#: devices/devicepropertieswidget.cpp:259
+#: devices/devicepropertieswidget.cpp:262
 msgctxt "name (size free)"
 msgid "%1 (%2 free)"
 msgstr "%1 (%2 свободно)"
@@ -807,11 +872,11 @@ msgstr "Скопировать в библиотеку"
 msgid "Sync"
 msgstr "Синхронизировать"
 
-#: devices/devicespage.cpp:71
+#: devices/devicespage.cpp:70
 msgid "Forget Device"
 msgstr "Исключить устройство"
 
-#: devices/devicespage.cpp:114 devices/remotedevicepropertiesdialog.cpp:60
+#: devices/devicespage.cpp:113 devices/remotedevicepropertiesdialog.cpp:60
 msgid "Add Device"
 msgstr "Добавить устройство"
 
@@ -820,7 +885,7 @@ msgid "Lookup album and track details?"
 msgstr "Произвести поиск подробной информациидля альбома и трека?"
 
 #: devices/devicespage.cpp:433 devices/devicespage.cpp:445
-#: devices/devicespage.cpp:455
+#: devices/devicespage.cpp:455 gui/mainwindow.cpp:589
 msgid "Refresh"
 msgstr "Обновить"
 
@@ -850,8 +915,8 @@ msgstr "Частично"
 msgid "Full"
 msgstr "Полностью"
 
-#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
-#: gui/librarypage.cpp:257
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:213 gui/folderpage.cpp:269
+#: gui/librarypage.cpp:256
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -879,11 +944,11 @@ msgstr "Точно отключить <b>%1</b>?"
 msgid "Disconnect"
 msgstr "Отключить"
 
-#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1220
 msgid "Please close other dialogs first."
 msgstr "Сначала необходимо закрыть другие диалоги."
 
-#: devices/encoders.cpp:77
+#: devices/encoders.cpp:78
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -899,7 +964,7 @@ msgstr ""
 "качество звука, чем MP3 при аналогичном битрейте. Это разумный выбор для "
 "iPod и некоторых других портативных плееров."
 
-#: devices/encoders.cpp:82
+#: devices/encoders.cpp:83
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>AAC</b> encoder used by Cantata supports a <a "
@@ -932,22 +997,22 @@ msgstr ""
 "с</b> могут приводить к неудовлетворительному качеству. Значения больше "
 "<b>200 кбит/с</b> обычно излишни."
 
-#: devices/encoders.cpp:100 devices/encoders.cpp:140
+#: devices/encoders.cpp:101 devices/encoders.cpp:141
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr ""
 "Ожидаемое среднее значение битрейта для кодирования переменного битрейта."
 
-#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
-#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:293 devices/encoders.cpp:329
 msgid "Smaller file"
 msgstr "Меньший размер файла"
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:233 devices/encoders.cpp:329
+#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
+#: devices/encoders.cpp:234 devices/encoders.cpp:330
 msgid "Better sound quality"
 msgstr "Лучшее качество звука"
 
-#: devices/encoders.cpp:119
+#: devices/encoders.cpp:120
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -963,7 +1028,7 @@ msgstr ""
 "любительского хранения аудио, и широко поддерживается портативными "
 "музыкальными плеерами."
 
-#: devices/encoders.cpp:123
+#: devices/encoders.cpp:124
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>MP3</b> encoder used by Cantata supports a <a "
@@ -993,11 +1058,11 @@ msgstr ""
 "с</b> могут приводить к неудовлетворительному качеству. Значения больше "
 "<b>205 кбит/с</b> обычно излишни."
 
-#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
+#: devices/encoders.cpp:156 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:158
+#: devices/encoders.cpp:159
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1013,7 +1078,7 @@ msgstr ""
 "аналогичномили более высоком качестве.Ogg Vorbis — отличный и универсальный "
 "выбор, особенно для поддерживающих его портативных плееров."
 
-#: devices/encoders.cpp:163
+#: devices/encoders.cpp:164
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Vorbis</b> encoder used by Cantata supports a "
@@ -1050,15 +1115,15 @@ msgstr ""
 "могут приводить к неудовлетворительному качеству. Значения больше <b>-q8</b> "
 "обычно излишни."
 
-#: devices/encoders.cpp:183
+#: devices/encoders.cpp:184
 msgid "Quality rating"
 msgstr "Рейтинг по качеству"
 
-#: devices/encoders.cpp:200
+#: devices/encoders.cpp:201
 msgid "Opus"
 msgstr ""
 
-#: devices/encoders.cpp:203
+#: devices/encoders.cpp:204
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1067,7 +1132,7 @@ msgid ""
 "patent-free digital audio codec using a form of lossy data compression."
 msgstr ""
 
-#: devices/encoders.cpp:205
+#: devices/encoders.cpp:206
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Opus</b> encoder used by Cantata supports a <a "
@@ -1084,28 +1149,28 @@ msgid ""
 msgstr ""
 "Битрейт — это мера количества информации, используемой для представления "
 "одной секунды звукового трека.<br>Кодер <b>Opus</b>, используемый в Cantata, "
-"имеет поддержку <a href=http://en.wikipedia.org/wiki/Variable_bitrate>"
-"переменного "
-"битрейта (VBR)</a>, что означает, что битрейт может колебаться на протяжении "
-"трека в зависимости от сложности звукового содержимого. Более сложные "
-"временные периоды трека кодируются с бо́льшим битрейтом, чем более простые. "
-"Этот подход позволяет достигнуть лучшего соотношения качества звука и "
-"размера файла по сравнению с использованием постоянного битрейта.<br>Поэтому "
-"битрейт, устанавливаемый этим ползунком — это только оценочное значение "
-"среднего битрейта кодируемого трека. <br>Битрейт, равный <b>128 кбит/с</b> — "
-"хороший выбор для прослушивания музыки на портативном плеере.<br/>Значения "
-"меньше <b>100 кбит/с</b> могут приводить к неудовлетворительному качеству "
-"музыки. Значения больше <b>256 кбит/с</b> обычно излишни."
-
-#: devices/encoders.cpp:222 devices/encoders.cpp:319
+"имеет поддержку <a href=http://en.wikipedia.org/wiki/"
+"Variable_bitrate>переменного битрейта (VBR)</a>, что означает, что битрейт "
+"может колебаться на протяжении трека в зависимости от сложности звукового "
+"содержимого. Более сложные временные периоды трека кодируются с бо́льшим "
+"битрейтом, чем более простые. Этот подход позволяет достигнуть лучшего "
+"соотношения качества звука и размера файла по сравнению с использованием "
+"постоянного битрейта.<br>Поэтому битрейт, устанавливаемый этим ползунком — "
+"это только оценочное значение среднего битрейта кодируемого трека. "
+"<br>Битрейт, равный <b>128 кбит/с</b> — хороший выбор для прослушивания "
+"музыки на портативном плеере.<br/>Значения меньше <b>100 кбит/с</b> могут "
+"приводить к неудовлетворительному качеству музыки. Значения больше <b>256 "
+"кбит/с</b> обычно излишни."
+
+#: devices/encoders.cpp:223 devices/encoders.cpp:320
 msgid "Bitrate"
 msgstr "Битрейт"
 
-#: devices/encoders.cpp:241
+#: devices/encoders.cpp:242
 msgid "Apple Lossless"
 msgstr "Apple Lossless"
 
-#: devices/encoders.cpp:244
+#: devices/encoders.cpp:245
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1120,11 +1185,11 @@ msgstr ""
 "только для музыкальных плееров компании Apple и плееров, не поддерживающих "
 "формат FLAC."
 
-#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:260 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:262
+#: devices/encoders.cpp:263
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1139,7 +1204,7 @@ msgstr ""
 "цифрового аудио без потерь.<br>FLAC  — прекрасный выбор для тех, кто хочет "
 "хранить музыку, не экономя на качестве."
 
-#: devices/encoders.cpp:266
+#: devices/encoders.cpp:267
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1166,19 +1231,19 @@ msgstr ""
 "незначительно уменьшают размер файла по сравнению с более низкими уровнями "
 "сжатия, и поэтому не рекомендуются."
 
-#: devices/encoders.cpp:281
+#: devices/encoders.cpp:282
 msgid "Compression level"
 msgstr "Уровень сжатия"
 
-#: devices/encoders.cpp:291
+#: devices/encoders.cpp:292
 msgid "Faster compression"
 msgstr "Быстрое сжатие"
 
-#: devices/encoders.cpp:298
+#: devices/encoders.cpp:299
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:301
+#: devices/encoders.cpp:302
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1193,7 +1258,7 @@ msgstr ""
 "для сжатия аудио (с потерями).<br>Рекомендуется только для портативных "
 "аудиопроигрывателей, не поддерживающих Ogg Vorbis."
 
-#: devices/encoders.cpp:305
+#: devices/encoders.cpp:306
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>Due to the limitations of the proprietary <b>WMA</b> "
@@ -1219,178 +1284,112 @@ msgstr ""
 "неудовлетворительному качеству музыки, а значения <b>182кбит/с</b> просто "
 "излишни."
 
-#: devices/filenameschemedialog.cpp:33
+#: devices/filenameschemedialog.cpp:34
 msgid "Filename Scheme"
 msgstr "Схема имён файлов"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:62
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "Несколько исполнителей"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:63
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Wibble"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:64
 msgctxt "Example composer"
 msgid "Vivaldi"
 msgstr "Чайковский"
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:65
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "Now 5001"
 
-#: devices/filenameschemedialog.cpp:56
+#: devices/filenameschemedialog.cpp:66
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "Wobble"
 
-#: devices/filenameschemedialog.cpp:57
+#: devices/filenameschemedialog.cpp:67
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Дэнс"
 
-#: devices/filenameschemedialog.cpp:101
+#: devices/filenameschemedialog.cpp:121
 msgid ""
 "<p>The following variables will be replaced with their corresponding meaning "
 "for each track name.</p>"
 msgstr ""
-"<p>Следующие переменные будут заменены соответствующими названиями "
-"для каждого трека.</p>"
+"<p>Следующие переменные будут заменены соответствующими названиями для "
+"каждого трека.</p>"
 
-#: devices/filenameschemedialog.cpp:103
+#: devices/filenameschemedialog.cpp:123
+#, fuzzy
 msgid ""
-"<tr><th><em>Button</em></th><th><em>Variable</em></th><th><em>Description</"
+"<tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</"
 "em></th></tr>"
 msgstr ""
 "<tr><th><em>Кнопка</em></th><th><em>Переменная</em></th><th><em>Описание</"
 "em></th></tr>"
 
-#: devices/filenameschemedialog.cpp:104
-msgid ""
-"<tr><td>%albumartist%</td><td>%1</td><td>The artist of the album. For most "
-"albums, this will be the same as the <i>Track Artist.</i> For compilations, "
-"this will often be <i>Various Artists.</i> </td></tr>"
-msgstr ""
-"<tr><td>%albumartist%</td><td>%1</td><td>Исполнитель альбома. Для большинства "
-"альбомов это значение будет равно <i>Исполнителю трека.</i> Для сборников "
-"чаще "
-"всего это будет <i>Несколько исполнителей.</i> </td></tr>"
-
-#: devices/filenameschemedialog.cpp:106
-msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
-msgstr "<tr><td>%album%</td><td>%1</td><td>Название альбома.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:107
-msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
-msgstr "<tr><td>%composer%</td><td>%1</td><td>Автор музыки.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:108
-msgid "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
-msgstr ""
-"<tr><td>%artist%</td><td>%1</td><td>Исполнитель каждого трека.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:109
-msgid ""
-"<tr><td>%title%</td><td>%1</td><td>The track title (without <i>Track Artist</"
-"i>).</td></tr>"
-msgstr ""
-"<tr><td>%title%</td><td>%1</td><td>Название трека (без <i>Исполнителя "
-"трека</i>).</td></tr>"
-
-#: devices/filenameschemedialog.cpp:110
-msgid ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>The track title (with <i>Track "
-"Artist</i>, if different to <i>Album Artist</i>).</td></tr>"
-msgstr ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>Название трека (с <i>Исполнителем "
-"трека</i>, если оно не равно <i>Исполнителю альбома</i>).</td></tr>"
-
-#: devices/filenameschemedialog.cpp:111
-msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
-msgstr "<tr><td>%track%</td><td>%1</td><td>Номер трека.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:112
-msgid ""
-"<tr><td>%discnumber%</td><td>%1</td><td>The album number of a multi-album "
-"album. Often compilations consist of several albums.</td></tr>"
-msgstr ""
-"<tr><td>%discnumber%</td><td>%1</td><td>Номер альбома в сборнике из "
-"нескольких альбомов. Такие сборники встречаются довольно часто.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:113
-msgid ""
-"<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></tr>"
-msgstr "<tr><td>%year%</td><td>%1</td><td>Год выхода альбома.</td></tr>"
-
-#: devices/filenameschemedialog.cpp:114
-msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
-msgstr "<tr><td>%genre%</td><td>%1</td><td>Жанр альбома.</td></tr>"
-
-#: devices/fsdevice.cpp:668
+#: devices/fsdevice.cpp:675 gui/albumspage.cpp:287 gui/folderpage.cpp:304
+#: gui/librarypage.cpp:414
 msgid "Updating..."
 msgstr "Обновление..."
 
-#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: devices/fsdevice.cpp:757 online/onlineservice.cpp:94
 #: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "Чтение кеша"
 
-#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
+#: devices/fsdevice.cpp:769 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
 
-#: devices/mtpdevice.cpp:137
+#: devices/mtpdevice.cpp:153
 msgid "Connecting to device..."
 msgstr "Подключение к устройству..."
 
-#: devices/mtpdevice.cpp:139 devices/mtpdevice.cpp:161
+#: devices/mtpdevice.cpp:155 devices/mtpdevice.cpp:202
 msgid "No devices found"
 msgstr "Устройства не обнаружены"
 
-#: devices/mtpdevice.cpp:173
+#: devices/mtpdevice.cpp:217
 msgid "Connected to device"
 msgstr "Подключено к устройству"
 
-#: devices/mtpdevice.cpp:183
+#: devices/mtpdevice.cpp:230
 msgid "Disconnected from device"
 msgstr "Отключено от устройства"
 
-#: devices/mtpdevice.cpp:250
+#: devices/mtpdevice.cpp:304
 msgid "Updating folders..."
 msgstr "Обновление папок..."
 
-#: devices/mtpdevice.cpp:257
+#: devices/mtpdevice.cpp:320
 msgid "Updating files..."
 msgstr "Обновление файлов..."
 
-#: devices/mtpdevice.cpp:262 devices/remotefsdevice.cpp:465
-#: devices/remotefsdevice.cpp:485
+#: devices/mtpdevice.cpp:334 devices/remotefsdevice.cpp:461
+#: devices/remotefsdevice.cpp:481
 msgid "Updating tracks..."
 msgstr "Обновление треков..."
 
-#: devices/mtpdevice.cpp:281 devices/mtpdevice.cpp:383
-#: models/musiclibraryitemroot.cpp:78 models/musiclibraryitemroot.cpp:117
-#: models/musiclibraryitemroot.cpp:171 models/musiclibraryitemroot.cpp:833
-#: models/musiclibraryitemroot.cpp:1012 mpd/song.cpp:371
-msgid "Various Artists"
-msgstr "Несколько исполнителей"
-
-#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
-#: models/devicesmodel.cpp:140
+#: devices/mtpdevice.cpp:1619 devices/remotefsdevice.cpp:564
+#: devices/umsdevice.cpp:100 gui/initialsettingswizard.cpp:57
+#: models/devicesmodel.cpp:157
 msgid "Not Connected"
 msgstr "Не подключено"
 
-#: devices/musicbrainz.cpp:320
+#: devices/musicbrainz.cpp:319
 msgid "%1 (Disc %2)"
 msgstr "%1 (диск %2)"
 
-#: devices/musicbrainz.cpp:408
+#: devices/musicbrainz.cpp:407
 msgid "No matches found in MusicBrainz"
 msgstr "Совпадений в MusicBrainz не найдено."
 
@@ -1398,7 +1397,7 @@ msgstr "Совпадений в MusicBrainz не найдено."
 msgid "Connection"
 msgstr "Соединение"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:261
 msgid "Music Library"
 msgstr "Музыкальная библиотека"
 
@@ -1426,31 +1425,31 @@ msgstr "Secure Shell (sshfs)"
 msgid "Locally Mounted Folder"
 msgstr "Локально смонтированная папка"
 
-#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:612
+#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:608
 msgid "Available"
 msgstr "Доступно"
 
-#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:610
+#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:606
 msgid "Not Available"
 msgstr "Недоступно"
 
-#: devices/remotefsdevice.cpp:315
+#: devices/remotefsdevice.cpp:313
 msgid "Failed to resolve connection details for %1"
 msgstr "Сбой определения подробностей подключения для %1"
 
-#: devices/remotefsdevice.cpp:330 devices/remotefsdevice.cpp:345
-#: devices/remotefsdevice.cpp:403
+#: devices/remotefsdevice.cpp:328 devices/remotefsdevice.cpp:343
+#: devices/remotefsdevice.cpp:399
 msgid "Connecting..."
 msgstr "Соединение..."
 
-#: devices/remotefsdevice.cpp:358
+#: devices/remotefsdevice.cpp:356
 msgid ""
 "Password prompting does not work when cantata is started from the "
 "commandline."
 msgstr ""
 "Запрос паролей не работает, если cantata была запущена из командной строки."
 
-#: devices/remotefsdevice.cpp:379
+#: devices/remotefsdevice.cpp:375
 msgid ""
 "No suitable ssh-askpass application installed! This is required for entering "
 "passwords."
@@ -1458,50 +1457,50 @@ msgstr ""
 "Требуемое приложение ssh-askpass не установлено. Оно необходимо для ввода "
 "паролей."
 
-#: devices/remotefsdevice.cpp:386
+#: devices/remotefsdevice.cpp:382
 msgid "Mount point (\"%1\") is not empty!"
 msgstr "Точка монтирования («%1») не пуста."
 
-#: devices/remotefsdevice.cpp:398
+#: devices/remotefsdevice.cpp:394
 msgid "\"sshfs\" is not installed!"
 msgstr "«sshfs» не установлен"
 
-#: devices/remotefsdevice.cpp:426 devices/remotefsdevice.cpp:446
+#: devices/remotefsdevice.cpp:422 devices/remotefsdevice.cpp:442
 msgid "Disconnecting..."
 msgstr "Отключение..."
 
-#: devices/remotefsdevice.cpp:440
+#: devices/remotefsdevice.cpp:436
 msgid "\"fusermount\" is not installed!"
 msgstr "«fusermount» не установлен"
 
-#: devices/remotefsdevice.cpp:461 devices/remotefsdevice.cpp:482
+#: devices/remotefsdevice.cpp:457 devices/remotefsdevice.cpp:478
 msgid "Failed to connect to \"%1\""
 msgstr "Сбой подключения к «%1»"
 
-#: devices/remotefsdevice.cpp:462 devices/remotefsdevice.cpp:497
+#: devices/remotefsdevice.cpp:458 devices/remotefsdevice.cpp:493
 msgid "Failed to disconnect from \"%1\""
 msgstr "Сбой отключения от «%1»"
 
-#: devices/remotefsdevice.cpp:573
+#: devices/remotefsdevice.cpp:569
 msgid "Capacity Unknown"
 msgstr "Ёмкость неизвестна"
 
-#. i18n: file: gui/coverdialog.ui:30
+#. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (text), widget (QPushButton, search)
-#: devices/synccollectionwidget.cpp:53 gui/stdactions.cpp:92
-#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
+#: devices/synccollectionwidget.cpp:54 gui/mainwindow.cpp:323
+#: online/podcastsearchdialog.cpp:334 po/rc.cpp:404 rc.cpp:404
 msgid "Search"
 msgstr "Поиск"
 
-#: devices/synccollectionwidget.cpp:62
+#: devices/synccollectionwidget.cpp:63
 msgid "Check Items"
 msgstr "Отметить элементы"
 
-#: devices/synccollectionwidget.cpp:64
+#: devices/synccollectionwidget.cpp:65
 msgid "Uncheck Items"
 msgstr "Сбросить отмеченные элементы"
 
-#: devices/synccollectionwidget.cpp:266
+#: devices/synccollectionwidget.cpp:272
 msgid "Nothing selected"
 msgstr "Ничего не выбрано"
 
@@ -1525,7 +1524,7 @@ msgstr "Синхронизировать"
 msgid "Device and library are in sync."
 msgstr "Устройство и библиотека синхронизированы"
 
-#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:190
+#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:188
 msgid "Not Scanned"
 msgstr "Не просканировано"
 
@@ -1533,15 +1532,15 @@ msgstr "Не просканировано"
 msgid " (recommended)"
 msgstr " (рекомендуется)"
 
-#: dynamic/dynamic.cpp:208
+#: dynamic/dynamic.cpp:215
 msgid "Start Dynamic Playlist"
 msgstr "Запустить динамический плейлист"
 
-#: dynamic/dynamic.cpp:209
+#: dynamic/dynamic.cpp:216
 msgid "Stop Dynamic Mode"
 msgstr "Остановить динамический режим"
 
-#: dynamic/dynamic.cpp:257
+#: dynamic/dynamic.cpp:264
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "%1 правило"
@@ -1549,77 +1548,77 @@ msgstr[1] "%1 правила"
 msgstr[2] "%1 правил"
 msgstr[3] "%1 правило"
 
-#: dynamic/dynamic.cpp:396
+#: dynamic/dynamic.cpp:403
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr "Для работы динамического режима необходимо установить «perl»."
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:410
 msgid "Failed to locate rules file - %1"
 msgstr "Сбой нахождения файла правил — %1"
 
-#: dynamic/dynamic.cpp:411
+#: dynamic/dynamic.cpp:418
 msgid "Failed to remove previous rules file - %1"
 msgstr "Сбой удаления предыдущего файла правил — %1"
 
-#: dynamic/dynamic.cpp:416
+#: dynamic/dynamic.cpp:423
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "Сбой установки файла правил — %1 -> %2"
 
-#: dynamic/dynamic.cpp:729
+#: dynamic/dynamic.cpp:736
 msgid "Dynamizer has been terminated."
 msgstr "Dynamizer был завершён"
 
-#: dynamic/dynamic.cpp:816
+#: dynamic/dynamic.cpp:823 mpd/mpdconnection.cpp:150
 msgid "Uknown"
 msgstr "Неизвестно"
 
-#: dynamic/dynamic.cpp:818
+#: dynamic/dynamic.cpp:825
 msgid "Loading list of rules"
 msgstr "Загрузка списка правил"
 
-#: dynamic/dynamic.cpp:819
+#: dynamic/dynamic.cpp:826
 msgid "Saving rule"
 msgstr "Сохранение правила"
 
-#: dynamic/dynamic.cpp:820
+#: dynamic/dynamic.cpp:827
 msgid "Deleting rule"
 msgstr "Удаление правила"
 
-#: dynamic/dynamic.cpp:821
+#: dynamic/dynamic.cpp:828
 msgid "Setting active rule"
 msgstr "Установка активного правила"
 
-#: dynamic/dynamic.cpp:822
+#: dynamic/dynamic.cpp:829
 msgid "Stopping dynamizer"
 msgstr "Остановка Dynamizer"
 
-#: dynamic/dynamic.cpp:823
+#: dynamic/dynamic.cpp:830
 msgid "Requesting ID details"
 msgstr "Запрос деталей ID"
 
-#: dynamic/dynamic.cpp:826
+#: dynamic/dynamic.cpp:833
 msgid "Awaiting response for previous command. (%1)"
 msgstr "Ожидание ответа на предыдущую команду (%1)"
 
-#: dynamic/dynamic.cpp:981
+#: dynamic/dynamic.cpp:988
 msgid "Dynamizer is not active"
 msgstr "Dynamizer не активен"
 
-#: dynamic/dynamic.cpp:989
+#: dynamic/dynamic.cpp:996
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "Сбой получения списка динамических правил (%1)"
 
-#: dynamic/dynamic.cpp:1020
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to delete rules file. (%1)"
 msgstr "Сбой удаления файла правил (%1)"
 
-#: dynamic/dynamic.cpp:1027
+#: dynamic/dynamic.cpp:1034
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Сбой проверки состояния dynamizer. (%1)"
 
-#: dynamic/dynamic.cpp:1036
+#: dynamic/dynamic.cpp:1043
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "Сбой установки текущих динамических правил (%1)"
 
@@ -1635,11 +1634,11 @@ msgstr "Добавить динамические правила"
 msgid "Edit Dynamic Rules"
 msgstr "Изменить динамические правила"
 
-#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:151
+#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:150
 msgid "Remove Dynamic Rules"
 msgstr "Удалить динамические правила"
 
-#: dynamic/dynamicpage.cpp:150
+#: dynamic/dynamicpage.cpp:149
 msgid ""
 "Are you sure you wish to remove the selected rules?\n"
 "This cannot be undone."
@@ -1653,16 +1652,16 @@ msgstr "Динамическое правило"
 
 #. i18n: file: dynamic/dynamicrules.ui:53
 #. i18n: ectx: property (text), widget (QPushButton, addBtn)
-#: dynamic/dynamicruledialog.cpp:136 po/rc.cpp:280 rc.cpp:280
+#: dynamic/dynamicruledialog.cpp:145 po/rc.cpp:341 rc.cpp:341
 msgid "Add"
 msgstr "Добавить"
 
-#: dynamic/dynamicruledialog.cpp:202
+#: dynamic/dynamicruledialog.cpp:211
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr ""
 "<i><b>ОШИБКА</b>: значение «с года» должно быть меньше значения «до года»</i>"
 
-#: dynamic/dynamicruledialog.cpp:205
+#: dynamic/dynamicruledialog.cpp:214
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1677,27 +1676,27 @@ msgstr "SimilarArtists"
 msgid "AlbumArtist"
 msgstr "AlbumArtist"
 
-#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: file: devices/filenameschemedialog.ui:102
 #. i18n: ectx: property (text), widget (QPushButton, composer)
-#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:212 rc.cpp:212
 msgid "Composer"
 msgstr "Автор музыки"
 
-#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:48
+#: models/playqueuemodel.cpp:107 replaygain/rgdialog.cpp:129
 msgid "Album"
 msgstr "Альбом"
 
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:106
-#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:112
+#: po/rc.cpp:254 po/rc.cpp:380 rc.cpp:254 rc.cpp:380
 msgid "Genre"
 msgstr "Жанр"
 
@@ -1771,33 +1770,35 @@ msgstr "Перезаписать правила"
 msgid "Saving %1"
 msgstr "Сохранение %1"
 
-#: gui/cachesettings.cpp:168
+#: gui/cachesettings.cpp:173
 msgid "Deleting..."
 msgstr "Удаление..."
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Name"
 msgstr "Имя"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Item Count"
 msgstr "Количество элементов"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Space Used"
 msgstr "Используемое пространство"
 
-#: gui/cachesettings.cpp:234
+#: gui/cachesettings.cpp:239
 msgid "Total space used: %1"
 msgstr "Всего использовано места на диске: %1"
 
-#: gui/cachesettings.cpp:245
+#: gui/cachesettings.cpp:250
+#, fuzzy
 msgid ""
-"To speed up loading of the music library, Cantata caches a local copy of the "
-"MPD listing. Cantata might also have cached covers, or lyrics, if these have "
-"been downloaded and could not be saved into the MPD folder (because Cantata "
-"cannot access it, or you have configured Cantata to not save these items "
-"there). Below is a summary of Cantata's cache usage."
+"Cantata caches a local copy of the MPD listing to speed up loading of the "
+"music library. Cantata might also have cached covers, lyrics, or artist "
+"images, if these have been downloaded and could not be saved into the MPD "
+"folder (because Cantata cannot access it, or you have configured Cantata to "
+"not save these items there). Below is a summary of Cantata's current cache "
+"usage."
 msgstr ""
 "Чтобы ускорить загрузку музыкальной библиотеки, Cantata кеширует локальную "
 "копию реестра MPD. Cantata также может кешировать обложки или слова песен, "
@@ -1806,53 +1807,53 @@ msgstr ""
 "сохранять там эти элементы). Использование кеша программой Cantata описано "
 "ниже."
 
-#: gui/cachesettings.cpp:257
+#: gui/cachesettings.cpp:263
 msgid "Covers"
 msgstr "Обложки"
 
-#: gui/cachesettings.cpp:258
+#: gui/cachesettings.cpp:264
+#, fuzzy
+msgid "Scaled Covers"
+msgstr "Обложки"
+
+#: gui/cachesettings.cpp:265
 msgid "Backdrops"
 msgstr "Художественное оформление"
 
-#: gui/cachesettings.cpp:263 gui/interfacesettings.cpp:167
-#: gui/mainwindow.cpp:283 gui/preferencesdialog.cpp:85
-#: widgets/groupedview.cpp:256
-msgid "Streams"
-msgstr "Потоки"
+#: gui/cachesettings.cpp:271
+#, fuzzy
+msgid "Stream Listings"
+msgstr "Настройки потоков"
 
-#: gui/cachesettings.cpp:264
+#: gui/cachesettings.cpp:274
 msgid "Jamendo"
 msgstr "Jamendo"
 
-#: gui/cachesettings.cpp:265
+#: gui/cachesettings.cpp:275
 msgid "Magnatune"
 msgstr "Magnatune"
 
-#: gui/cachesettings.cpp:266
+#: gui/cachesettings.cpp:276
 msgid "Podcast Directories"
 msgstr "Каталоги подкастов"
 
-#: gui/cachesettings.cpp:273
+#: gui/cachesettings.cpp:285
 msgid "Delete All"
 msgstr "Удалить всё"
 
-#: gui/cachesettings.cpp:312
+#: gui/cachesettings.cpp:324
 msgid "Delete all '%1' items?"
 msgstr "Удалить все «%1» объектов?"
 
-#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
+#: gui/cachesettings.cpp:325 gui/cachesettings.cpp:335
 msgid "Delete Cache Items"
 msgstr "Удалить элементы кеша"
 
-#: gui/cachesettings.cpp:322
+#: gui/cachesettings.cpp:334
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr "<p>Удалить всё из следующего?<ul>%1</ul></p>"
 
-#: gui/coverdialog.cpp:151 gui/main.cpp:231
-msgid "Last.fm"
-msgstr "Last.fm"
-
-#: gui/coverdialog.cpp:165
+#: gui/coverdialog.cpp:124
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1863,53 +1864,43 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:184
-msgctxt ""
-"Google\n"
-"width x height (file size)"
-msgid ""
-"Google\n"
-"%1 x %2 (%3)"
-msgstr ""
-"Google\n"
-"%1 x %2 (%3)"
-
-#: gui/coverdialog.cpp:204
+#: gui/coverdialog.cpp:126
+#, fuzzy
 msgctxt ""
-"Discogs\n"
+"name\n"
 "width x height"
 msgid ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 msgstr ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:238
-msgctxt ""
-"Current Cover\n"
-"width x height"
-msgid ""
-"Current Cover\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:162
+#, fuzzy
+msgid "Current Cover"
 msgstr ""
 "Текущая обложка\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:256
+#: gui/coverdialog.cpp:211 gui/coverdialog.cpp:411
+msgid "CoverArt Archive"
+msgstr ""
+
+#: gui/coverdialog.cpp:242
 msgid "Image"
 msgstr "Изображение"
 
-#: gui/coverdialog.cpp:259
+#: gui/coverdialog.cpp:245
 msgid "Downloading..."
 msgstr "Загружается..."
 
-#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
+#: gui/coverdialog.cpp:290 gui/coverdialog.cpp:325
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "Изображение (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:446
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
@@ -1917,7 +1908,7 @@ msgstr ""
 "<p>Изображение для этого исполнителя уже существует, и файл недоступен для "
 "записи.<p></p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:433
+#: gui/coverdialog.cpp:447
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
@@ -1925,13 +1916,17 @@ msgstr ""
 "<p>Обложка для этого альбома уже существует, и файл недоступен для записи."
 "<p></p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:440 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:234
-msgctxt "Album by Artist"
-msgid "%1 by %2"
-msgstr "%1 исполняет %2"
+#: gui/coverdialog.cpp:452
+#, fuzzy
+msgid "'%1' Artist Image"
+msgstr "%1 исполнителей"
+
+#: gui/coverdialog.cpp:454
+msgctxt "'Artist - Album' Album Cover"
+msgid "'%1 - %2' Album Cover"
+msgstr ""
 
-#: gui/coverdialog.cpp:579
+#: gui/coverdialog.cpp:582
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1939,27 +1934,23 @@ msgstr ""
 "Сбой настройки обложки\n"
 "Не удалось сохранить во временный файл."
 
-#: gui/coverdialog.cpp:607
+#: gui/coverdialog.cpp:616
 msgid "Failed to download image!"
 msgstr "Сбой загрузки изображения."
 
-#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
+#: gui/coverdialog.cpp:875 gui/coverdialog.cpp:877
 msgid "Load Local Cover"
 msgstr "Загрузить локальную обложку"
 
-#: gui/coverdialog.cpp:795
-msgid "Images (*.png *.jpg)"
-msgstr "Изображения (*.png *.jpg)"
-
-#: gui/coverdialog.cpp:800
+#: gui/coverdialog.cpp:882
 msgid "File is already in list!"
 msgstr "Файл уже в списке."
 
-#: gui/coverdialog.cpp:804
+#: gui/coverdialog.cpp:886
 msgid "Failed to read image!"
 msgstr "Сбой чтения изображения"
 
-#: gui/coverdialog.cpp:817
+#: gui/coverdialog.cpp:899
 msgid "Display"
 msgstr "Экран"
 
@@ -1971,12 +1962,12 @@ msgstr "Экран"
 #. i18n: ectx: property (text), widget (QPushButton, removeBtn)
 #. i18n: file: streams/streamssettings.ui:73
 #. i18n: ectx: property (text), widget (QPushButton, removeButton)
-#: gui/coverdialog.cpp:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
-#: rc.cpp:286 rc.cpp:765
+#: gui/coverdialog.cpp:900 gui/stdactions.cpp:90 po/rc.cpp:347 po/rc.cpp:917
+#: rc.cpp:347 rc.cpp:917
 msgid "Remove"
 msgstr "Удалить"
 
-#: gui/coverdialog.cpp:1181
+#: gui/coverdialog.cpp:1333
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1984,7 +1975,7 @@ msgstr ""
 "Сбой настройки обложки\n"
 "Не удалось создать копию"
 
-#: gui/coverdialog.cpp:1190
+#: gui/coverdialog.cpp:1342
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1992,7 +1983,7 @@ msgstr ""
 "Сбой настройки обложки\n"
 "Не удалось создать резервную копию оригинала"
 
-#: gui/coverdialog.cpp:1239
+#: gui/coverdialog.cpp:1391
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -2000,163 +1991,256 @@ msgstr ""
 "Сбой настройки обложки\n"
 "Не удалось скопировать файл в «%1»"
 
-#: gui/folderpage.cpp:45
+#: gui/coverdialog.cpp:1449 models/onlineservicesmodel.cpp:157
+msgid "Searching..."
+msgstr "Идёт поиск..."
+
+#: gui/folderpage.cpp:44
 msgid "Open In File Manager"
 msgstr "Открыть в файловом менеджере"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Established"
 msgstr "Соединение установлено"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Failed"
 msgstr "Сбой подключения"
 
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
+#. i18n: file: support/shortcutssettingswidget.ui:78
+#. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
 #. i18n: file: support/shortcutssettingswidget.ui:78
 #. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
-#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
-#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
+#: gui/interfacesettings.cpp:48 gui/playbacksettings.cpp:46
+#: online/magnatuneservice.cpp:159 po/rc.cpp:6 po/rc.cpp:660 po/rc.cpp:751
+#: po/rc.cpp:778 po/rc.cpp:932 rc.cpp:6 rc.cpp:660 rc.cpp:751 rc.cpp:778
+#: rc.cpp:932
 msgid "None"
 msgstr "Нет"
 
-#: gui/interfacesettings.cpp:40
+#: gui/interfacesettings.cpp:49 gui/interfacesettings.cpp:160
 msgid "Small"
 msgstr "Маленький"
 
-#: gui/interfacesettings.cpp:41
+#: gui/interfacesettings.cpp:50
 msgid "Medium"
 msgstr "Средний"
 
-#: gui/interfacesettings.cpp:42
+#: gui/interfacesettings.cpp:51 gui/interfacesettings.cpp:159
 msgid "Large"
 msgstr "Большой"
 
-#: gui/interfacesettings.cpp:43
+#: gui/interfacesettings.cpp:52
 msgid "Extra Large"
 msgstr "Очень большой"
 
-#: gui/interfacesettings.cpp:48
+#: gui/interfacesettings.cpp:57
+msgid "Basic Tree (No Icons)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:58
 msgid "Simple Tree"
 msgstr "Простое дерево"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:59
 msgid "Detailed Tree"
 msgstr "Подробное дерево"
 
-#. i18n: file: gui/interfacesettings.ui:329
+#. i18n: file: gui/interfacesettings.ui:449
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
+#: gui/interfacesettings.cpp:61 po/rc.cpp:639 rc.cpp:639
 msgid "Grouped Albums"
 msgstr "Отсортированные альбомы"
 
-#: gui/interfacesettings.cpp:53
+#: gui/interfacesettings.cpp:63
 msgid "List"
 msgstr "Список"
 
-#: gui/interfacesettings.cpp:55
+#: gui/interfacesettings.cpp:65
 msgid "Icon/List"
 msgstr "Значок/список"
 
-#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+#. i18n: file: gui/interfacesettings.ui:454
+#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
+#: gui/interfacesettings.cpp:68 po/rc.cpp:642 rc.cpp:642
+msgid "Table"
+msgstr "Таблица"
+
+#: gui/interfacesettings.cpp:104
+#, fuzzy
+msgid "Play queue"
+msgstr "Проиграть очередь"
+
+#. i18n: file: gui/interfacesettings.ui:182
+#. i18n: ectx: attribute (title), widget (QWidget, tab)
+#: gui/interfacesettings.cpp:105 gui/mainwindow.cpp:307 po/rc.cpp:569
+#: rc.cpp:569
+msgid "Artists"
+msgstr "Исполнители"
+
+#: gui/interfacesettings.cpp:107 gui/interfacesettings.cpp:138
+#: gui/mainwindow.cpp:309
 msgid "Folders"
 msgstr "Папки"
 
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:337
+#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
+#: gui/interfacesettings.cpp:108 gui/mainwindow.cpp:310 po/rc.cpp:609
+#: rc.cpp:609
+msgid "Playlists"
+msgstr "Плейлисты"
+
+#: gui/interfacesettings.cpp:110
+#, fuzzy
+msgid "Dynamic Playlists"
+msgstr "Запустить динамический плейлист"
+
+#: gui/interfacesettings.cpp:114
+#, fuzzy
+msgid "Streams (e.g. Radio Stations)"
+msgstr "Настройки потоков"
+
+#: gui/interfacesettings.cpp:121
+msgid "Online Services - Jamendo, Maganatune, SoundCloud, and Podcasts"
+msgstr ""
+
+#: gui/interfacesettings.cpp:128
+msgid "Devices - UMS, MTP (e.g. Android), and AudioCDs"
+msgstr ""
+
+#: gui/interfacesettings.cpp:134
+msgid "Search (via MPD)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:135
+msgid "Info - Current song information (artist, album, and lyrics)"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#: gui/interfacesettings.cpp:165 gui/interfacesettings.cpp:168
-#: gui/interfacesettings.cpp:171 gui/interfacesettings.cpp:174 po/rc.cpp:472
-#: po/rc.cpp:491 po/rc.cpp:512 po/rc.cpp:536 rc.cpp:472 rc.cpp:491 rc.cpp:512
-#: rc.cpp:536
+#: gui/interfacesettings.cpp:139 po/rc.cpp:554 po/rc.cpp:572 po/rc.cpp:591
+#: po/rc.cpp:612 po/rc.cpp:636 rc.cpp:554 rc.cpp:572 rc.cpp:591 rc.cpp:612
+#: rc.cpp:636
 msgid "Style:"
 msgstr "Стиль:"
 
-#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
-#: gui/preferencesdialog.cpp:89
-msgid "Online"
-msgstr "Онлайн"
+#: gui/interfacesettings.cpp:161
+msgid "Tab-bar"
+msgstr ""
 
-#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
-msgid "Devices"
-msgstr "Устройства"
+#: gui/interfacesettings.cpp:162
+msgid "Left"
+msgstr ""
 
-#: gui/interfacesettings.cpp:178
-msgid "Grouped by 'Album Artist'"
-msgstr "Отсортировано по «Исполнителю альбома»"
+#: gui/interfacesettings.cpp:162
+msgid "Right"
+msgstr ""
 
-#: gui/interfacesettings.cpp:179
-msgid "Grouped under 'Various Artists'"
-msgstr "Отсортировано по «Нескольким исполнителям»"
+#: gui/interfacesettings.cpp:163
+#, fuzzy
+msgid "Top"
+msgstr "Верхняя панель"
+
+#: gui/interfacesettings.cpp:164
+#, fuzzy
+msgid "Bottom"
+msgstr "Нижняя панель"
+
+#: gui/interfacesettings.cpp:391
+#, fuzzy
+msgid "System default"
+msgstr "Использовать параметры по умолчанию"
 
-#: gui/main.cpp:213 gui/mainwindow.cpp:1941 gui/trayitem.cpp:98
-#: gui/trayitem.cpp:100 gui/trayitem.cpp:135 gui/trayitem.cpp:199
-#: gui/trayitem.cpp:209 gui/trayitem.cpp:212 gui/trayitem.cpp:215
-#: gui/trayitem.cpp:228 gui/trayitem.cpp:230
+#: gui/main.cpp:224 gui/mainwindow.cpp:2075 gui/trayitem.cpp:112
+#: gui/trayitem.cpp:118 gui/trayitem.cpp:153 gui/trayitem.cpp:217
+#: gui/trayitem.cpp:227 gui/trayitem.cpp:230 gui/trayitem.cpp:233
+#: gui/trayitem.cpp:246 gui/trayitem.cpp:248
 msgid "Cantata"
 msgstr "Cantata"
 
-#: gui/main.cpp:214
+#: gui/main.cpp:225
 msgid "A KDE client for MPD"
 msgstr "Клиент KDE для MPD"
 
-#: gui/main.cpp:216
-msgid "Copyright (c) 2011–2013 Craig Drummond"
-msgstr "(c)Крейг Драммонд (Craig Drummond), 2011-2013"
+#: gui/main.cpp:227
+msgid "© 2011-2014 Craig Drummond"
+msgstr ""
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Craig Drummond"
 msgstr "Крейг Драммонд"
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Maintainer"
 msgstr "Сопровождающий"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "Piotr Wicijowski"
 msgstr "Пётр Вичиёвски (Piotr Wicijowski)"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "UI Improvements"
 msgstr "Улучшения интерфейса"
 
-#: gui/main.cpp:222
+#: gui/main.cpp:233
 msgid "Sander Knopper"
 msgstr "Сандер Кноппер (Sander Knopper)"
 
-#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
+#: gui/main.cpp:233 gui/main.cpp:234 gui/main.cpp:235 gui/main.cpp:236
 msgid "QtMPC author"
 msgstr "Автор QtMPC"
 
-#: gui/main.cpp:223
+#: gui/main.cpp:234
 msgid "Roeland Douma"
 msgstr "Рёленд Доума (Roeland Douma)"
 
-#: gui/main.cpp:224
+#: gui/main.cpp:235
 msgid "Daniel Selinger"
 msgstr "Дэниэль Селинджер (Daniel Selinger)"
 
-#: gui/main.cpp:225
+#: gui/main.cpp:236
 msgid "Armin Walland"
 msgstr "Армин Волленд (Armin Walland)"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
@@ -2164,101 +2248,105 @@ msgstr ""
 "Художественное оформление контекстного вида (не забудьте выложить свой фан-"
 "арт на музыкальные темы на сайте fanart.tv)."
 
-#: gui/main.cpp:230
+#: gui/main.cpp:238
 msgid "Wikipedia"
 msgstr "Wikipedia"
 
-#: gui/main.cpp:230 gui/main.cpp:231
+#: gui/main.cpp:238 gui/main.cpp:239
 msgid "Context view metadata"
 msgstr "Метаданные контекстного вида."
 
-#: gui/main.cpp:235
+#: gui/main.cpp:239
+msgid "Last.fm"
+msgstr "Last.fm"
+
+#: gui/main.cpp:243
 msgid "URL to open"
 msgstr "Адрес URL"
 
-#: gui/mainwindow.cpp:238
+#: gui/mainwindow.cpp:269
 msgid "Quit"
 msgstr "Выход"
 
-#: gui/mainwindow.cpp:242
+#: gui/mainwindow.cpp:273
 msgid "Show Window"
 msgstr "Показать окно"
 
 #. i18n: file: gui/initialsettingswizard.ui:469
 #. i18n: ectx: property (text), widget (QPushButton, connectButton)
-#: gui/mainwindow.cpp:245 po/rc.cpp:418 rc.cpp:418
+#: gui/mainwindow.cpp:276 po/rc.cpp:482 rc.cpp:482
 msgid "Connect"
 msgstr "Подключиться"
 
-#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
+#: gui/mainwindow.cpp:277 gui/preferencesdialog.cpp:83
 msgid "Collection"
 msgstr "Коллекция"
 
-#: gui/mainwindow.cpp:247
+#: gui/mainwindow.cpp:278
 msgid "Outputs"
 msgstr "Выводы"
 
-#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
+#: gui/mainwindow.cpp:279 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "Остановить после трека"
 
-#: gui/mainwindow.cpp:249
+#: gui/mainwindow.cpp:280
 msgid "Add To Stored Playlist"
 msgstr "Добавить в сохраняемый плейлист"
 
-#: gui/mainwindow.cpp:250
+#: gui/mainwindow.cpp:281
 msgid "Remove From Play Queue"
 msgstr "Удалить из очереди"
 
-#: gui/mainwindow.cpp:251
+#: gui/mainwindow.cpp:282
 msgid "Copy Track Info"
 msgstr "Скопировать инфо трека"
 
-#: gui/mainwindow.cpp:252
+#: gui/mainwindow.cpp:283
 msgid "Crop"
 msgstr "Обрезать"
 
-#: gui/mainwindow.cpp:253
+#: gui/mainwindow.cpp:284
 msgid "Shuffle Tracks"
 msgstr "Треки в случайном порядке"
 
-#: gui/mainwindow.cpp:254
+#: gui/mainwindow.cpp:285
 msgid "Shuffle Albums"
 msgstr "Альбомы в случайном порядке"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:286
 msgid "Add Stream URL"
 msgstr "Добавить URL потока"
 
-#: gui/mainwindow.cpp:256
+#: gui/mainwindow.cpp:287
 msgid "Clear"
 msgstr "Очистить"
 
-#: gui/mainwindow.cpp:257
+#: gui/mainwindow.cpp:288
 msgid "Expanded Interface"
 msgstr "Расширенный интерфейс"
 
-#: gui/mainwindow.cpp:258
+#: gui/mainwindow.cpp:289
 msgid "Show Current Song Information"
 msgstr "Показать инфо текущей песни"
 
-#: gui/mainwindow.cpp:261
+#: gui/mainwindow.cpp:292
 msgid "Full Screen"
 msgstr "Полный экран"
 
-#: gui/mainwindow.cpp:263
+#: gui/mainwindow.cpp:294
 msgid "Random"
 msgstr "Случайно"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:295
 msgid "Repeat"
 msgstr "Повтор"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid "Single"
 msgstr "Одиночный"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
@@ -2266,118 +2354,121 @@ msgstr ""
 "«Одиночный» режим: воспроизведение останавливается после текущей песни, или, "
 "в случае активного режима «Повтор», текущая песня повторяется"
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid "Consume"
 msgstr "Поглощение"
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
 msgstr ""
 "Режим «Поглощение»: песня удаляется из очереди после того, как была проиграна"
 
-#: gui/mainwindow.cpp:267
-msgid "Search Play Queue"
-msgstr "Искать в очереди"
-
-#: gui/mainwindow.cpp:269
+#: gui/mainwindow.cpp:298
 msgid "Set Priority"
 msgstr "Настроить приоритет"
 
-#: gui/mainwindow.cpp:271
+#: gui/mainwindow.cpp:300
 msgid "Play Stream"
 msgstr "Воспроизводить поток"
 
-#: gui/mainwindow.cpp:273
+#: gui/mainwindow.cpp:302
 msgid "Locate In Library"
 msgstr "Найти в библиотеке"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:304
 msgid "Edit Song Tags"
 msgstr "Редактировать теги"
 
-#. i18n: file: gui/interfacesettings.ui:304
+#. i18n: file: gui/interfacesettings.ui:429
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
+#: gui/mainwindow.cpp:306 po/rc.cpp:633 rc.cpp:633
 msgid "Play Queue"
 msgstr "Проиграть очередь"
 
-#. i18n: file: gui/interfacesettings.ui:27
-#. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
-msgid "Artists"
-msgstr "Исполнители"
-
-#. i18n: file: gui/interfacesettings.ui:202
-#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
-#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
-msgid "Playlists"
-msgstr "Плейлисты"
-
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:312
 msgid "Dynamic"
 msgstr "Динамический"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:315 gui/preferencesdialog.cpp:89
+#: widgets/groupedview.cpp:251
+msgid "Streams"
+msgstr "Потоки"
+
+#: gui/mainwindow.cpp:318 gui/preferencesdialog.cpp:94
+msgid "Online"
+msgstr "Онлайн"
+
+#: gui/mainwindow.cpp:321
+msgid "Devices"
+msgstr "Устройства"
+
+#: gui/mainwindow.cpp:324
 msgid "Expand All"
 msgstr "Развернуть всё"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:325
 msgid "Collapse All"
 msgstr "Свернуть всё"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:326
 msgid "Remove All Songs"
 msgstr "Удалить все песни"
 
-#: gui/mainwindow.cpp:398
+#: gui/mainwindow.cpp:456
 msgid "Info"
 msgstr "Инфо"
 
-#: gui/mainwindow.cpp:405
-msgid "Auto Hide"
-msgstr "Автоскрытие"
-
-#: gui/mainwindow.cpp:411
-msgid "Monochrome Icons"
-msgstr "Монохромные значки"
-
-#: gui/mainwindow.cpp:541
+#: gui/mainwindow.cpp:585
 msgid "Server information..."
 msgstr "Сведения о сервере..."
 
-#: gui/mainwindow.cpp:552
+#: gui/mainwindow.cpp:588
+msgid "Refresh Database"
+msgstr "Обновить базу данных"
+
+#: gui/mainwindow.cpp:602
 msgid "Configure Cantata..."
 msgstr "Настроить Cantata..."
 
-#: gui/mainwindow.cpp:559
+#: gui/mainwindow.cpp:612
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "О программе Cantata..."
 
-#: gui/mainwindow.cpp:571
+#: gui/mainwindow.cpp:624
 msgid "&File"
 msgstr "&Файл"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:628
+#, fuzzy
+msgid "&Edit"
+msgstr "Изменить"
+
+#: gui/mainwindow.cpp:631
 msgid "&Settings"
 msgstr "&Настройки"
 
-#: gui/mainwindow.cpp:589 support/dialog.cpp:97
+#: gui/mainwindow.cpp:646 support/dialog.cpp:81
 msgid "&Help"
 msgstr "&Помощь"
 
-#: gui/mainwindow.cpp:948
+#: gui/mainwindow.cpp:1035
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
 "Не удалось найти песен, подходящих под правила динамического плейлиста."
 
-#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
+#: gui/mainwindow.cpp:1157 mpd/mpdconnection.cpp:401
 msgid "Connecting to %1"
 msgstr "Подключение к %1"
 
-#: gui/mainwindow.cpp:1151
+#: gui/mainwindow.cpp:1189
+#, fuzzy
+msgid "Refresh MPD Database?"
+msgstr "Обновить базу данных"
+
+#: gui/mainwindow.cpp:1257
 msgid ""
 "Podcasts are currently being downloaded\n"
 "\n"
@@ -2387,35 +2478,35 @@ msgstr ""
 "\n"
 "Выход из программы отменит все загрузки."
 
-#: gui/mainwindow.cpp:1152
+#: gui/mainwindow.cpp:1258
 msgid "Abort downloads and quit"
 msgstr "Прервать загрузки и выйти"
 
-#: gui/mainwindow.cpp:1447
+#: gui/mainwindow.cpp:1577
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "О программе Cantata"
 
-#: gui/mainwindow.cpp:1448
+#: gui/mainwindow.cpp:1578
 msgctxt "Qt-only"
 msgid ""
-"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html"
-"\">GPLv3</a>"
+"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl."
+"html\">GPLv3</a>"
 msgstr ""
-"<b>Cantata %1</b><br/><br/>клиент MPD.<br/><br/>(c) Крейг Драммонд (Craig "
-"Drummond), 2011-2013.<br/>Выходит  на условиях лицензии <a href=\"http://www."
-"gnu.org/licenses/gpl.html\">GPLv3</a>"
+"<b>Cantata %1</b><br/><br/>клиент MPD.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Выходит  на условиях лицензии <a href=\"http://www.gnu.org/"
+"licenses/gpl.html\">GPLv3</a>"
 
-#: gui/mainwindow.cpp:1450
+#: gui/mainwindow.cpp:1580
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
-"QtMPC Authors<br/>"
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"The QtMPC Authors<br/>"
 msgstr ""
-"На базе <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> — (c)авторы QtMPC, "
+"На базе <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> — ©авторы QtMPC, "
 "2007-2010<br/>"
 
-#: gui/mainwindow.cpp:1451
+#: gui/mainwindow.cpp:1581
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
@@ -2424,7 +2515,7 @@ msgstr ""
 "Художественное оформление контекстного вида предоставлено сайтом <a href="
 "\"http://www.fanart.tv\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1452
+#: gui/mainwindow.cpp:1582
 msgctxt "Qt-only"
 msgid ""
 "Context view metadata courtesy of <a href=\"http://www.wikipedia.org"
@@ -2433,7 +2524,7 @@ msgstr ""
 "Метаданные контекстного вида предоставлены сайтами <a href=\"http://www."
 "wikipedia.org\">Wikipedia</a> и <a href=\"http://www.last.fm\">Last.fm</a>."
 
-#: gui/mainwindow.cpp:1453
+#: gui/mainwindow.cpp:1583
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
@@ -2441,24 +2532,28 @@ msgstr ""
 "Вы можете выкладывать ваши творческие работы на темы музыкального фан-арта "
 "на сайт <a href=\"http://www.fanart.tv\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1594
+#, fuzzy
 msgid ""
-"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Uptime:</td><td>%4</td></"
-"tr><tr><td align=\"right\">Time playing:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right"
+"\">Protocol version: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Uptime: </td><td>%4</td></tr><tr><td align=\"right"
+"\">Time playing: </td><td>%5</td></tr>"
 msgstr ""
 "<tr><td colspan=\"2\"><b>Сервер</b></td></tr><tr><td align=\"right\">Версия:"
 "</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Аптайм:</td><td>%4</td></"
 "tr><tr><td align=\"right\">Время звучания:</td><td>%5</td></tr>"
 
-#: gui/mainwindow.cpp:1472
+#: gui/mainwindow.cpp:1602
+#, fuzzy
 msgid ""
 "<tr><td colspan=\"2\"><b>Database</b></td></tr><tr><td align=\"right"
-"\">Artists:</td><td>%1</td></tr><tr><td align=\"right\">Albums:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Songs:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL handlers:</td><td>%4</td></tr><tr><td align=\"right\">Total "
-"duration:</td><td>%5</td></tr><tr><td align=\"right\">Last update:</td><td>"
-"%6</td></tr></table></p>"
+"\">Artists: </td><td>%1</td></tr><tr><td align=\"right\">Albums: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Songs: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Total duration: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Last update: </td><td>%6</td></tr></"
+"table></p>"
 msgstr ""
 "<tr><td colspan=\"2\"><b>База данных</b></td></tr><tr><td align=\"right"
 "\">Исполнителей:</td><td>%1</td></tr><tr><td align=\"right\">Альбомов:</"
@@ -2467,100 +2562,109 @@ msgstr ""
 "align=\"right\">Общая продолжительность:</td><td>%5</td></tr><tr><td align="
 "\"right\">Последнее обновление:</td><td>%6</td></tr></table></p>"
 
-#: gui/mainwindow.cpp:1481
+#: gui/mainwindow.cpp:1611
 msgid "Server Information"
 msgstr "Сведения о сервере"
 
-#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
+#: gui/mainwindow.cpp:1859 gui/mainwindow.cpp:1866
 msgid "Cantata (%1)"
 msgstr "Cantata (%1)"
 
-#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
+#: gui/mainwindow.cpp:1862 gui/mainwindow.cpp:1869
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: Cantata (%2)"
 
-#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
+#: gui/mainwindow.cpp:1863 gui/mainwindow.cpp:1870
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: Cantata"
 
-#: gui/mainwindow.cpp:1728
+#: gui/mainwindow.cpp:1874
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: Cantata (%3)"
 
-#: gui/mainwindow.cpp:1730
+#: gui/mainwindow.cpp:1876
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: Cantata"
 
-#: gui/mainwindow.cpp:1773
+#: gui/mainwindow.cpp:1919
 msgid "(Stream)"
 msgstr "(Поток)"
 
-#: gui/mainwindow.cpp:1775
+#: gui/mainwindow.cpp:1921
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
+#: gui/mainwindow.cpp:1939 widgets/groupedview.cpp:278
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1843
+#: gui/mainwindow.cpp:1989 mpd/mpdconnection.cpp:543 mpd/mpdconnection.cpp:550
 msgid "MPD reported the following error: %1"
 msgstr "MPD выдал следующую ошибку: %1"
 
-#: gui/mainwindow.cpp:1990
+#: gui/mainwindow.cpp:2119
 msgid "Remove all songs from play queue?"
 msgstr "Удалить все песни из очереди?"
 
-#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
+#: gui/mainwindow.cpp:2210 models/playqueuemodel.cpp:113
 msgid "Priority"
 msgstr "Приоритет"
 
-#: gui/mainwindow.cpp:2080
+#: gui/mainwindow.cpp:2210
 msgid "Enter priority (0..255):"
 msgstr "Введите приоритет (0..255):"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Playlist Name"
 msgstr "Имя плейлиста"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Enter a name for the playlist:"
 msgstr "Введите имя плейлиста:"
 
-#: gui/mainwindow.cpp:2106
+#: gui/mainwindow.cpp:2236
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr "Плейлист с именем <b>%1</b> уже существует<br/>Добавить к нему?"
 
-#: gui/mainwindow.cpp:2107
+#: gui/mainwindow.cpp:2237
 msgid "Existing Playlist"
 msgstr "Существующие плейлисты"
 
-#: gui/playbacksettings.cpp:42
-msgid "Do not fadeout"
-msgstr "Без затухания"
+#: gui/mainwindow.cpp:2303
+#, fuzzy
+msgid "Stream URL"
+msgstr "Добавить URL потока"
 
-#: gui/playbacksettings.cpp:43
-msgid " ms"
-msgstr " мс"
+#: gui/mainwindow.cpp:2303
+msgid "Enter URL of stream:"
+msgstr ""
+
+#: gui/mainwindow.cpp:2306
+msgid "Invalid, or unsupported, URL!"
+msgstr ""
+
+#: gui/mainwindow.cpp:2889
+msgid "Can only edit tags of songs within MPD's music collection."
+msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:165
+#. i18n: file: devices/albumdetails.ui:158
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
-#: gui/playbacksettings.cpp:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
-#: rc.cpp:79
+#: gui/playbacksettings.cpp:47 models/playqueuemodel.cpp:108 po/rc.cpp:110
+#: rc.cpp:110
 msgid "Track"
 msgstr "Трек"
 
-#: gui/playbacksettings.cpp:51
+#: gui/playbacksettings.cpp:49
 msgid "Auto"
 msgstr "Авто"
 
-#: gui/playbacksettings.cpp:164
+#: gui/playbacksettings.cpp:161
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
@@ -2568,9 +2672,9 @@ msgstr ""
 "<i>Подключено к %1<br/>Элементы ниже относятся к текущей подключённой "
 "коллекции MPD.</i>"
 
-#. i18n: file: gui/playbacksettings.ui:26
+#. i18n: file: gui/playbacksettings.ui:114
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
+#: gui/playbacksettings.cpp:164 po/rc.cpp:769 rc.cpp:769
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
@@ -2578,7 +2682,7 @@ msgstr ""
 "<i>Не подключено.<br/>Элементы ниже нельзя изменять, т.к. Cantata не "
 "подключена к MPD.</i>"
 
-#: gui/playbacksettings.cpp:174
+#: gui/playbacksettings.cpp:171
 msgid ""
 "<p>Replay Gain is a proposed standard published in 2001 to normalize the "
 "perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It "
@@ -2602,11 +2706,20 @@ msgstr ""
 "режима воспроизведения громкость будет настроена с использованием тегов "
 "ReplayGain данного трека, иначе — используются теги альбома.</li></ul></p>"
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:95 widgets/playqueueview.cpp:160
+msgid "Stretch Columns To Fit Window"
+msgstr ""
+
+#: gui/playlistspage.cpp:146 tags/tageditor.cpp:828 tags/trackorganiser.cpp:72
 msgid "Rename"
 msgstr "Переименовывать"
 
-#: gui/playlistspage.cpp:190
+#: gui/playlistspage.cpp:147 models/playqueuemodel.cpp:156
+#, fuzzy
+msgid "Remove Duplicates"
+msgstr "Удалить плейлист"
+
+#: gui/playlistspage.cpp:309
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2614,115 +2727,175 @@ msgstr ""
 "Точно удалить выбранный плейлист?\n"
 "Эту операцию нельзя будет отменить."
 
-#: gui/playlistspage.cpp:191
+#: gui/playlistspage.cpp:310
 msgid "Remove Playlists"
 msgstr "Удалить плейлист"
 
-#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
+#: gui/playlistspage.cpp:330 gui/playlistspage.cpp:357
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr "Плейлист с именем <b>%1</b> уже существует.<br/>Перезаписать?"
 
-#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
+#: gui/playlistspage.cpp:331 gui/playlistspage.cpp:358
 msgid "Overwrite Playlist"
 msgstr "Перезаписать плейлист"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Rename Playlist"
 msgstr "Переименовать плейлист"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Enter new name for playlist:"
 msgstr "Новое имя плейлиста:"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/playlistspage.cpp:446
+msgid "Cannot add songs from '%1' to '%2'"
+msgstr ""
+
+#: gui/preferencesdialog.cpp:83
 msgid "Collection Settings"
 msgstr "Настройки коллекции"
 
-#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: file: gui/playbacksettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
+#: gui/preferencesdialog.cpp:84 po/rc.cpp:742 rc.cpp:742
 msgid "Playback"
 msgstr "Воспроизведение"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:84
 msgid "Playback Settings"
 msgstr "Настройки воспроизведения"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "Files"
 msgstr "Файлы"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "File Settings"
 msgstr "Настройки файлов"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface"
 msgstr "Интерфейс"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface Settings"
 msgstr "Настройки интерфейса"
 
-#: gui/preferencesdialog.cpp:85
+#: gui/preferencesdialog.cpp:89
 msgid "Streams Settings"
 msgstr "Настройки потоков"
 
-#: gui/preferencesdialog.cpp:89
+#: gui/preferencesdialog.cpp:94
 msgid "Online Providers"
 msgstr "Источники в сети"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context"
 msgstr "Контекст"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context View Settings"
 msgstr "Настройки внешнего вида контекста"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server"
 msgstr "Сервер HTTP"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server Settings"
 msgstr "Настройки сервера HTTP"
 
-#: gui/preferencesdialog.cpp:103
+#: gui/preferencesdialog.cpp:115
 msgid "Audio CD Settings"
 msgstr "Настройки аудио-CD"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgid "Proxy"
 msgstr "Прокси"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "Настройки прокси"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "Комбинации клавиш"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "Настройки комбинаций клавиш"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cache"
 msgstr "Кеш"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cached Items"
 msgstr "Кешированные элементы"
 
-#: gui/preferencesdialog.cpp:116
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#: gui/preferencesdialog.cpp:128 po/rc.cpp:53 po/rc.cpp:65 po/rc.cpp:410
+#: rc.cpp:53 rc.cpp:65 rc.cpp:410
 msgid "Configure"
 msgstr "Настройка"
 
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#: gui/searchpage.cpp:200 po/rc.cpp:89 po/rc.cpp:371 po/rc.cpp:950 rc.cpp:89
+#: rc.cpp:371 rc.cpp:950
+msgid "Composer:"
+msgstr "Автор музыки:"
+
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#: gui/searchpage.cpp:205 po/rc.cpp:95 po/rc.cpp:962 rc.cpp:95 rc.cpp:962
+msgid "Genre:"
+msgstr "Жанр:"
+
+#: gui/searchpage.cpp:206
+#, fuzzy
+msgid "Date:"
+msgstr "Дата"
+
+#: gui/searchpage.cpp:208
+msgid "Any:"
+msgstr ""
+
+#: gui/searchpage.cpp:215
+#, fuzzy
+msgid "No tracks found."
+msgstr "Устройства не обнаружены"
+
 #: gui/serversettings.cpp:87
 msgid ""
 "<i> This folder will also be used to locate music files for transferring to "
@@ -2747,8 +2920,8 @@ msgstr "Не используется"
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
-#: gui/serversettings.cpp:103 po/rc.cpp:208 po/rc.cpp:247 po/rc.cpp:705
-#: rc.cpp:208 rc.cpp:247 rc.cpp:705
+#: gui/serversettings.cpp:103 po/rc.cpp:269 po/rc.cpp:308 po/rc.cpp:857
+#: rc.cpp:269 rc.cpp:308 rc.cpp:857
 msgid "Host:"
 msgstr "Хост:"
 
@@ -2795,10 +2968,10 @@ msgid ""
 msgstr ""
 "<p>Имя файла (без расширения) для сохранения загруженных обложек.<br/>Если "
 "поле не заполнено, используется 'cover'.<br/><br/><i>%artist% будет заменён "
-"на значение исполнителя текущей песни, а %album% — на название альбома.</i><"
-"/p>"
+"на значение исполнителя текущей песни, а %album% — на название альбома.</i></"
+"p>"
 
-#: gui/serversettings.cpp:252
+#: gui/serversettings.cpp:257
 msgid ""
 "Which type of collection do you wish to connect to?<br/><ul><li>Standard - "
 "music collection may be shared, is on another machine, or is already setup</"
@@ -2810,81 +2983,65 @@ msgstr ""
 "уже настроена</li><li>Базовый — коллекция не является общим ресурсом, и "
 "Cantata настроит и будет управлятьэкземпляром MPD.</li></ul>"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Add Collection"
 msgstr "Добавить коллекцию"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Standard"
 msgstr "Стандартный"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Basic"
 msgstr "Базовый"
 
-#: gui/serversettings.cpp:297
+#: gui/serversettings.cpp:302
 msgid "Delete <b>%1</b>?"
 msgstr "Удалить <b>%1</b>?"
 
-#: gui/serversettings.cpp:298
+#: gui/serversettings.cpp:303
 msgid "Delete"
 msgstr "Удалить"
 
-#: gui/serversettings.cpp:336
+#: gui/serversettings.cpp:341
 msgid "New Collection %1"
 msgstr "Новая коллекция %1"
 
-#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
+#: gui/serversettings.cpp:357 mpd/mpdconnection.cpp:173
 msgid "Default"
 msgstr "По умолчанию"
 
-#: gui/shortcutssettingspage.cpp:74
+#: gui/shortcutssettingspage.cpp:76
 msgid "Multi-Media Keys"
 msgstr "Мультимедиа-клавиши"
 
-#: gui/shortcutssettingspage.cpp:80
+#: gui/shortcutssettingspage.cpp:82
 msgid "Do not use media keys to control Cantata"
 msgstr "Не использовать мультимедиа-клавиши для управления Cantata"
 
-#: gui/shortcutssettingspage.cpp:81
+#: gui/shortcutssettingspage.cpp:83 gui/shortcutssettingspage.cpp:97
 msgid "Use media keys to control Cantata"
 msgstr "Использовать мультимедиа-клавиши для управления Cantata"
 
-#: gui/shortcutssettingspage.cpp:84
+#: gui/shortcutssettingspage.cpp:86 gui/shortcutssettingspage.cpp:104
 msgid "Use media keys, as configured in desktop settings, to control Cantata"
 msgstr ""
-"Использовать мультимедиа-клавиши для управления Cantata, согласно "
-"настройкам рабочего стола"
+"Использовать мультимедиа-клавиши для управления Cantata, согласно настройкам "
+"рабочего стола"
 
-#: gui/shortcutssettingspage.cpp:85
+#: gui/shortcutssettingspage.cpp:87 gui/shortcutssettingspage.cpp:105
 msgid ""
 "Use media keys, as configured in GNOME/Unity settings, to control Cantata"
 msgstr ""
-"Использовать мультимедиа-клавиши для управления Cantata, согласно "
-"настройкам GNOME/Unity"
+"Использовать мультимедиа-клавиши для управления Cantata, согласно настройкам "
+"GNOME/Unity"
 
-#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
-#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+#: gui/shortcutssettingspage.cpp:90 gui/shortcutssettingspage.cpp:107
+#: online/onlineservicespage.cpp:99 streams/streamspage.cpp:99
+#: support/fancytabwidget.cpp:825
 msgid "Configure..."
 msgstr "Настроить..."
 
-#: gui/shortcutssettingspage.cpp:95
-msgid "Use media keys to control Cantata:"
-msgstr "Использовать мультимедиа-клавиши для управления Cantata:"
-
-#: gui/shortcutssettingspage.cpp:106
-msgid "Use media keys, as configured in desktop settings, to control Cantata:"
-msgstr ""
-"Использовать мультимедиа-клавиши для управления Cantata, согласно "
-"настройкам рабочего стола:"
-
-#: gui/shortcutssettingspage.cpp:107
-msgid ""
-"Use media keys, as configured in GNOME/Unity settings, to control Cantata:"
-msgstr ""
-"Использовать мультимедиа-клавиши для управления Cantata, согласно "
-"настройкам GNOME/Unity:"
-
 #: gui/stdactions.cpp:55
 msgid "Previous Track"
 msgstr "Предыдущий трек"
@@ -2957,7 +3114,7 @@ msgstr "Пользовательское значение приоритета..
 msgid "Add To Playlist"
 msgstr "Добавить в плейлист"
 
-#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:66
 msgid "Organize Files"
 msgstr "Систематизировать файлы"
 
@@ -2965,7 +3122,7 @@ msgstr "Систематизировать файлы"
 msgid "Edit Tags"
 msgstr "Редактировать теги"
 
-#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:106
 msgid "ReplayGain"
 msgstr "ReplayGain"
 
@@ -2978,88 +3135,89 @@ msgid "Set Image"
 msgstr "Указать изображение"
 
 #: gui/stdactions.cpp:88
-msgid "Refresh Database"
-msgstr "Обновить базу данных"
-
-#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "Назад"
 
-#: gui/trayitem.cpp:192
+#: gui/stdactions.cpp:91
+msgid "Find"
+msgstr ""
+
+#: gui/trayitem.cpp:210
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%1 на %2"
 
-#: gui/trayitem.cpp:193
+#: gui/trayitem.cpp:211
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%1 на %2 (%3)"
 
-#: gui/trayitem.cpp:195
+#: gui/trayitem.cpp:213
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%1 исполняет %2 на %3"
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:214
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr "%1 исполняет %2 на %3 (%4)"
 
-#: gui/trayitem.cpp:223
+#: gui/trayitem.cpp:241
 msgid "Now playing"
 msgstr "Проигрывается"
 
-#: http/httpserversettings.cpp:40
+#: http/httpserversettings.cpp:39
 msgid "Local loopback (%1)"
 msgstr "Локальная петля (%1)"
 
-#: http/httpserversettings.cpp:43
+#: http/httpserversettings.cpp:42
 msgid "Wired (%1)"
 msgstr "Проводное (%1)"
 
-#: http/httpserversettings.cpp:46
+#: http/httpserversettings.cpp:45
 msgid "Wireless (%1)"
 msgstr "Беспроводное (%1)"
 
-#: http/httpserversettings.cpp:53
+#: http/httpserversettings.cpp:52
 msgid "First active interface"
 msgstr "Первый активный интерфейс"
 
-#: http/httpserversettings.cpp:98
-msgid "Inactive"
-msgstr "Неактивно"
+#: models/albumsmodel.cpp:260 models/musicmodel.cpp:254
+msgctxt "Album by Artist"
+msgid "%1 by %2"
+msgstr "%1 исполняет %2"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:221
+#: models/musicmodel.cpp:133
 msgid "Cue Sheet"
 msgstr "Cue Sheet"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:220
+#: models/musicmodel.cpp:133
 msgid "Playlist"
 msgstr "Плейлист"
 
-#: models/devicesmodel.cpp:108
+#: models/devicesmodel.cpp:116
 msgid "Configure Device"
 msgstr "Настройка устройства"
 
-#: models/devicesmodel.cpp:109
+#: models/devicesmodel.cpp:117
 msgid "Refresh Device"
 msgstr "Обновить устройство"
 
-#: models/devicesmodel.cpp:110
+#: models/devicesmodel.cpp:118
 msgid "Connect Device"
 msgstr "Подключить устройство"
 
-#: models/devicesmodel.cpp:111
+#: models/devicesmodel.cpp:119
 msgid "Disconnect Device"
 msgstr "Отключить устройство"
 
-#: models/devicesmodel.cpp:113
+#: models/devicesmodel.cpp:121
 msgid "Edit CD Details"
 msgstr "Редактировать подробности CD"
 
-#: models/devicesmodel.cpp:690
+#: models/devicesmodel.cpp:730
 msgid "No Devices Attached"
 msgstr "Нет подключённых устройств"
 
@@ -3091,8 +3249,8 @@ msgstr "Вход выполнен (истекает: %1)"
 msgid "Session expired"
 msgstr "Время сеанса истекло"
 
-#: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
+#: models/dirviewmodel.cpp:204 models/dirviewmodel.cpp:212
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:696
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "1 элемент"
@@ -3100,17 +3258,17 @@ msgstr[1] "%1 элемента"
 msgstr[2] "%1 элементов"
 msgstr[3] "%1 элемент"
 
-#: models/dirviewmodel.cpp:190
+#: models/dirviewmodel.cpp:219
 msgid "Audio File"
 msgstr "Аудио-файл"
 
-#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
-#: models/musiclibraryitemroot.cpp:844
+#: models/musiclibraryitemartist.cpp:248 models/musiclibraryitemartist.cpp:261
+#: models/musiclibraryitemroot.cpp:840
 msgid "Single Tracks"
 msgstr "Отдельные треки"
 
-#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
-#: widgets/groupedview.cpp:366
+#: models/musicmodel.cpp:190 models/onlineservicesmodel.cpp:167
+#: widgets/groupedview.cpp:364
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "%1 трек"
@@ -3118,7 +3276,7 @@ msgstr[1] "%1 трека"
 msgstr[2] "%1 треков"
 msgstr[3] "%1 трек"
 
-#: models/musicmodel.cpp:185
+#: models/musicmodel.cpp:196
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "%1 исполнитель"
@@ -3126,7 +3284,7 @@ msgstr[1] "%1 исполнителя"
 msgstr[2] "%1 исполнителей"
 msgstr[3] "%1 исполнитель"
 
-#: models/musicmodel.cpp:192
+#: models/musicmodel.cpp:203
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "%1 альбом"
@@ -3134,7 +3292,7 @@ msgstr[1] "%1 альбома"
 msgstr[2] "%1 альбомов"
 msgstr[3] "%1 альбом"
 
-#: models/musicmodel.cpp:198
+#: models/musicmodel.cpp:209
 msgid "1 Episode"
 msgid_plural "%1 Episodes"
 msgstr[0] "%1 эпизод"
@@ -3144,44 +3302,40 @@ msgstr[3] "%1 эпизод"
 
 #. i18n: file: online/onlinesettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: models/onlineservicesmodel.cpp:83 po/rc.cpp:720 rc.cpp:720
+#: models/onlineservicesmodel.cpp:91 po/rc.cpp:872 rc.cpp:872
 msgid "Configure Service"
 msgstr "Настройка сервиса"
 
-#: models/onlineservicesmodel.cpp:84
+#: models/onlineservicesmodel.cpp:92
 msgid "Refresh Service"
 msgstr "Обновить сервис"
 
-#: models/onlineservicesmodel.cpp:85
+#: models/onlineservicesmodel.cpp:93
 msgid "Add Subscription"
 msgstr "Добавить подписку"
 
-#: models/onlineservicesmodel.cpp:86
+#: models/onlineservicesmodel.cpp:94
 msgid "Remove Subscription"
 msgstr "Удалить подписку"
 
-#: models/onlineservicesmodel.cpp:87
+#: models/onlineservicesmodel.cpp:95
 msgid "Refresh Subscription"
 msgstr "Обновить подписку"
 
-#: models/onlineservicesmodel.cpp:137
+#: models/onlineservicesmodel.cpp:145
 msgid "Last Search:%1"
 msgstr "Последний поисковый запрос:%1"
 
-#: models/onlineservicesmodel.cpp:149
-msgid "Searching..."
-msgstr "Идёт поиск..."
-
-#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
-#: models/streamsmodel.cpp:670
+#: models/onlineservicesmodel.cpp:160 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:691
 msgid "Not Loaded"
 msgstr "Не загружено"
 
-#: models/onlineservicesmodel.cpp:155
+#: models/onlineservicesmodel.cpp:163
 msgid "Use search to locate tracks"
 msgstr "Искать треки через поиск"
 
-#: models/onlineservicesmodel.cpp:166
+#: models/onlineservicesmodel.cpp:174
 msgid "1 Podcast"
 msgid_plural "%1 Podcasts"
 msgstr[0] "%1 подкаст"
@@ -3189,143 +3343,155 @@ msgstr[1] "%1 подкаста"
 msgstr[2] "%1 подкастов"
 msgstr[3] "%1 подкаст"
 
-#: models/onlineservicesmodel.cpp:177
+#: models/onlineservicesmodel.cpp:185
 msgid "(Downloading: %1%)"
 msgstr "(Идёт загрузка: %1%)"
 
-#: models/onlineservicesmodel.cpp:235
+#: models/onlineservicesmodel.cpp:243
 msgctxt "podcast name (num unplayed episodes)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: models/playlistsmodel.cpp:77
+#: models/playlistsmodel.cpp:105
 msgid "New Playlist..."
 msgstr "Новый плейлист..."
 
-#: models/playqueuemodel.cpp:102
-msgctxt "Track Number (#)"
-msgid "#"
-msgstr "#"
+#: models/playlistsmodel.cpp:321
+#, fuzzy
+msgid "Smart Playlist"
+msgstr "Плейлист"
 
-#: models/playqueuemodel.cpp:103
+#: models/playqueuemodel.cpp:109
 msgid "Length"
 msgstr "Длина"
 
-#: models/playqueuemodel.cpp:104
+#: models/playqueuemodel.cpp:110
 msgid "Disc"
 msgstr "Диск"
 
-#. i18n: file: devices/filenameschemedialog.ui:138
+#. i18n: file: devices/filenameschemedialog.ui:174
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
+#: models/playqueuemodel.cpp:111 po/rc.cpp:248 rc.cpp:248
 msgid "Year"
 msgstr "Год"
 
-#: models/playqueuemodel.cpp:360
+#: models/playqueuemodel.cpp:158
+msgid "Undo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:160
+msgid "Redo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:404
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(Приоритет: %1)</b>"
 
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:693
 msgid "Loading..."
 msgstr "Загрузка..."
 
-#: models/streamsmodel.cpp:286
+#: models/streamsmodel.cpp:302
 msgid "Bookmarks"
 msgstr "Закладки"
 
-#: models/streamsmodel.cpp:560
+#: models/streamsmodel.cpp:576
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:563
+#: models/streamsmodel.cpp:579
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:564
+#: models/streamsmodel.cpp:580
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:567
+#: models/streamsmodel.cpp:583
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:568
+#: models/streamsmodel.cpp:584
+msgid "Radio GFM"
+msgstr ""
+
+#: models/streamsmodel.cpp:585
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: models/streamsmodel.cpp:569
+#: models/streamsmodel.cpp:586
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:570
+#: models/streamsmodel.cpp:587
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:571
+#: models/streamsmodel.cpp:588
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:572
+#: models/streamsmodel.cpp:589
 msgid "Favorites"
 msgstr "Избранное"
 
-#: models/streamsmodel.cpp:573
+#: models/streamsmodel.cpp:590
 msgid "Listen Live"
 msgstr "Слушать трансляцию"
 
-#: models/streamsmodel.cpp:578
+#: models/streamsmodel.cpp:595
 msgid "Bookmark Category"
 msgstr "Категория закладки"
 
-#: models/streamsmodel.cpp:579
+#: models/streamsmodel.cpp:596
 msgid "Add Stream To Favorites"
 msgstr "Добавить поток в Избранное"
 
-#: models/streamsmodel.cpp:580
+#: models/streamsmodel.cpp:597
 msgid "Configure Streams"
 msgstr "Настройка потоков"
 
-#: models/streamsmodel.cpp:660
+#: models/streamsmodel.cpp:681
 msgid "%1 (Read-Only)"
 msgstr "%1 (только чтение)"
 
-#: models/streamsmodel.cpp:1241
+#: models/streamsmodel.cpp:1261
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr "Сбой сохранения списка потоков. Проверьте права на запись для %1"
 
-#: models/streamsmodel.cpp:1639
+#: models/streamsmodel.cpp:1659
 msgid "All"
 msgstr "Всё"
 
-#: mpd/mpdconnection.cpp:154
+#: mpd/mpdconnection.cpp:179
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "«%1»"
 
-#: mpd/mpdconnection.cpp:156
+#: mpd/mpdconnection.cpp:181
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr "«%1» (%2:%3)"
 
-#: mpd/mpdconnection.cpp:372 mpd/mpdconnection.cpp:415
-#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
-#: mpd/mpdconnection.cpp:1036
+#: mpd/mpdconnection.cpp:406 mpd/mpdconnection.cpp:451
+#: mpd/mpdconnection.cpp:501 mpd/mpdconnection.cpp:1137
+#: mpd/mpdconnection.cpp:1164
 msgid "Connection to %1 failed"
 msgstr "Сбой подключения к %1"
 
-#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
+#: mpd/mpdconnection.cpp:412 mpd/mpdconnection.cpp:455
 msgid "Connection to %1 failed - incorrect password"
 msgstr "Сбой подключения к %1 — неправильный пароль"
 
-#: mpd/mpdconnection.cpp:455
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to send command to %1 - not connected"
 msgstr "Сбой передачи команды для %1 — нет подключения"
 
-#: mpd/mpdconnection.cpp:491
+#: mpd/mpdconnection.cpp:539
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr "Сбой загрузки. Проверьте права на чтение для пользователя «mpd»."
 
-#: mpd/mpdconnection.cpp:493
+#: mpd/mpdconnection.cpp:541
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
@@ -3333,23 +3499,23 @@ msgstr ""
 "Сбой загрузки. MPD может проигрывать локальные файлы только при подключении "
 "к локальному сокету."
 
-#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
+#: mpd/mpdconnection.cpp:547 mpd/mpdconnection.cpp:558
 msgid "Failed to send command. Disconnected from %1"
 msgstr "Сбой передачи команды.  Отключено от %1."
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1306
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr "Сбой переименования <b>%1</b> в <b>%2</b>"
 
-#: mpd/mpdconnection.cpp:1183
+#: mpd/mpdconnection.cpp:1318
 msgid "Failed to save <b>%1</b>"
 msgstr "Сбой сохранения <b>%1</b>"
 
-#: mpd/mpdconnection.cpp:1196
+#: mpd/mpdconnection.cpp:1331
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr "Нельзя добавлять фрагменты файла cue sheet в плейлист."
 
-#: mpd/mpdconnection.cpp:1199
+#: mpd/mpdconnection.cpp:1334
 msgid "You cannot add a playlist to another playlist!"
 msgstr "Нельзя добавлять плейлист к другому плейлисту."
 
@@ -3357,7 +3523,15 @@ msgstr "Нельзя добавлять плейлист к другому пл
 msgid "Personal"
 msgstr "Частный"
 
-#: mpd/song.cpp:343
+#: mpd/song.cpp:62
+msgid "Unknown"
+msgstr "Неизвестно"
+
+#: mpd/song.cpp:63
+msgid "Various Artists"
+msgstr "Несколько исполнителей"
+
+#: mpd/song.cpp:427
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3427,8 +3601,8 @@ msgstr "Настройки Magnatune"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
-#: rc.cpp:711 rc.cpp:729
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:863 po/rc.cpp:881
+#: rc.cpp:863 rc.cpp:881
 msgid "Username:"
 msgstr "Пользователь:"
 
@@ -3456,9 +3630,9 @@ msgstr "Пользователь:"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPasswordLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:220 po/rc.cpp:238
-#: po/rc.cpp:412 po/rc.cpp:647 po/rc.cpp:714 po/rc.cpp:732 rc.cpp:220
-#: rc.cpp:238 rc.cpp:412 rc.cpp:647 rc.cpp:714 rc.cpp:732
+#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:281 po/rc.cpp:299
+#: po/rc.cpp:476 po/rc.cpp:802 po/rc.cpp:866 po/rc.cpp:884 rc.cpp:281
+#: rc.cpp:299 rc.cpp:476 rc.cpp:802 rc.cpp:866 rc.cpp:884
 msgid "Password:"
 msgstr "Пароль:"
 
@@ -3498,155 +3672,187 @@ msgstr "Сбой загрузки"
 msgid "Download To Library"
 msgstr "Загрузить в библиотеку"
 
-#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
-msgid "Search For Podcasts"
-msgstr "Искать подкасты"
-
-#: online/onlineservicespage.cpp:63
+#: online/onlineservicespage.cpp:62
 msgid "Download Podcast Episodes"
 msgstr "Загрузить эпизоды подкаста"
 
-#: online/onlineservicespage.cpp:64
+#: online/onlineservicespage.cpp:63
 msgid "Delete Downloaded Podcast Episodes"
 msgstr "Удалить загруженные эпизоды подкаста"
 
-#: online/onlineservicespage.cpp:329
+#: online/onlineservicespage.cpp:320
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "Поиск %1:"
 
-#: online/onlineservicespage.cpp:464
+#: online/onlineservicespage.cpp:458
 msgid "Re-download music listing for %1?"
 msgstr "Повторно загрузить список музыки для %1?"
 
-#: online/onlineservicespage.cpp:532
-msgid "Subscribe to Podcast"
-msgstr "Подписаться на подкаст"
-
-#: online/onlineservicespage.cpp:532
-msgid "Enter podcast URL:"
-msgstr "Введите адрес URL для подкаста:"
-
-#: online/onlineservicespage.cpp:541
-msgid "Invalid URL!"
-msgstr "Недопустимый URL."
-
-#: online/onlineservicespage.cpp:546
-msgid "You are already subscribed to this URL!"
-msgstr "Вы уже подписаны на этот адрес URL."
-
-#: online/onlineservicespage.cpp:550
-msgid "Already downloading this URL!"
-msgstr "Загрузка с этого URL уже идёт."
-
-#: online/onlineservicespage.cpp:579
+#: online/onlineservicespage.cpp:544
 msgid "Unsubscribe from <b>%1</b>?"
 msgstr "Отменить подписку для <b>%1</b>?"
 
-#: online/onlineservicespage.cpp:600
+#: online/onlineservicespage.cpp:565
 msgid "Refresh all podcast listings?"
 msgstr "Обновить список всех подкастов?"
 
-#: online/onlineservicespage.cpp:621
+#: online/onlineservicespage.cpp:586
 msgid "Refresh episode listing from <b>%1</b>?"
 msgstr "Обновить список эпизодов для <b>%1</b>?"
 
-#: online/onlineservicespage.cpp:695
+#: online/onlineservicespage.cpp:652
 msgid "All selected podcasts have already been downloaded!"
 msgstr "Все выбранные подкасты были уже загружены."
 
-#: online/onlineservicespage.cpp:699
+#: online/onlineservicespage.cpp:656
 msgid "Do you wish to download the following podcast episode?"
 msgstr "Загрузить следующий эпизод подкаста?"
 
-#: online/onlineservicespage.cpp:702
+#: online/onlineservicespage.cpp:659
 msgid "Do you wish to download the following podcast episodes?"
 msgstr "Загрузить следующие эпизоды подкаста?"
 
-#: online/onlineservicespage.cpp:705
+#: online/onlineservicespage.cpp:662
 msgid "Do you wish to download the selected podcast episodes?"
 msgstr "Загрузить выбранные эпизоды подкаста?"
 
-#: online/onlineservicespage.cpp:753
+#: online/onlineservicespage.cpp:710
 msgid "All selected downloaded podcast episodes have already been deleted!"
 msgstr "Все выбранные загруженные эпизоды подкаста уже были удалены."
 
-#: online/onlineservicespage.cpp:757
+#: online/onlineservicespage.cpp:714
 msgid ""
 "Do you wish to delete the downloaded file of the following podcast episode?"
 msgstr "Удалить загруженный файл следующего эпизода подкаста?"
 
-#: online/onlineservicespage.cpp:760
+#: online/onlineservicespage.cpp:717
 msgid ""
 "Do you wish to the delete downloaded files of the following podcast episodes?"
 msgstr "Удалить загруженные файлы следующих эпизодов подкаста?"
 
-#: online/onlineservicespage.cpp:763
+#: online/onlineservicespage.cpp:720
 msgid ""
 "Do you wish to the delete downloaded files of the selected podcast episodes?"
 msgstr "Удалить загруженные файлы выбранного эпизода подкаста?"
 
-#: online/podcastsearchdialog.cpp:243
+#: online/podcastsearchdialog.cpp:253
 msgid "RSS:"
 msgstr "RSS:"
 
-#: online/podcastsearchdialog.cpp:245
+#: online/podcastsearchdialog.cpp:255
 msgid "Website:"
 msgstr "Сайт:"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Podcast details"
 msgstr "Подробности подкаста"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Select a podcast to display its details"
 msgstr "Выбрать подкаст для показа подробностей"
 
-#: online/podcastsearchdialog.cpp:322
+#: online/podcastsearchdialog.cpp:333
 msgid "Enter search term..."
 msgstr "Введите поисковый запрос…"
 
-#: online/podcastsearchdialog.cpp:372
+#: online/podcastsearchdialog.cpp:383
 msgid "Failed to fetch podcasts from %1"
 msgstr "Сбой получения подкаста с %1"
 
-#: online/podcastsearchdialog.cpp:378
+#: online/podcastsearchdialog.cpp:389
 msgid "There was a problem parsing the response from %1"
 msgstr "При выполнении обработки ответа от %1 возникла ошибка"
 
-#: online/podcastsearchdialog.cpp:439
+#: online/podcastsearchdialog.cpp:450
 msgid "Failed to download directory listing"
 msgstr "Не удалось загрузить содержимое каталога"
 
-#: online/podcastsearchdialog.cpp:447
+#: online/podcastsearchdialog.cpp:458
 msgid "Failed to parse directory listing"
 msgstr "Не удалось проанализировать содержимое каталога"
 
 #: online/podcastsearchdialog.cpp:508
+#, fuzzy
+msgid "URL"
+msgstr "URL:"
+
+#: online/podcastsearchdialog.cpp:517
+#, fuzzy
+msgid "Enter podcast URL..."
+msgstr "Введите адрес URL для подкаста:"
+
+#: online/podcastsearchdialog.cpp:518
+msgid "Load"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:525
+msgid "Enter podcast URL below, and press 'Load'"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:552
+msgid "Invalid URL!"
+msgstr "Недопустимый URL."
+
+#: online/podcastsearchdialog.cpp:562
+#, fuzzy
+msgid "Failed to fetch podcast!"
+msgstr "Сбой получения подкаста с %1"
+
+#: online/podcastsearchdialog.cpp:567
+#, fuzzy
+msgid "Failed to parse podcast."
+msgstr "Сбой обработки"
+
+#: online/podcastsearchdialog.cpp:571
+#, fuzzy
+msgid ""
+"Cantata only supports audio podcasts! The URL entered contains only video "
+"podcasts."
+msgstr ""
+"Cantata поддерживает только аудио-подкасты, а %1 содержит только видео-"
+"подкасты."
+
+#: online/podcastsearchdialog.cpp:589
 msgid "Subscribe"
 msgstr "Подписаться"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:607
+#, fuzzy
+msgid "Enter URL"
+msgstr "Введите адрес URL для подкаста:"
+
+#: online/podcastsearchdialog.cpp:607
+#, fuzzy
+msgid "Manual podcast URL"
+msgstr "Введите адрес URL для подкаста:"
+
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search %1"
 msgstr "Искать %1"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search for podcasts on %1"
 msgstr "Поиск подкастов на %1"
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1"
 msgstr "Просмотреть %1"
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1 podcasts"
 msgstr "Просмотреть %1 подкастов"
 
-#: online/podcastsearchdialog.cpp:602
+#: online/podcastsearchdialog.cpp:639
+#, fuzzy
+msgid "Add Podcast Subscription"
+msgstr "Добавить подписку"
+
+#: online/podcastsearchdialog.cpp:695
 msgid "Subscription added"
 msgstr "Подписка добавлена"
 
-#: online/podcastsearchdialog.cpp:604
+#: online/podcastsearchdialog.cpp:697
 msgid "You are already subscribed to this podcast!"
 msgstr "Вы уже подписаны на этот подкаст"
 
@@ -3654,93 +3860,174 @@ msgstr "Вы уже подписаны на этот подкаст"
 msgid "Podcasts"
 msgstr "Подкасты"
 
-#: online/podcastservice.cpp:284
+#: online/podcastservice.cpp:288
 msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
 msgstr ""
-"Cantata поддерживает только аудио-подкасты, а %1 содержит "
-"только видео-подкасты."
+"Cantata поддерживает только аудио-подкасты, а %1 содержит только видео-"
+"подкасты."
 
-#: online/podcastservice.cpp:286
+#: online/podcastservice.cpp:290
 msgid "Failed to parse %1"
 msgstr "Сбой обработки %1"
 
-#: online/podcastservice.cpp:290
+#: online/podcastservice.cpp:294
 msgid "Failed to download %1"
 msgstr "Не удалось загрузить %1"
 
-#: online/podcastsettingsdialog.cpp:58
+#: online/podcastsettingsdialog.cpp:59
 msgid "Check for new episodes:"
 msgstr "Проверить наличие новых эпизодов:"
 
-#: online/podcastsettingsdialog.cpp:59
+#: online/podcastsettingsdialog.cpp:60
 msgid "Download episodes to:"
 msgstr "Загрузить эпизоды в:"
 
-#: online/podcastsettingsdialog.cpp:60
-msgid "Automatically download new episodes:"
-msgstr "Автоматически загружать новые эпизоды:"
+#: online/podcastsettingsdialog.cpp:67
+msgid "Automatically download new episodes"
+msgstr "Автоматически загружать новые эпизоды"
 
-#: online/podcastsettingsdialog.cpp:82
+#: online/podcastsettingsdialog.cpp:80
 msgid "Podcast Settings"
 msgstr "Настройки подкастов"
 
-#: online/podcastsettingsdialog.cpp:84
+#: online/podcastsettingsdialog.cpp:82
 msgid "Manually"
 msgstr "Вручную"
 
-#: online/podcastsettingsdialog.cpp:85
+#: online/podcastsettingsdialog.cpp:83
 msgid "Every 15 minutes"
 msgstr "Каждые 15 минут"
 
-#: online/podcastsettingsdialog.cpp:86
+#: online/podcastsettingsdialog.cpp:84
 msgid "Every 30 minutes"
 msgstr "Каждые 30 минут"
 
-#: online/podcastsettingsdialog.cpp:87
+#: online/podcastsettingsdialog.cpp:85
 msgid "Every hour"
 msgstr "Каждый час"
 
-#: online/podcastsettingsdialog.cpp:88
+#: online/podcastsettingsdialog.cpp:86
 msgid "Every 2 hours"
 msgstr "Каждые 2 часа"
 
-#: online/podcastsettingsdialog.cpp:89
+#: online/podcastsettingsdialog.cpp:87
 msgid "Every 6 hours"
 msgstr "Каждые 6 часов"
 
-#: online/podcastsettingsdialog.cpp:90
+#: online/podcastsettingsdialog.cpp:88
 msgid "Every 12 hours"
 msgstr "Каждые 12 часов"
 
-#: online/podcastsettingsdialog.cpp:91
+#: online/podcastsettingsdialog.cpp:89
 msgid "Every day"
 msgstr "Каждый день"
 
-#: online/podcastsettingsdialog.cpp:92
+#: online/podcastsettingsdialog.cpp:90
 msgid "Every week"
 msgstr "Каждую неделю"
 
-#. i18n: file: context/othersettings.ui:19
-#. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
-#: po/rc.cpp:3 rc.cpp:3
-msgid "Use backdrop:"
-msgstr "Использовать оформление:"
-
-#. i18n: file: context/othersettings.ui:32
-#. i18n: ectx: property (text), widget (BuddyLabel, contextDarkBackgroundLabel)
-#: po/rc.cpp:6 rc.cpp:6
-msgid "Dark background:"
-msgstr "Тёмный фон:"
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:3 po/rc.cpp:657 rc.cpp:3 rc.cpp:657
+msgid "Background Image"
+msgstr ""
 
-#. i18n: file: context/othersettings.ui:45
-#. i18n: ectx: property (text), widget (BuddyLabel, wikipediaIntroOnlyLabel)
+#. i18n: file: context/othersettings.ui:36
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_artist)
 #: po/rc.cpp:9 rc.cpp:9
-msgid "Only show basic wikipedia text:"
-msgstr "Показывать только основной текст wikipedia:"
+#, fuzzy
+msgid "Artist image"
+msgstr "Показывать изображение исполнителя:"
 
-#. i18n: file: context/othersettings.ui:86
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#: po/rc.cpp:12 po/rc.cpp:666 rc.cpp:12 rc.cpp:666
+#, fuzzy
+msgid "Custom image:"
+msgstr "Пользовательский:"
+
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#: po/rc.cpp:15 po/rc.cpp:669 rc.cpp:15 rc.cpp:669
+msgid "Blur:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#: po/rc.cpp:18 po/rc.cpp:672 rc.cpp:18 rc.cpp:672
+msgid "10px"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: po/rc.cpp:21 po/rc.cpp:675 rc.cpp:21 rc.cpp:675
+msgid "Opacity:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#: po/rc.cpp:25 po/rc.cpp:679 rc.cpp:25 rc.cpp:679
+#, no-c-format
+msgid "40%"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, contextDarkBackground)
+#: po/rc.cpp:28 rc.cpp:28
+msgid "Dark background"
+msgstr "Тёмный фон"
+
+#. i18n: file: context/othersettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, wikipediaIntroOnly)
+#: po/rc.cpp:31 rc.cpp:31
+msgid "Only show basic wikipedia text"
+msgstr "Показывать только основной текст wikipedia"
+
+#. i18n: file: context/othersettings.ui:178
+#. i18n: ectx: property (text), widget (QCheckBox, contextAlwaysCollapsed)
+#: po/rc.cpp:34 rc.cpp:34
+msgid "Always collapse into a single pane"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:207
 #. i18n: ectx: property (text), widget (StateLabel, wikipediaIntroOnlyNote)
-#: po/rc.cpp:13 rc.cpp:13
+#: po/rc.cpp:38 rc.cpp:38
 #, no-c-format
 msgid ""
 "<i><b>NOTE:</b> Cantata does not show the full wikipedia pages (with images, "
@@ -3760,188 +4047,174 @@ msgstr ""
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:16 rc.cpp:16
+#: po/rc.cpp:41 rc.cpp:41
 msgid "Available:"
 msgstr "Доступно:"
 
 #. i18n: file: context/togglelist.ui:24
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:19 rc.cpp:19
+#: po/rc.cpp:44 rc.cpp:44
 msgid "Selected:"
 msgstr "Выбрано:"
 
-#. i18n: file: devices/actiondialog.ui:30
+#. i18n: file: devices/actiondialog.ui:33
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:22 rc.cpp:22
+#: po/rc.cpp:47 rc.cpp:47
 msgid "Copy songs from:"
 msgstr "Копировать песни с:"
 
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#: po/rc.cpp:25 po/rc.cpp:31 po/rc.cpp:49 po/rc.cpp:744 rc.cpp:25 rc.cpp:31
-#: rc.cpp:49 rc.cpp:744
+#: po/rc.cpp:50 po/rc.cpp:62 po/rc.cpp:896 rc.cpp:50 rc.cpp:62 rc.cpp:896
 msgid "TextLabel"
 msgstr "TextLabel"
 
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#: po/rc.cpp:28 po/rc.cpp:34 rc.cpp:28 rc.cpp:34
+#: po/rc.cpp:56 po/rc.cpp:68 rc.cpp:56 rc.cpp:68
 msgid "(Needs configuring)"
 msgstr "(Необходима настройка)"
 
-#. i18n: file: devices/actiondialog.ui:123
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:37 rc.cpp:37
-msgid "Overwrite songs:"
-msgstr "Перезаписать песни:"
-
-#. i18n: file: devices/actiondialog.ui:150
+#. i18n: file: devices/actiondialog.ui:86
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:40 rc.cpp:40
+#: po/rc.cpp:59 rc.cpp:59
 msgid "Copy songs to:"
 msgstr "Копировать песни на:"
 
-#. i18n: file: devices/actiondialog.ui:157
+#. i18n: file: devices/actiondialog.ui:149
 #. i18n: ectx: property (text), widget (QLabel, codecLabel)
-#: po/rc.cpp:43 rc.cpp:43
+#: po/rc.cpp:71 rc.cpp:71
 msgid "Destination format:"
 msgstr "Целевой формат:"
 
-#. i18n: file: devices/actiondialog.ui:171
+#. i18n: file: devices/actiondialog.ui:163
+#. i18n: ectx: property (text), widget (QCheckBox, overwrite)
+#: po/rc.cpp:74 rc.cpp:74
+#, fuzzy
+msgid "Overwrite songs"
+msgstr "Перезаписать песни:"
+
+#. i18n: file: devices/actiondialog.ui:170
 #. i18n: ectx: property (text), widget (QLabel, songCountLabel)
-#: po/rc.cpp:46 rc.cpp:46
+#: po/rc.cpp:77 rc.cpp:77
 msgid "To copy:"
 msgstr "Копировать:"
 
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#: po/rc.cpp:80 po/rc.cpp:968 po/rc.cpp:995 rc.cpp:80 rc.cpp:968 rc.cpp:995
+msgid ""
+"<i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i>"
+msgstr ""
+
 #. i18n: file: devices/albumdetails.ui:26
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:52 rc.cpp:52
+#: po/rc.cpp:83 rc.cpp:83
 msgid "Album Details"
 msgstr "Подробности альбома"
 
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#: po/rc.cpp:58 po/rc.cpp:298 po/rc.cpp:798 rc.cpp:58 rc.cpp:298 rc.cpp:798
-msgid "Composer:"
-msgstr "Автор музыки:"
-
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
-msgid "Genre:"
-msgstr "Жанр:"
-
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#: po/rc.cpp:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
+#: po/rc.cpp:98 po/rc.cpp:965 rc.cpp:98 rc.cpp:965
 msgid "Year:"
 msgstr "Год:"
 
-#. i18n: file: devices/albumdetails.ui:99
+#. i18n: file: devices/albumdetails.ui:102
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:70 rc.cpp:70
+#: po/rc.cpp:101 rc.cpp:101
 msgid "Disc:"
 msgstr "Диск:"
 
-#. i18n: file: devices/albumdetails.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:73 rc.cpp:73
-msgid "Single artist:"
+#. i18n: file: devices/albumdetails.ui:115
+#. i18n: ectx: property (text), widget (QCheckBox, singleArtist)
+#: po/rc.cpp:104 rc.cpp:104
+#, fuzzy
+msgid "Single artist"
 msgstr "Отдельный исполнитель:"
 
-#. i18n: file: devices/audiocdsettings.ui:20
+#. i18n: file: devices/audiocdsettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:119 rc.cpp:119
 msgid "Album and Track Information Retrieval"
 msgstr "Получение информации об альбоме и треке:"
 
-#. i18n: file: devices/audiocdsettings.ui:26
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:91 rc.cpp:91
-msgid "Automatically lookup:"
-msgstr "Автоматически искать:"
-
-#. i18n: file: devices/audiocdsettings.ui:39
+#. i18n: file: devices/audiocdsettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:122 rc.cpp:122
 msgid "Initially look up via:"
 msgstr "Искать изначально через:"
 
-#. i18n: file: devices/audiocdsettings.ui:52
+#. i18n: file: devices/audiocdsettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:125 rc.cpp:125
 msgid "CDDB Host:"
 msgstr "Хост CDDB:"
 
-#. i18n: file: devices/audiocdsettings.ui:65
+#. i18n: file: devices/audiocdsettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:128 rc.cpp:128
 msgid "CDDB Port:"
 msgstr "Порт CDDB:"
 
-#. i18n: file: devices/audiocdsettings.ui:88
+#. i18n: file: devices/audiocdsettings.ui:84
+#. i18n: ectx: property (text), widget (QCheckBox, cdAuto)
+#: po/rc.cpp:131 rc.cpp:131
+msgid "Lookup information as soon as CD is inserted"
+msgstr ""
+
+#. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:134 rc.cpp:134
 msgid "Audio Extraction"
 msgstr "Извлечение аудио"
 
-#. i18n: file: devices/audiocdsettings.ui:94
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:106 rc.cpp:106
-msgid "Full paranoia mode (best quality):"
-msgstr "Режим full paranoia (лучшее качество):"
+#. i18n: file: devices/audiocdsettings.ui:100
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaFull)
+#: po/rc.cpp:137 rc.cpp:137
+msgid "Full paranoia mode (best quality)"
+msgstr "Режим full paranoia (лучшее качество)"
 
 #. i18n: file: devices/audiocdsettings.ui:107
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:109 rc.cpp:109
-msgid "Never skip on read error:"
-msgstr "Никогда не пропускать при ошибке чтения:"
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaNeverSkip)
+#: po/rc.cpp:140 rc.cpp:140
+msgid "Never skip on read error"
+msgstr "Никогда не пропускать при ошибке чтения"
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:112 rc.cpp:112
+#: po/rc.cpp:143 rc.cpp:143
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3969,188 +4242,279 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
 #. i18n: file: gui/serversettings.ui:325
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
-#: po/rc.cpp:115 po/rc.cpp:415 po/rc.cpp:433 po/rc.cpp:650 po/rc.cpp:671
-#: rc.cpp:115 rc.cpp:415 rc.cpp:433 rc.cpp:650 rc.cpp:671
+#: po/rc.cpp:146 po/rc.cpp:479 po/rc.cpp:497 po/rc.cpp:805 po/rc.cpp:826
+#: rc.cpp:146 rc.cpp:479 rc.cpp:497 rc.cpp:805 rc.cpp:826
 msgid "Music folder:"
 msgstr "Папка с музыкой:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:149 rc.cpp:149
 msgid "Copy album covers as:"
 msgstr "Скопировать обложки альбома как:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: po/rc.cpp:152 rc.cpp:152
 msgid "Maximum cover size:"
 msgstr "Максимальный размер обложки:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:82
-#. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:124 rc.cpp:124
-msgid "'Various Artists' workaround:"
+#. i18n: file: devices/devicepropertieswidget.ui:85
+#. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
+#: po/rc.cpp:155 rc.cpp:155
+msgid "Default volume:"
+msgstr "Громкость по умолчанию:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, fixVariousArtists)
+#: po/rc.cpp:158 rc.cpp:158
+#, fuzzy
+msgid "'Various Artists' workaround"
 msgstr "Обходное решение «несколько исполнителей»:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, autoScanLabel)
-#: po/rc.cpp:127 rc.cpp:127
-msgid "Automatically scan music when attached:"
+#. i18n: file: devices/devicepropertieswidget.ui:99
+#. i18n: ectx: property (text), widget (QCheckBox, autoScan)
+#: po/rc.cpp:161 rc.cpp:161
+#, fuzzy
+msgid "Automatically scan music when attached"
 msgstr "Автоматически сканировать музыку при подключении:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:108
-#. i18n: ectx: property (text), widget (BuddyLabel, useCacheLabel)
-#: po/rc.cpp:130 rc.cpp:130
-msgid "Use cache:"
+#. i18n: file: devices/devicepropertieswidget.ui:106
+#. i18n: ectx: property (text), widget (QCheckBox, useCache)
+#: po/rc.cpp:164 rc.cpp:164
+#, fuzzy
+msgid "Use cache"
 msgstr "Использовать кеш:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:121
-#. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:133 rc.cpp:133
-msgid "Default volume:"
-msgstr "Громкость по умолчанию:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#: po/rc.cpp:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
+#: po/rc.cpp:167 po/rc.cpp:971 rc.cpp:167 rc.cpp:971
 msgid "Filenames"
 msgstr "Имена файлов:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
-msgid "Use only ASCII characters:"
-msgstr "Использовать только символы ASCII:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
-msgid "Replace spaces with underscores:"
-msgstr "Заменять пробелы символом подчёркивания:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
-msgid "Ignore 'The' in artist names:"
-msgstr "Игнорировать артикль 'The' в именах англоязычных исполнителей:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
+#: po/rc.cpp:170 po/rc.cpp:974 rc.cpp:170 rc.cpp:974
 msgid "Filename scheme:"
 msgstr "Схема имени файла:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
-msgid "VFAT safe:"
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#: po/rc.cpp:173 po/rc.cpp:977 rc.cpp:173 rc.cpp:977
+#, fuzzy
+msgid "VFAT safe"
 msgstr "Совместимо с VFAT:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:250
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#: po/rc.cpp:176 po/rc.cpp:980 rc.cpp:176 rc.cpp:980
+#, fuzzy
+msgid "Use only ASCII characters"
+msgstr "Использовать только символы ASCII:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#: po/rc.cpp:179 po/rc.cpp:983 rc.cpp:179 rc.cpp:983
+#, fuzzy
+msgid "Replace spaces with underscores"
+msgstr "Заменять пробелы символом подчёркивания:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#: po/rc.cpp:182 po/rc.cpp:986 rc.cpp:182 rc.cpp:986
+#, fuzzy
+msgid "Ignore 'The' in artist names"
+msgstr "Игнорировать артикль 'The' в именах англоязычных исполнителей:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:192
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:185 rc.cpp:185
 msgid "Transcoding"
 msgstr "Перекодирование"
 
-#. i18n: file: devices/devicepropertieswidget.ui:261
-#. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:157 rc.cpp:157
-msgid "Only transcode if source file is of a different format:"
+#. i18n: file: devices/devicepropertieswidget.ui:201
+#. i18n: ectx: property (text), widget (QCheckBox, transcoderWhenDifferent)
+#: po/rc.cpp:188 rc.cpp:188
+#, fuzzy
+msgid "Only transcode if source file is of a different format"
 msgstr "Перекодировать, только когда исходный файл имеет другой формат:"
 
-#. i18n: file: devices/filenameschemedialog.ui:29
+#. i18n: file: devices/filenameschemedialog.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:191 rc.cpp:191
 msgid "Example:"
 msgstr "Пример:"
 
-#. i18n: file: devices/filenameschemedialog.ui:58
+#. i18n: file: devices/filenameschemedialog.ui:67
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:194 rc.cpp:194
 msgid "About filename schemes"
 msgstr "О схемах имени файла"
 
-#. i18n: file: devices/filenameschemedialog.ui:70
+#. i18n: file: devices/filenameschemedialog.ui:79
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumArtist)
+#: po/rc.cpp:197 rc.cpp:197
+#, fuzzy
+msgid ""
+"The artist of the album. For most albums, this will be the same as the "
+"<i>Track Artist.</i> For compilations, this will often be <i>Various Artists."
+"</i>"
+msgstr ""
+"<tr><td>%albumartist%</td><td>%1</td><td>Исполнитель альбома. Для "
+"большинства альбомов это значение будет равно <i>Исполнителю трека.</i> Для "
+"сборников чаще всего это будет <i>Несколько исполнителей.</i> </td></tr>"
+
+#. i18n: file: devices/filenameschemedialog.ui:82
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:200 rc.cpp:200
 msgid "Album Artist"
 msgstr "Исполнитель альбома"
 
-#. i18n: file: devices/filenameschemedialog.ui:77
+#. i18n: file: devices/filenameschemedialog.ui:89
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumTitle)
+#: po/rc.cpp:203 rc.cpp:203
+msgid "The name of the album."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:92
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:206 rc.cpp:206
 msgid "Album Title"
 msgstr "Название альбома"
 
-#. i18n: file: devices/filenameschemedialog.ui:91
+#. i18n: file: devices/filenameschemedialog.ui:99
+#. i18n: ectx: property (toolTip), widget (QPushButton, composer)
+#: po/rc.cpp:209 rc.cpp:209
+#, fuzzy
+msgid "The composer."
+msgstr "Автор музыки"
+
+#. i18n: file: devices/filenameschemedialog.ui:109
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtist)
+#: po/rc.cpp:215 rc.cpp:215
+msgid "The artist of each track."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:112
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:218 rc.cpp:218
 msgid "Track Artist"
 msgstr "Исполнитель трека"
 
-#. i18n: file: devices/filenameschemedialog.ui:98
+#. i18n: file: devices/filenameschemedialog.ui:119
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackTitle)
+#: po/rc.cpp:221 rc.cpp:221
+#, fuzzy
+msgid "The track title (without <i>Track Artist</i>)."
+msgstr ""
+"<tr><td>%title%</td><td>%1</td><td>Название трека (без <i>Исполнителя трека</"
+"i>).</td></tr>"
+
+#. i18n: file: devices/filenameschemedialog.ui:122
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:224 rc.cpp:224
 msgid "Track Title"
 msgstr "Название трека"
 
-#. i18n: file: devices/filenameschemedialog.ui:117
+#. i18n: file: devices/filenameschemedialog.ui:141
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtistAndTitle)
+#: po/rc.cpp:227 rc.cpp:227
+#, fuzzy
+msgid ""
+"The track title (with <i>Track Artist</i>, if different to <i>Album Artist</"
+"i>)."
+msgstr ""
+"<tr><td>%artistandtitle%</td><td>%1</td><td>Название трека (с "
+"<i>Исполнителем трека</i>, если оно не равно <i>Исполнителю альбома</i>).</"
+"td></tr>"
+
+#. i18n: file: devices/filenameschemedialog.ui:144
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:230 rc.cpp:230
 msgid "Track Title (+Artist)"
 msgstr "Название трека (+Исполнитель)"
 
-#. i18n: file: devices/filenameschemedialog.ui:124
+#. i18n: file: devices/filenameschemedialog.ui:151
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackNo)
+#: po/rc.cpp:233 rc.cpp:233
+#, fuzzy
+msgid "The track number."
+msgstr "Номер трека:"
+
+#. i18n: file: devices/filenameschemedialog.ui:154
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:184 rc.cpp:184
+#: po/rc.cpp:236 rc.cpp:236
 msgid "Track #"
 msgstr "Трек №"
 
-#. i18n: file: devices/filenameschemedialog.ui:131
+#. i18n: file: devices/filenameschemedialog.ui:161
+#. i18n: ectx: property (toolTip), widget (QPushButton, cdNo)
+#: po/rc.cpp:239 rc.cpp:239
+#, fuzzy
+msgid ""
+"The album number of a multi-album album. Often compilations consist of "
+"several albums."
+msgstr ""
+"<tr><td>%discnumber%</td><td>%1</td><td>Номер альбома в сборнике из "
+"нескольких альбомов. Такие сборники встречаются довольно часто.</td></tr>"
+
+#. i18n: file: devices/filenameschemedialog.ui:164
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:187 rc.cpp:187
+#: po/rc.cpp:242 rc.cpp:242
 msgid "CD #"
 msgstr "CD №"
 
+#. i18n: file: devices/filenameschemedialog.ui:171
+#. i18n: ectx: property (toolTip), widget (QPushButton, year)
+#: po/rc.cpp:245 rc.cpp:245
+msgid "The year of the album's release."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:181
+#. i18n: ectx: property (toolTip), widget (QPushButton, genre)
+#: po/rc.cpp:251 rc.cpp:251
+msgid "The genre of the album."
+msgstr ""
+
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:196 rc.cpp:196
+#: po/rc.cpp:257 rc.cpp:257
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -4160,17 +4524,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
-#: po/rc.cpp:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
+#: po/rc.cpp:260 po/rc.cpp:353 po/rc.cpp:848 rc.cpp:260 rc.cpp:353 rc.cpp:848
 msgid "Type:"
 msgstr "Тип:"
 
@@ -4182,14 +4546,16 @@ msgstr "Тип:"
 #. i18n: ectx: property (text), widget (BuddyLabel, nameLabel)
 #. i18n: file: gui/serversettings.ui:63
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
-#: rc.cpp:638
+#: po/rc.cpp:263 po/rc.cpp:793 streams/streamdialog.cpp:71 rc.cpp:263
+#: rc.cpp:793
 msgid "Name:"
 msgstr "Имя:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:205 rc.cpp:205
+#. i18n: file: gui/interfacesettings.ui:122
+#. i18n: ectx: property (title), widget (QGroupBox, optionsGroup)
+#: po/rc.cpp:266 rc.cpp:266 po/rc.cpp:551 rc.cpp:551
 msgid "Options"
 msgstr "Параметры"
 
@@ -4213,8 +4579,8 @@ msgstr "Параметры"
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: network/proxysettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPortLabel)
-#: po/rc.cpp:211 po/rc.cpp:250 po/rc.cpp:409 po/rc.cpp:644 po/rc.cpp:708
-#: rc.cpp:211 rc.cpp:250 rc.cpp:409 rc.cpp:644 rc.cpp:708
+#: po/rc.cpp:272 po/rc.cpp:311 po/rc.cpp:473 po/rc.cpp:799 po/rc.cpp:860
+#: rc.cpp:272 rc.cpp:311 rc.cpp:473 rc.cpp:799 rc.cpp:860
 msgid "Port:"
 msgstr "Порт:"
 
@@ -4230,7 +4596,7 @@ msgstr "Порт:"
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2x)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:322
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel)
-#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
+#: po/rc.cpp:275 po/rc.cpp:293 po/rc.cpp:314 rc.cpp:275 rc.cpp:293 rc.cpp:314
 msgid "User:"
 msgstr "Пользователь:"
 
@@ -4242,7 +4608,7 @@ msgstr "Пользователь:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:218
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2x)
-#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:278 po/rc.cpp:296 rc.cpp:278 rc.cpp:296
 msgid "Domain:"
 msgstr "Домен:"
 
@@ -4254,7 +4620,7 @@ msgstr "Домен:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:248
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2)
-#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
+#: po/rc.cpp:284 po/rc.cpp:302 rc.cpp:284 rc.cpp:302
 msgid "Share:"
 msgstr "Общий ресурс:"
 
@@ -4266,7 +4632,7 @@ msgstr "Общий ресурс:"
 #. i18n: ectx: property (text), widget (QLabel, label_4)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:263
 #. i18n: ectx: property (text), widget (QLabel, label_4x)
-#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
+#: po/rc.cpp:287 po/rc.cpp:305 rc.cpp:287 rc.cpp:305
 msgid ""
 "<i><b>NOTE:</b> If you enter a password here, it will be stored "
 "<b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the "
@@ -4279,7 +4645,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:229 rc.cpp:229
+#: po/rc.cpp:290 rc.cpp:290
 msgid "Service name:"
 msgstr "Имя сервиса:"
 
@@ -4291,19 +4657,19 @@ msgstr "Имя сервиса:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:390
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
+#: po/rc.cpp:317 po/rc.cpp:326 rc.cpp:317 rc.cpp:326
 msgid "Folder:"
 msgstr "Папка:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:259 rc.cpp:259
+#: po/rc.cpp:320 rc.cpp:320
 msgid "Extra Options:"
 msgstr "Дополнительные параметры:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:323 rc.cpp:323
 msgid ""
 "<i><b>NOTE:</b> Due to the way sshfs works, a suitable ssh-askpass "
 "application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter "
@@ -4315,7 +4681,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:329 rc.cpp:329
 msgid ""
 "<i><b>NOTE:</b> This dialog is only used to add remote devices (e.g. via "
 "Samba), or to access locally mounted folders. For normal media players, "
@@ -4329,112 +4695,100 @@ msgstr ""
 
 #. i18n: file: dynamic/dynamicpage.ui:26
 #. i18n: ectx: property (text), widget (StatusLabel, infoLabel)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:332 rc.cpp:332
 msgid "No dynamizer port defined in server settings."
 msgstr "В настройках сервера не указан порт для dynamizer"
 
 #. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:274 rc.cpp:274
+#: po/rc.cpp:335 rc.cpp:335
 msgid "Remote dynamizer is not running."
 msgstr "Удалённый dynamizer не запущен"
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:277 rc.cpp:277
+#: po/rc.cpp:338 rc.cpp:338
 msgid "Name of Dynamic Rules"
 msgstr "Имя динамических правил"
 
 #. i18n: file: dynamic/dynamicrules.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, editBtn)
-#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
+#: po/rc.cpp:344 streams/streamspage.cpp:62 rc.cpp:344
 msgid "Edit"
 msgstr "Изменить"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:350 rc.cpp:350
 msgid "About Rules"
 msgstr "О правилах"
 
-#. i18n: file: dynamic/dynamicrule.ui:38
+#. i18n: file: dynamic/dynamicrule.ui:37
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:356 rc.cpp:356
+msgid "Include songs that match the following:"
+msgstr "Включить песни, отвечающие следующему условию:"
+
+#. i18n: file: dynamic/dynamicrule.ui:42
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:359 rc.cpp:359
+msgid "Exclude songs that match the following:"
+msgstr "Исключить песни, отвечающие следующему условию:"
+
+#. i18n: file: dynamic/dynamicrule.ui:63
+#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
+#: po/rc.cpp:365 rc.cpp:365
+msgid "Artists similar to:"
+msgstr "Найти похожих исполнителей:"
+
+#. i18n: file: dynamic/dynamicrule.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:295 rc.cpp:295
+#: po/rc.cpp:368 rc.cpp:368
 msgid "Album Artist:"
 msgstr "Исполнитель альбома:"
 
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
-msgid "Album:"
-msgstr "Альбом:"
-
-#. i18n: file: dynamic/dynamicrule.ui:103
+#. i18n: file: dynamic/dynamicrule.ui:141
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:310 rc.cpp:310
+#: po/rc.cpp:383 rc.cpp:383
 msgid "From Year:"
 msgstr "От года:"
 
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
-msgid "Any"
-msgstr "Любой"
-
-#. i18n: file: dynamic/dynamicrule.ui:126
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:316 rc.cpp:316
-msgid "To Year:"
-msgstr "До года:"
-
-#. i18n: file: dynamic/dynamicrule.ui:149
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:322 rc.cpp:322
-msgid "Exact match:"
-msgstr "Точное совпадение:"
-
-#. i18n: file: dynamic/dynamicrule.ui:173
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:328 rc.cpp:328
-msgid "Include songs that match the following:"
-msgstr "Включить песни, отвечающие следующему условию:"
-
-#. i18n: file: dynamic/dynamicrule.ui:178
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:331 rc.cpp:331
-msgid "Exclude songs that match the following:"
-msgstr "Исключить песни, отвечающие следующему условию:"
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#: po/rc.cpp:386 po/rc.cpp:392 rc.cpp:386 rc.cpp:392
+msgid "Any"
+msgstr "Любой"
 
-#. i18n: file: dynamic/dynamicrule.ui:186
-#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:334 rc.cpp:334
-msgid "Artists similar to:"
-msgstr "Найти похожих исполнителей:"
+#. i18n: file: dynamic/dynamicrule.ui:164
+#. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
+#: po/rc.cpp:389 rc.cpp:389
+msgid "To Year:"
+msgstr "До года:"
+
+#. i18n: file: dynamic/dynamicrule.ui:187
+#. i18n: ectx: property (text), widget (QCheckBox, exactCheck)
+#: po/rc.cpp:395 rc.cpp:395
+msgid "Exact match"
+msgstr "Точное совпадение"
 
-#. i18n: file: dynamic/dynamicrule.ui:236
+#. i18n: file: dynamic/dynamicrule.ui:231
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:337 rc.cpp:337
+#: po/rc.cpp:398 rc.cpp:398
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
 "<i><b>ВНИМАНИЕ</b> вводить значения только для тегов, по которым должен "
 "производиться поиск.</i>"
 
-#. i18n: file: dynamic/dynamicrule.ui:262
+#. i18n: file: dynamic/dynamicrule.ui:260
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:340 rc.cpp:340
+#: po/rc.cpp:401 rc.cpp:401
 msgid ""
 "<i><b>NOTE</b> For genre, end string with an asterisk to match various "
 "genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. </i>"
@@ -4443,69 +4797,63 @@ msgstr ""
 "астериском (знак «*»). Например, 'rock*' будет соответствовать и 'Hard Rock' "
 "и 'Rock and Roll'. </i>"
 
-#. i18n: file: gui/coverdialog.ui:23
-#. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:343 rc.cpp:343
-msgid "<html><head/><body><p>Cancel current query</p></body></html>"
-msgstr "<html><head/><body><p>Отменить текущую очередь</p></body></html>"
-
-#. i18n: file: gui/coverdialog.ui:37
+#. i18n: file: gui/coverdialog.ui:30
 #. i18n: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:349 rc.cpp:349
-msgid "<html><head/><body><p>Add a local file</p></body></html>"
-msgstr "<html><head/><body><p>Добавить локальный файл</p></body></html>"
-
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:352 po/rc.cpp:442 rc.cpp:352 rc.cpp:442
-msgid "Save downloaded covers in music folder:"
-msgstr "Сохранять загруженные обложки в папке с музыкой:"
-
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:355 po/rc.cpp:445 rc.cpp:355 rc.cpp:445
-msgid "Save downloaded lyrics in music folder:"
-msgstr "Сохранять загруженные тексты песен в папке с музыкой:"
-
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#: po/rc.cpp:358 po/rc.cpp:448 rc.cpp:358 rc.cpp:448
-msgid "Save downloaded backdrops in music folder:"
-msgstr "Сохранять загруженный фон/оформление в папке с музыкой:"
-
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:361 po/rc.cpp:451 rc.cpp:361 rc.cpp:451
-msgid "Save list of favorite streams in music folder:"
-msgstr "Сохранять список избранных потоков в папке с музыкой:"
-
-#. i18n: file: gui/filesettings.ui:110
+#: po/rc.cpp:407 rc.cpp:407
+msgid "Add a local file"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#: po/rc.cpp:413 po/rc.cpp:506 rc.cpp:413 rc.cpp:506
+msgid "Save downloaded covers in music folder"
+msgstr "Сохранять загруженные обложки в папке с музыкой"
+
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#: po/rc.cpp:416 po/rc.cpp:509 rc.cpp:416 rc.cpp:509
+msgid "Save downloaded lyrics in music folder"
+msgstr "Сохранять загруженные тексты песен в папке с музыкой"
+
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#: po/rc.cpp:419 po/rc.cpp:512 rc.cpp:419 rc.cpp:512
+msgid "Save downloaded backdrops in music folder"
+msgstr "Сохранять загруженный фон/оформление в папке с музыкой"
+
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#: po/rc.cpp:422 po/rc.cpp:515 rc.cpp:422 rc.cpp:515
+msgid "Save list of favorite streams in music folder"
+msgstr "Сохранять список избранных потоков в папке с музыкой"
+
+#. i18n: file: gui/filesettings.ui:79
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:425 rc.cpp:425
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, lyrics, or "
 "backdrops, within the music folder, and you do not have write access to this "
@@ -4518,17 +4866,25 @@ msgid ""
 msgstr ""
 "<i><b>ВНИМАНИЕ:</b> если Cantata настроена на сохранение обложек, текстов "
 "песен или фона в папке с музыкой, а у вас нет доступа на запись в эту папку, "
-"то в "
-"таком случае Cantata будет сохранять файлы в вашей личной папке для "
+"то в таком случае Cantata будет сохранять файлы в вашей личной папке для "
 "кеша. Тем не менее, если речь идёт о потоках, то при отсутствии доступа на "
 "запись, вы сможете только просматривать и проигрывать потоки, сохранённые в "
 "папке с музыкой, но не добавлять их и не редактировать. Если вы не указывали "
 "сохранять потоки в папку с музыкой, тогда они будут сохраняться в вашей "
 "локальной папке с настройками, и будут доступны только вам.</i>"
 
-#. i18n: file: gui/filesettings.ui:145
+#. i18n: file: gui/filesettings.ui:108
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:428 rc.cpp:428
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. (i.e. 'Artist/Album/Tracks')"
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:140
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:431 rc.cpp:431
 msgid ""
 "<i><b>NOTE:</b> If you change the location where streams are stored (i.e. "
 "you toggle the 'Save list of favorite streams in music folder' option), then "
@@ -4539,27 +4895,26 @@ msgid ""
 msgstr ""
 "<i><b>ВНИМАНИЕ:</b> если изменить местоположение хранения потоков (т.е. "
 "переключить настройку «хранить список избранных потоков в папке с музыкой»),"
-"тогда Cantata будет только показывать потоки, хранящиеся в "
-"соответствующем местоположении. Поэтому перед тем, как изменять эту "
-"настройку, рекомендуется экспортировать существующие потоки. После "
-"переключения настройки вы сможете экспортировать их заново в новое "
-"местоположение.</i>"
+"тогда Cantata будет только показывать потоки, хранящиеся в соответствующем "
+"местоположении. Поэтому перед тем, как изменять эту настройку, рекомендуется "
+"экспортировать существующие потоки. После переключения настройки вы сможете "
+"экспортировать их заново в новое местоположение.</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:370 rc.cpp:370
+#: po/rc.cpp:434 rc.cpp:434
 msgid "Cantata First Run"
 msgstr "Первый запуск программы Cantata"
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:373 rc.cpp:373
+#: po/rc.cpp:437 rc.cpp:437
 msgid "Welcome to Cantata"
 msgstr "Добро пожаловать в программу Cantata!"
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:440 rc.cpp:440
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4580,14 +4935,14 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:379 rc.cpp:379
+#: po/rc.cpp:443 rc.cpp:443
 msgid "<html><head/><body><p>Welcome to Cantata</p></body></html>"
 msgstr ""
 "<html><head/><body><p>Добро пожаловать в программу Cantata!</p></body></html>"
 
 #. i18n: file: gui/initialsettingswizard.ui:128
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:382 rc.cpp:382
+#: po/rc.cpp:446 rc.cpp:446
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4603,13 +4958,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:166
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:385 rc.cpp:385
+#: po/rc.cpp:449 rc.cpp:449
 msgid "Standard multi-user/server setup"
 msgstr "Стандартная серверная многопользовательская настройка"
 
 #. i18n: file: gui/initialsettingswizard.ui:179
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:388 rc.cpp:388
+#: po/rc.cpp:452 rc.cpp:452
 msgid ""
 "<i>Select this option if your music collection is shared between users, your "
 "MPD instance is running on another machine, or you already have a personal "
@@ -4625,13 +4980,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:211
 #. i18n: ectx: property (text), widget (QRadioButton, basic)
-#: po/rc.cpp:391 rc.cpp:391
+#: po/rc.cpp:455 rc.cpp:455
 msgid "Basic single user setup"
 msgstr "Базовая настройка для одного пользователя"
 
 #. i18n: file: gui/initialsettingswizard.ui:224
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
-#: po/rc.cpp:394 rc.cpp:394
+#: po/rc.cpp:458 rc.cpp:458
 msgid ""
 "<i>Select this option if your music collection is not shared with others, "
 "and you wish Cantata to configure and control the MPD instance.</i>"
@@ -4642,7 +4997,7 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:397 rc.cpp:397
+#: po/rc.cpp:461 rc.cpp:461
 msgid ""
 "<html><head/><body><p>For more information on MPD itself, please refer to "
 "the MPD website <a href=\"http://www.musicpd.org\"><span style=\" text-"
@@ -4658,13 +5013,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:400 rc.cpp:400
+#: po/rc.cpp:464 rc.cpp:464
 msgid "Connection details"
 msgstr "Подробности соединения"
 
 #. i18n: file: gui/initialsettingswizard.ui:341
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:403 rc.cpp:403
+#: po/rc.cpp:467 rc.cpp:467
 msgid ""
 "The settings below are the basic settings required by Cantata. Please enter "
 "the relevant details, and use the 'Connect' button to test the connection."
@@ -4681,16 +5036,18 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: gui/serversettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
-#: po/rc.cpp:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
+#: po/rc.cpp:470 po/rc.cpp:796 rc.cpp:470 rc.cpp:796
 msgid "Host (or local socket):"
 msgstr "Хост (или локальный сокет):"
 
 #. i18n: file: gui/initialsettingswizard.ui:494
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:421 rc.cpp:421
+#: po/rc.cpp:485 rc.cpp:485
+#, fuzzy
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
-"lyrics, etc.</i>"
+"lyrics, etc. If you're MPD instance is on a remote host, you may set this to "
+"a HTTP URL.</i>"
 msgstr ""
 "<i><b>ВНИМАНИЕ:</b> настройка «папка с музыкой» используется для поиска "
 "обложек, текстов песен и т.п.</i>"
@@ -4703,7 +5060,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
 #. i18n: file: gui/serversettings.ui:225
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#: po/rc.cpp:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
+#: po/rc.cpp:488 po/rc.cpp:820 rc.cpp:488 rc.cpp:820
 msgid ""
 "<i><b>NOTE:</b> When using a local socket the full absolute path to the "
 "socket needs to be set. (Port number is not required.)</i>"
@@ -4713,25 +5070,25 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:553
 #. i18n: ectx: property (text), widget (QLabel, label_13)
-#: po/rc.cpp:427 rc.cpp:427
+#: po/rc.cpp:491 rc.cpp:491
 msgid "Music folder"
 msgstr "Папка с музыкой"
 
 #. i18n: file: gui/initialsettingswizard.ui:576
 #. i18n: ectx: property (text), widget (QLabel, label_12)
-#: po/rc.cpp:430 rc.cpp:430
+#: po/rc.cpp:494 rc.cpp:494
 msgid "Please choose the folder containing your music collection."
 msgstr "Выбрать папку, в которой хранится ваша музыкальная коллекция."
 
 #. i18n: file: gui/initialsettingswizard.ui:662
 #. i18n: ectx: property (text), widget (QLabel, label_6f)
-#: po/rc.cpp:436 rc.cpp:436
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Covers, Lyrics, and Streams"
 msgstr "Обложки, тексты и потоки."
 
 #. i18n: file: gui/initialsettingswizard.ui:685
 #. i18n: ectx: property (text), widget (QLabel, label_5f)
-#: po/rc.cpp:439 rc.cpp:439
+#: po/rc.cpp:503 rc.cpp:503
 msgid ""
 "<p>Cantata will download missing covers, and lyrics, from the internet. "
 "Cantata also allows you to save a list of internet streams (e.g. Radio "
@@ -4745,9 +5102,9 @@ msgstr ""
 "необходимо указывать, сохранять ли его в папке с музыкой либо в ваших "
 "персональных папках для настроек и кеша.</p>"
 
-#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: file: gui/initialsettingswizard.ui:758
 #. i18n: ectx: property (text), widget (QLabel, persNote)
-#: po/rc.cpp:454 rc.cpp:454
+#: po/rc.cpp:518 rc.cpp:518
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
 "the music folder, and you do not have write access to this folder, then "
@@ -4767,27 +5124,37 @@ msgstr ""
 "сохранять потоки в папку с музыкой, тогда они будут сохраняться вв вашей "
 "локальной папке с настройками, и будут доступны только вам.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:824
-#. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:457 rc.cpp:457
+#. i18n: file: gui/initialsettingswizard.ui:784
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:521 rc.cpp:521
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. i.e. 'Artist/Album/Tracks'."
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/initialsettingswizard.ui:810
+#. i18n: ectx: property (text), widget (StateLabel, httpNote)
+#: po/rc.cpp:524 rc.cpp:524
+#, fuzzy
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata "
 "currently cannot upload files to external HTTP servers. Therefore, the above "
-"settings should be left disabled.</i>"
+"settings should be left un-checked.</i>"
 msgstr ""
 "<i><b>ВНИМАНИЕ:</b> «папка с музыкой» привязана к адресу HTTP, а в настоящий "
 "момент Cantata не может заливать файлы на внешние серверы HTTP. Поэтому "
 "настройки выше должны оставаться отключёнными.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:857
+#. i18n: file: gui/initialsettingswizard.ui:843
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:460 rc.cpp:460
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Finished!"
 msgstr "Готово!"
 
-#. i18n: file: gui/initialsettingswizard.ui:880
+#. i18n: file: gui/initialsettingswizard.ui:866
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:463 rc.cpp:463
+#: po/rc.cpp:530 rc.cpp:530
 msgid ""
 "Cantata is now configured! If you wish to further configure Cantata (to add "
 "extra MPD hosts, etc) then Canta's configuration dialog may be accessed from "
@@ -4797,9 +5164,9 @@ msgstr ""
 "(добавление дополнительных хостов MPD и т.п.) зайдите в диалог настройки, "
 "нажав на кнопку в верхнем правом углу главного окна Cantata."
 
-#. i18n: file: gui/initialsettingswizard.ui:918
+#. i18n: file: gui/initialsettingswizard.ui:904
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:466 rc.cpp:466
+#: po/rc.cpp:533 rc.cpp:533
 msgid ""
 "<b>Warning:</b> You are not currently a member of the 'users' group. Cantata "
 "will function better (saving of album covers, lyrics, etc. with the correct "
@@ -4814,40 +5181,106 @@ msgstr ""
 "применения настройки, будет необходимо закончить текущий сеанс пользователя "
 "и снова войти в систему."
 
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:36
+#. i18n: ectx: attribute (title), widget (QWidget, sidebarTab)
+#: po/rc.cpp:536 rc.cpp:536
+#, fuzzy
+msgid "Sidebar"
+msgstr "Большая панель"
+
+#. i18n: file: gui/interfacesettings.ui:42
+#. i18n: ectx: property (title), widget (QGroupBox, viewsGroup)
+#: po/rc.cpp:539 rc.cpp:539
+msgid "Views"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:48
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:542 rc.cpp:542
+msgid "Use the checkboxes below to configure the list of active views."
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, sbPlayQueueLabel)
+#: po/rc.cpp:545 rc.cpp:545
+msgid ""
+"<i><b>NOTE:</b> By default, the play queue appears to the side of the other "
+"views. If you enable the option above, then it will be merged into the "
+"sidebar as per other views.</i>"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:106
+#. i18n: ectx: property (text), widget (StateLabel, sbInfoLabel)
+#: po/rc.cpp:548 rc.cpp:548
+msgid ""
+"<i><b>NOTE:</b> By default, the 'Info' (current song information) view is "
+"accessible by pressing its icon in the main toolbar. If you enable the "
+"option above, then it will be merged into the sidebar as per other views.</i>"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:144
+#. i18n: ectx: property (text), widget (BuddyLabel, sbPositionLabel)
+#: po/rc.cpp:557 rc.cpp:557
+#, fuzzy
+msgid "Position:"
+msgstr "Коллекция:"
+
+#. i18n: file: gui/interfacesettings.ui:157
+#. i18n: ectx: property (text), widget (QCheckBox, sbIconsOnly)
+#: po/rc.cpp:560 rc.cpp:560
+#, fuzzy
+msgid "Only show icons, no text"
+msgstr "Показывать только основной текст wikipedia"
+
+#. i18n: file: gui/interfacesettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, sbMonoIcons)
+#: po/rc.cpp:563 rc.cpp:563
+#, fuzzy
+msgid "Use monochrome icons"
+msgstr "Монохромные значки"
+
+#. i18n: file: gui/interfacesettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, sbAutoHide)
+#: po/rc.cpp:566 rc.cpp:566
+#, fuzzy
+msgid "Auto-hide"
+msgstr "Автоскрытие"
+
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#: po/rc.cpp:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
+#: po/rc.cpp:575 po/rc.cpp:594 rc.cpp:575 rc.cpp:594
 msgid "Covers:"
 msgstr "Обложки:"
 
-#. i18n: file: gui/interfacesettings.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:478 rc.cpp:478
-msgid "Show artist images:"
+#. i18n: file: gui/interfacesettings.ui:219
+#. i18n: ectx: property (text), widget (QCheckBox, libraryArtistImage)
+#: po/rc.cpp:578 rc.cpp:578
+#, fuzzy
+msgid "Show artist images"
 msgstr "Показывать изображение исполнителя:"
 
-#. i18n: file: gui/interfacesettings.ui:81
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:481 rc.cpp:481
-msgid "Show album year:"
+#. i18n: file: gui/interfacesettings.ui:226
+#. i18n: ectx: property (text), widget (QCheckBox, libraryYear)
+#: po/rc.cpp:581 rc.cpp:581
+#, fuzzy
+msgid "Show album year"
 msgstr "Показывать год альбома:"
 
-#. i18n: file: gui/interfacesettings.ui:123
+#. i18n: file: gui/interfacesettings.ui:258
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:484 rc.cpp:484
+#: po/rc.cpp:584 rc.cpp:584
+#, fuzzy
 msgid ""
 "<i><b>NOTE:</b> When looking for artist images, Cantata will look for either "
 "artist.jpg, artist.png, 'Artist'.jpg, or 'Artist'.png,\n"
 "within the folder of the current track, or within its parent folder. If no "
-"image is found, Cantata will attempt to download one. When the image is "
-"displayed, it will be cropped (either top/bottom, or left/right) to provide "
-"a square image.</i>"
+"image is found, Cantata will attempt to download one.</i>"
 msgstr ""
 "<i><b>ВНИМАНИЕ:</b> при поиске изображений исполнителей Cantata будет искать "
 "файлы artist.jpg, artist.png, 'Artist'.jpg или 'Artist'.png\n"
@@ -4856,165 +5289,215 @@ msgstr ""
 "изображение будет обрезано (сверху/снизу или справа/слева) до получения "
 "квадрата.</i>"
 
-#. i18n: file: gui/interfacesettings.ui:172
+#. i18n: file: gui/interfacesettings.ui:307
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:497 rc.cpp:497
+#: po/rc.cpp:597 rc.cpp:597
 msgid "Sort albums:"
 msgstr "Сортировать альбомы:"
 
-#. i18n: file: gui/interfacesettings.ui:183
+#. i18n: file: gui/interfacesettings.ui:318
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:500 rc.cpp:500
+#: po/rc.cpp:600 rc.cpp:600
 msgid "Album/Artist"
 msgstr "Альбом/Исполнитель"
 
-#. i18n: file: gui/interfacesettings.ui:188
+#. i18n: file: gui/interfacesettings.ui:323
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:503 rc.cpp:503
+#: po/rc.cpp:603 rc.cpp:603
 msgid "Artist/Album"
 msgstr "Исполнитель/Альбом"
 
-#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: file: gui/interfacesettings.ui:328
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:506 rc.cpp:506
+#: po/rc.cpp:606 rc.cpp:606
 msgid "Artist/Year/Album"
 msgstr "Исполнитель/Год/Альбом"
 
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#: po/rc.cpp:515 po/rc.cpp:545 rc.cpp:515 rc.cpp:545
-msgid "Initially collapse albums:"
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#: po/rc.cpp:615 po/rc.cpp:645 rc.cpp:615 rc.cpp:645
+#, fuzzy
+msgid "Initially collapse albums"
 msgstr "Сворачивать альбомы изначально:"
 
-#. i18n: file: gui/interfacesettings.ui:242
+#. i18n: file: gui/interfacesettings.ui:367
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:518 rc.cpp:518
+#: po/rc.cpp:618 rc.cpp:618
 msgid "Other Views"
 msgstr "Другие типы просмотра"
 
-#. i18n: file: gui/interfacesettings.ui:251
+#. i18n: file: gui/interfacesettings.ui:376
 #. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
-#: po/rc.cpp:521 rc.cpp:521
+#: po/rc.cpp:621 rc.cpp:621
 msgid "Folder view style:"
 msgstr "Тип просмотра папки:"
 
-#. i18n: file: gui/interfacesettings.ui:264
+#. i18n: file: gui/interfacesettings.ui:389
 #. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
-#: po/rc.cpp:524 rc.cpp:524
+#: po/rc.cpp:624 rc.cpp:624
 msgid "Streams view style:"
 msgstr "Тип просмотра потоков:"
 
-#. i18n: file: gui/interfacesettings.ui:277
+#. i18n: file: gui/interfacesettings.ui:402
 #. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
-#: po/rc.cpp:527 rc.cpp:527
+#: po/rc.cpp:627 rc.cpp:627
 msgid "Online view style:"
 msgstr "Тип он-лайн просмотра:"
 
-#. i18n: file: gui/interfacesettings.ui:290
+#. i18n: file: gui/interfacesettings.ui:415
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:530 rc.cpp:530
+#: po/rc.cpp:630 rc.cpp:630
 msgid "Devices view style:"
 msgstr "Тип просмотра устройств:"
 
-#. i18n: file: gui/interfacesettings.ui:324
-#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:539 rc.cpp:539
-msgid "Table"
-msgstr "Таблица"
-
-#. i18n: file: gui/interfacesettings.ui:354
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueAutoExpandLabel)
-#: po/rc.cpp:548 rc.cpp:548
-msgid "Automatically expand current album:"
+#. i18n: file: gui/interfacesettings.ui:469
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueAutoExpand)
+#: po/rc.cpp:648 rc.cpp:648
+#, fuzzy
+msgid "Automatically expand current album"
 msgstr "Автоматически разворачивать текущий альбом:"
 
-#. i18n: file: gui/interfacesettings.ui:371
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueScrollLabel)
-#: po/rc.cpp:551 rc.cpp:551
-msgid "Scroll to current track:"
+#. i18n: file: gui/interfacesettings.ui:476
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueScroll)
+#: po/rc.cpp:651 rc.cpp:651
+#, fuzzy
+msgid "Scroll to current track"
 msgstr "Прокрутить до текущего трека:"
 
-#. i18n: file: gui/interfacesettings.ui:384
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueBackgroundLabel)
-#: po/rc.cpp:554 rc.cpp:554
-msgid "Use current album cover as background:"
-msgstr "Использовать обложку текущего альбома как фон:"
-
-#. i18n: file: gui/interfacesettings.ui:397
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueConfirmClearLabel)
-#: po/rc.cpp:557 rc.cpp:557
-msgid "Prompt before clearing:"
+#. i18n: file: gui/interfacesettings.ui:483
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueConfirmClear)
+#: po/rc.cpp:654 rc.cpp:654
+#, fuzzy
+msgid "Prompt before clearing"
 msgstr "Подтверждение очистки:"
 
-#. i18n: file: gui/interfacesettings.ui:411
+#. i18n: file: gui/interfacesettings.ui:509
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_cover)
+#: po/rc.cpp:663 rc.cpp:663
+#, fuzzy
+msgid "Current album cover"
+msgstr "Скопировать обложки альбома как:"
+
+#. i18n: file: gui/interfacesettings.ui:638
 #. i18n: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:560 rc.cpp:560
+#: po/rc.cpp:682 rc.cpp:682
 msgid "External"
 msgstr "Внешнее"
 
-#. i18n: file: gui/interfacesettings.ui:417
-#. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:563 rc.cpp:563
-msgid "Show icon in notification area:"
+#. i18n: file: gui/interfacesettings.ui:644
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayPopup)
+#: po/rc.cpp:685 rc.cpp:685
+#, fuzzy
+msgid "Show popup messages when changing tracks"
+msgstr "Показывать всплывающие сообщения при смене трека:"
+
+#. i18n: file: gui/interfacesettings.ui:654
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayCheckBox)
+#: po/rc.cpp:688 rc.cpp:688
+#, fuzzy
+msgid "Show icon in notification area"
 msgstr "Показывать значок в трее:"
 
-#. i18n: file: gui/interfacesettings.ui:437
-#. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:566 rc.cpp:566
-msgid "Minimize to notification area when closed:"
+#. i18n: file: gui/interfacesettings.ui:664
+#. i18n: ectx: property (text), widget (QCheckBox, minimiseOnClose)
+#: po/rc.cpp:691 rc.cpp:691
+#, fuzzy
+msgid "Minimize to notification area when closed"
 msgstr "Свернуть в трей при закрытии:"
 
-#. i18n: file: gui/interfacesettings.ui:457
-#. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:569 rc.cpp:569
-msgid "Show popup messages when changing tracks:"
-msgstr "Показывать всплывающие сообщения при смене трека:"
+#. i18n: file: gui/interfacesettings.ui:671
+#. i18n: ectx: property (title), widget (QGroupBox, startupState)
+#: po/rc.cpp:694 rc.cpp:694
+msgid "On Start-up"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:677
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateShow)
+#: po/rc.cpp:697 rc.cpp:697
+#, fuzzy
+msgid "Show main window"
+msgstr "Показать окно"
 
-#. i18n: file: gui/interfacesettings.ui:475
+#. i18n: file: gui/interfacesettings.ui:684
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateHide)
+#: po/rc.cpp:700 rc.cpp:700
+msgid "Hide main window"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:691
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateRestore)
+#: po/rc.cpp:703 rc.cpp:703
+msgid "Restore previous state"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:715
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:572 rc.cpp:572
+#: po/rc.cpp:706 rc.cpp:706
 msgid "General"
 msgstr "Общее"
 
-#. i18n: file: gui/interfacesettings.ui:486
-#. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:575 rc.cpp:575
-msgid "Group single track albums:"
+#. i18n: file: gui/interfacesettings.ui:726
+#. i18n: ectx: property (text), widget (QCheckBox, groupSingle)
+#: po/rc.cpp:709 rc.cpp:709
+#, fuzzy
+msgid "Group single track albums"
 msgstr "Сортировать альбомы с единственным треком:"
 
-#. i18n: file: gui/interfacesettings.ui:503
-#. i18n: ectx: property (text), widget (BuddyLabel, useComposerLabel)
-#: po/rc.cpp:578 rc.cpp:578
-msgid "Group albums by composer:"
+#. i18n: file: gui/interfacesettings.ui:733
+#. i18n: ectx: property (text), widget (QCheckBox, useComposer)
+#: po/rc.cpp:712 rc.cpp:712
+#, fuzzy
+msgid "Group albums by composer"
 msgstr "Сортировать альбомы по автору музыки:"
 
-#. i18n: file: gui/interfacesettings.ui:520
-#. i18n: ectx: property (text), widget (BuddyLabel, groupMultipleLabel)
-#: po/rc.cpp:581 rc.cpp:581
-msgid "Multiple artist albums:"
-msgstr "Альбомы с несколькими исполнителями:"
+#. i18n: file: gui/interfacesettings.ui:740
+#. i18n: ectx: property (text), widget (QCheckBox, groupMultiple)
+#: po/rc.cpp:715 rc.cpp:715
+#, fuzzy
+msgid "Group multiple artist albums under 'Various Artists'"
+msgstr "Отсортировано по «Нескольким исполнителям»"
 
-#. i18n: file: gui/interfacesettings.ui:533
-#. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:584 rc.cpp:584
-msgid "Show delete action in context menus:"
+#. i18n: file: gui/interfacesettings.ui:747
+#. i18n: ectx: property (text), widget (QCheckBox, fetchCovers)
+#: po/rc.cpp:718 rc.cpp:718
+msgid "Fetch missing covers from Last.fm"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:754
+#. i18n: ectx: property (text), widget (QCheckBox, cacheScaledCovers)
+#: po/rc.cpp:721 rc.cpp:721
+msgid "Cache scaled covers"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:761
+#. i18n: ectx: property (text), widget (QCheckBox, showDeleteAction)
+#: po/rc.cpp:724 rc.cpp:724
+#, fuzzy
+msgid "Show delete action in context menus"
 msgstr "Показывать пункт удаления в контекстных меню:"
 
-#. i18n: file: gui/interfacesettings.ui:550
-#. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:587 rc.cpp:587
-msgid "Enforce single-click activation of items:"
+#. i18n: file: gui/interfacesettings.ui:768
+#. i18n: ectx: property (text), widget (QCheckBox, forceSingleClick)
+#: po/rc.cpp:727 rc.cpp:727
+#, fuzzy
+msgid "Enforce single-click activation of items"
 msgstr "Принудительно включить выделение элементов по одному щелчку:"
 
-#. i18n: file: gui/interfacesettings.ui:591
+#. i18n: file: gui/interfacesettings.ui:775
+#. i18n: ectx: property (text), widget (BuddyLabel, langLabel)
+#: po/rc.cpp:730 rc.cpp:730
+msgid "Language:"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:806
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:590 rc.cpp:590
+#: po/rc.cpp:733 rc.cpp:733
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
@@ -5022,89 +5505,105 @@ msgstr ""
 "<i><b>ВНИМАНИЕ:</b> настройка «Принудительно включить выделение элементов по "
 "одному щелчку» потребует перезапуска программы Cantata.</i>"
 
-#. i18n: file: gui/mainwindow.ui:287
+#. i18n: file: gui/interfacesettings.ui:835
+#. i18n: ectx: property (text), widget (StateLabel, langNoteLabel)
+#: po/rc.cpp:736 rc.cpp:736
+#, fuzzy
+msgid ""
+"<i><b>NOTE:</b> Changing the language setting will require a re-start of "
+"Cantata.</i>"
+msgstr ""
+"<i><b>ВНИМАНИЕ:</b> настройка «Принудительно включить выделение элементов по "
+"одному щелчку» потребует перезапуска программы Cantata.</i>"
+
+#. i18n: file: gui/mainwindow.ui:298
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:593 rc.cpp:593
+#: po/rc.cpp:739 rc.cpp:739
 msgid "[Dynamic]"
 msgstr "[Динамический]"
 
-#. i18n: file: gui/playbacksettings.ui:20
+#. i18n: file: gui/playbacksettings.ui:38
+#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
+#: po/rc.cpp:745 rc.cpp:745
+msgid "Fadeout on stop:"
+msgstr "Затухание при остановке:"
+
+#. i18n: file: gui/playbacksettings.ui:48
+#. i18n: ectx: property (suffix), widget (QSpinBox, stopFadeDuration)
+#: po/rc.cpp:748 rc.cpp:748
+msgid " ms"
+msgstr " мс"
+
+#. i18n: file: gui/playbacksettings.ui:58
+#. i18n: ectx: property (text), widget (QCheckBox, stopOnExit)
+#: po/rc.cpp:754 rc.cpp:754
+msgid "Stop playback on exit"
+msgstr "Остановить воспроизведение при выходе из программы"
+
+#. i18n: file: gui/playbacksettings.ui:65
+#. i18n: ectx: property (text), widget (QCheckBox, stopDynamizerOnExit)
+#: po/rc.cpp:757 rc.cpp:757
+msgid "Stop dynamizer on exit"
+msgstr "Остановить dynamizer при выходе из программы"
+
+#. i18n: file: gui/playbacksettings.ui:72
+#. i18n: ectx: property (text), widget (QCheckBox, inhibitSuspend)
+#: po/rc.cpp:760 rc.cpp:760
+msgid "Inhibit suspend whilst playing"
+msgstr "Блокировать активацию ждущего режима во время проигрывания"
+
+#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:763 rc.cpp:763
+msgid ""
+"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
+"shown allowing you to choose whether to stop playback now, or after the "
+"current track.</i>"
+msgstr ""
+"<i><b>ВНИМАНИЕ:</b> если нажать и удерживать кнопку «стоп», то будет "
+"показано меню, где можно выбрать, остановить ли воспроизведение сейчас или "
+"после окончания текущей композиции.</i>"
+
+#. i18n: file: gui/playbacksettings.ui:108
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:596 rc.cpp:596
+#: po/rc.cpp:766 rc.cpp:766
 msgid "Output"
 msgstr "Вывод"
 
-#. i18n: file: gui/playbacksettings.ui:41
+#. i18n: file: gui/playbacksettings.ui:129
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:602 rc.cpp:602
-msgid "Crossfading:"
-msgstr "Перекрёстное затухание:"
+#: po/rc.cpp:772 rc.cpp:772
+msgid "Crossfade between tracks:"
+msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:51
-#. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:605 rc.cpp:605
-msgid " seconds"
-msgstr " секунд"
+#. i18n: file: gui/playbacksettings.ui:139
+#. i18n: ectx: property (suffix), widget (QSpinBox, crossfading)
+#: po/rc.cpp:775 rc.cpp:775
+#, fuzzy
+msgid " s"
+msgstr " мс"
 
-#. i18n: file: gui/playbacksettings.ui:61
+#. i18n: file: gui/playbacksettings.ui:152
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:608 rc.cpp:608
+#: po/rc.cpp:781 rc.cpp:781
 msgid "Replay gain:"
 msgstr "Replay gain:"
 
-#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: file: gui/playbacksettings.ui:195
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:611 rc.cpp:611
+#: po/rc.cpp:784 rc.cpp:784
 msgid "About replay gain"
 msgstr "Информация о replay gain"
 
-#. i18n: file: gui/playbacksettings.ui:104
+#. i18n: file: gui/playbacksettings.ui:204
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:614 rc.cpp:614
-msgid "Devices:"
-msgstr "Устройства:"
-
-#. i18n: file: gui/playbacksettings.ui:141
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:620 rc.cpp:620
-msgid "Fadeout on stop:"
-msgstr "Затухание при остановке:"
-
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:623 rc.cpp:623
-msgid "Stop playback on exit:"
-msgstr "Остановить воспроизведение при выходе из программы:"
-
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:626 rc.cpp:626
-msgid "Stop dynamizer on exit:"
-msgstr "Остановить dynamizer при выходе из программы:"
-
-#. i18n: file: gui/playbacksettings.ui:184
-#. i18n: ectx: property (text), widget (BuddyLabel, inhibitSuspendLabel)
-#: po/rc.cpp:629 rc.cpp:629
-msgid "Inhibit suspend whilst playing:"
-msgstr ""
-"Блокировать активацию ждущего режима "
-"во время проигрывания:"
-
-#. i18n: file: gui/playbacksettings.ui:217
-#. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:632 rc.cpp:632
-msgid ""
-"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
-"shown allowing you to choose whether to stop playback now, or after the "
-"current track.</i>"
+#: po/rc.cpp:787 rc.cpp:787
+msgid "Use the checkboxes below to control the active outputs."
 msgstr ""
-"<i><b>ВНИМАНИЕ:</b> если нажать и удерживать кнопку «стоп», то будет "
-"показано меню, где можно выбрать, остановить ли воспроизведение сейчас или "
-"после окончания текущей композиции.</i>"
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:635 rc.cpp:635
+#: po/rc.cpp:790 rc.cpp:790
 msgid "Collection:"
 msgstr "Коллекция:"
 
@@ -5116,25 +5615,25 @@ msgstr "Коллекция:"
 #. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
 #. i18n: file: gui/serversettings.ui:338
 #. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
-#: po/rc.cpp:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
+#: po/rc.cpp:808 po/rc.cpp:829 rc.cpp:808 rc.cpp:829
 msgid "Cover filename:"
 msgstr "Имя файла обложки:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:656 rc.cpp:656
+#: po/rc.cpp:811 rc.cpp:811
 msgid "Dynamizer port:"
 msgstr "Порт Dynamizer:"
 
 #. i18n: file: gui/serversettings.ui:168
 #. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
-#: po/rc.cpp:659 rc.cpp:659
+#: po/rc.cpp:814 rc.cpp:814
 msgid "HTTP stream URL:"
 msgstr "Адрес потока HTTP:"
 
 #. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:662 rc.cpp:662
+#: po/rc.cpp:817 rc.cpp:817
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art "
 "(either the value specified above, or <code>cover.jpg / cover.png</code> if "
@@ -5150,19 +5649,19 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:277
 #. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
-#: po/rc.cpp:668 rc.cpp:668
+#: po/rc.cpp:823 rc.cpp:823
 msgid ""
 "<i><b>NOTE:</b> 'HTTP Stream URL' is only of use if you have MPD configured "
 "to output to a HTTP stream, and you wish Cantata to be able to play that "
 "stream.</i>"
 msgstr ""
-"<i><b>ВНИМАНИЕ:</b> параметр «адрес потока HTTP» можно использовать, "
-"только если вывод MPD настроен на HTTP-поток, и вам нужно, чтобы Cantata "
-"умела его проигрывать.</i>"
+"<i><b>ВНИМАНИЕ:</b> параметр «адрес потока HTTP» можно использовать, только "
+"если вывод MPD настроен на HTTP-поток, и вам нужно, чтобы Cantata умела его "
+"проигрывать.</i>"
 
 #. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:677 rc.cpp:677
+#: po/rc.cpp:832 rc.cpp:832
 msgid ""
 "<i><b>NOTE:</b> If you change the 'Music folder' setting, then you will need "
 "to manually update the music database. This can be performed by pressing the "
@@ -5174,7 +5673,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:379
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel_2)
-#: po/rc.cpp:680 rc.cpp:680
+#: po/rc.cpp:835 rc.cpp:835
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -5184,19 +5683,13 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:683 rc.cpp:683
+#: po/rc.cpp:838 rc.cpp:838
 msgid "Network interface:"
 msgstr "Сетевой интерфейс:"
 
-#. i18n: file: http/httpserversettings.ui:38
-#. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:686 rc.cpp:686
-msgid "Current URL:"
-msgstr "Текущий URL:"
-
-#. i18n: file: http/httpserversettings.ui:73
+#. i18n: file: http/httpserversettings.ui:57
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:689 rc.cpp:689
+#: po/rc.cpp:841 rc.cpp:841
 msgid ""
 "<i><b>NOTE:</b> MPD usually only plays songs that are stored within its "
 "folders. Cantata contains a minimal HTTP server that can be used to serve "
@@ -5214,35 +5707,31 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:693 rc.cpp:693
+#: po/rc.cpp:845 rc.cpp:845
 msgid "Mode:"
 msgstr "Режим:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:699 rc.cpp:699
+#: po/rc.cpp:851 rc.cpp:851
 msgid "HTTP Proxy"
 msgstr "HTTP-прокси"
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:702 rc.cpp:702
+#: po/rc.cpp:854 rc.cpp:854
 msgid "SOCKS Proxy"
 msgstr "SOCKS прокси"
 
 #. i18n: file: online/onlinesettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:717 rc.cpp:717
-msgid ""
-"The following is a list of online providers, to hide a provider simply un-"
-"check its entry in this list."
+#: po/rc.cpp:869 rc.cpp:869
+msgid "Use the checkboxes below to configure the list of active services."
 msgstr ""
-"Ниже показан список источников в сети, чтобы «спрятать» источник, "
-"просто уберите соответствующую галочку в списке."
 
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:723 rc.cpp:723
+#: po/rc.cpp:875 rc.cpp:875
 msgid ""
 "You can listen for free without an account, but Premium members can listen "
 "to higher quality streams without advertisements. Visit <a href=\"http://www."
@@ -5256,38 +5745,38 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:726 rc.cpp:726
+#: po/rc.cpp:878 rc.cpp:878
 msgid "Premium Account"
 msgstr "Учётная запись Premium"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:735 rc.cpp:735
+#: po/rc.cpp:887 rc.cpp:887
 msgid "Stream type:"
 msgstr "Тип потока:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:738 rc.cpp:738
+#: po/rc.cpp:890 rc.cpp:890
 msgid "Status:"
 msgstr "Статус:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:109
 #. i18n: ectx: property (text), widget (QPushButton, loginButton)
-#: po/rc.cpp:741 streams/digitallyimportedsettings.cpp:130
-#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
+#: po/rc.cpp:893 streams/digitallyimportedsettings.cpp:131
+#: streams/digitallyimportedsettings.cpp:137 rc.cpp:893
 msgid "Login"
 msgstr "Логин"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:747 rc.cpp:747
+#: po/rc.cpp:899 rc.cpp:899
 msgid "Session expiry:"
 msgstr "Сеанс истекает:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:151
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:750 rc.cpp:750
+#: po/rc.cpp:902 rc.cpp:902
 msgid ""
 "<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
 "RockRadio.com, and Sky.fm</i>"
@@ -5297,167 +5786,157 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:161
 #. i18n: ectx: property (text), widget (QLabel, note2Label)
-#: po/rc.cpp:753 rc.cpp:753
+#: po/rc.cpp:905 rc.cpp:905
 msgid ""
 "<i><b>NOTE:</b> If you enter account details, then a 'DI' status item will "
 "appear under the list of streams. This will indicate if you are logged in or "
 "not</i>"
 msgstr ""
-"<i><b>ВНИМАНИЕ:</b> При выборе настроек учётной записи, под списком "
-"потоков будет показан значок-индикатор авторизации ('DI'), изменяющийся "
-"в зависимости от того, был ли выполнен вход или нет.</i>"
+"<i><b>ВНИМАНИЕ:</b> При выборе настроек учётной записи, под списком потоков "
+"будет показан значок-индикатор авторизации ('DI'), изменяющийся в "
+"зависимости от того, был ли выполнен вход или нет.</i>"
 
 #. i18n: file: streams/streamssettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:756 rc.cpp:756
-msgid ""
-"The following is a list of the top-level stream categories, to hide a "
-"category simply un-check its entry in this list."
+#: po/rc.cpp:908 rc.cpp:908
+msgid "Use the checkboxes below to configure the list of active providers."
 msgstr ""
-"Ниже показан список самых популярных категорий потокового аудио, чтобы "
-"«спрятать» категорию, просто уберите соответствующую галочку в списке."
 
 #. i18n: file: streams/streamssettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: po/rc.cpp:759 rc.cpp:759
+#: po/rc.cpp:911 rc.cpp:911
 msgid "Configure Provider"
 msgstr "Настроить источник"
 
 #. i18n: file: streams/streamssettings.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, installButton)
-#: po/rc.cpp:762 rc.cpp:762
+#: po/rc.cpp:914 rc.cpp:914
 msgid "Install"
 msgstr "Установить"
 
 #. i18n: file: streams/streamssettings.ui:80
 #. i18n: ectx: property (text), widget (QLabel, note)
-#: po/rc.cpp:768 rc.cpp:768
+#: po/rc.cpp:920 rc.cpp:920
 msgid ""
 "<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
 "removed.</i>"
 msgstr ""
-"<i><b>ВНИМАНИЕ:</b> встроенные категории показываются курсивом, и их "
-"удалить нельзя.</i>"
+"<i><b>ВНИМАНИЕ:</b> встроенные категории показываются курсивом, и их удалить "
+"нельзя.</i>"
 
 #. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:771 rc.cpp:771
+#: po/rc.cpp:923 rc.cpp:923
 msgid "Search:"
 msgstr "Поиск:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:65
 #. i18n: ectx: property (title), widget (QGroupBox, actionBox)
-#: po/rc.cpp:774 rc.cpp:774
+#: po/rc.cpp:926 rc.cpp:926
 msgid "Shortcut for Selected Action"
 msgstr "Горячие клавиши для выбранного действия"
 
 #. i18n: file: support/shortcutssettingswidget.ui:71
 #. i18n: ectx: property (text), widget (QRadioButton, useDefault)
-#: po/rc.cpp:777 rc.cpp:777
+#: po/rc.cpp:929 rc.cpp:929
 msgid "Default:"
 msgstr "По умолчанию:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:85
 #. i18n: ectx: property (text), widget (QRadioButton, useCustom)
-#: po/rc.cpp:783 rc.cpp:783
+#: po/rc.cpp:935 rc.cpp:935
 msgid "Custom:"
 msgstr "Пользовательский:"
 
-#. i18n: file: tags/tageditor.ui:25
-#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:786 rc.cpp:786
-msgid "Track:"
-msgstr "Трек:"
-
 #. i18n: file: tags/tageditor.ui:64
 #. i18n: ectx: property (text), widget (StateLabel, albumArtistLabel)
-#: po/rc.cpp:795 rc.cpp:795
+#: po/rc.cpp:947 rc.cpp:947
 msgid "Album artist:"
 msgstr "Исполнитель альбома:"
 
 #. i18n: file: tags/tageditor.ui:103
 #. i18n: ectx: property (text), widget (StateLabel, trackLabel)
-#: po/rc.cpp:804 rc.cpp:804
+#: po/rc.cpp:956 rc.cpp:956
 msgid "Track number:"
 msgstr "Номер трека:"
 
 #. i18n: file: tags/tageditor.ui:116
 #. i18n: ectx: property (text), widget (StateLabel, discLabel)
-#: po/rc.cpp:807 rc.cpp:807
+#: po/rc.cpp:959 rc.cpp:959
 msgid "Disc number:"
 msgstr "Номер диска:"
 
-#. i18n: file: tags/trackorganiser.ui:155
+#. i18n: file: tags/trackorganiser.ui:115
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:834 rc.cpp:834
+#: po/rc.cpp:989 rc.cpp:989
 msgid "Original Name"
 msgstr "Исходное название"
 
-#. i18n: file: tags/trackorganiser.ui:160
+#. i18n: file: tags/trackorganiser.ui:120
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:837 rc.cpp:837
+#: po/rc.cpp:992 rc.cpp:992
 msgid "New Name"
 msgstr "Новое название"
 
-#: po/rc.cpp:838 rc.cpp:838
+#: po/rc.cpp:996 rc.cpp:996
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "Юлия Дронова"
 
-#: po/rc.cpp:839 rc.cpp:839
+#: po/rc.cpp:997 rc.cpp:997
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "juliette.tux at gmail.com"
 
-#: replaygain/rgdialog.cpp:121
+#: replaygain/rgdialog.cpp:116
 msgid "Show All Tracks"
 msgstr "Показать все треки"
 
-#: replaygain/rgdialog.cpp:122
+#: replaygain/rgdialog.cpp:117
 msgid "Show Untagged Tracks"
 msgstr "Показать треки без тегов"
 
-#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:124 tags/trackorganiser.cpp:79
 msgid "Remove From List"
 msgstr "Удалить из списка"
 
-#: replaygain/rgdialog.cpp:136
+#: replaygain/rgdialog.cpp:131
 msgid "Album Gain"
 msgstr "Album Gain"
 
-#: replaygain/rgdialog.cpp:137
+#: replaygain/rgdialog.cpp:132
 msgid "Track Gain"
 msgstr "Track Gain"
 
-#: replaygain/rgdialog.cpp:138
+#: replaygain/rgdialog.cpp:133
 msgid "Album Peak"
 msgstr "Album Peak"
 
-#: replaygain/rgdialog.cpp:139
+#: replaygain/rgdialog.cpp:134
 msgid "Track Peak"
 msgstr "Track Peak"
 
-#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
+#: replaygain/rgdialog.cpp:154 replaygain/rgdialog.cpp:283
 msgid "Scan"
 msgstr "Сканировать"
 
-#: replaygain/rgdialog.cpp:238
+#: replaygain/rgdialog.cpp:233
 msgid "Update ReplayGain tags in tracks?"
 msgstr "Обновить теги ReplayGain для  треков?"
 
-#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
+#: replaygain/rgdialog.cpp:233 replaygain/rgdialog.cpp:234
 msgid "Update Tags"
 msgstr "Обновить теги"
 
-#: replaygain/rgdialog.cpp:252
+#: replaygain/rgdialog.cpp:247
 msgid "Abort scanning of tracks?"
 msgstr "Прервать сканирование треков?"
 
-#: replaygain/rgdialog.cpp:261
+#: replaygain/rgdialog.cpp:256
 msgid "Abort reading of existing tags?"
 msgstr "Прервать чтение существующих тегов?"
 
-#: replaygain/rgdialog.cpp:287
+#: replaygain/rgdialog.cpp:282
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
@@ -5465,62 +5944,62 @@ msgstr ""
 "Сканировать <b>все</b> треки?<br><br><i>ВНИМАНИЕ: у всех треков уже есть "
 "теги ReplyGain.</i>"
 
-#: replaygain/rgdialog.cpp:289
+#: replaygain/rgdialog.cpp:284
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr "Сканировать все треки, или только треки без существующих тегов?"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "Untagged Tracks"
 msgstr "Треки без тегов"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "All Tracks"
 msgstr "Все треки"
 
-#: replaygain/rgdialog.cpp:300
+#: replaygain/rgdialog.cpp:295
 msgid "Scanning tracks..."
 msgstr "Сканирование треков..."
 
-#: replaygain/rgdialog.cpp:367
+#: replaygain/rgdialog.cpp:362
 msgid "Reading existing tags..."
 msgstr "Чтение существующих треков..."
 
-#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+#: replaygain/rgdialog.cpp:414 tags/tageditor.cpp:798
 msgctxt "filename (Timeout)"
 msgid "%1 (Timeout)"
 msgstr "%1 (тайм-аут)"
 
-#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:802
 msgctxt "filename (Corrupt tags?)"
 msgid "%1 (Corrupt tags?)"
 msgstr "%1 (испорченные теги?)"
 
-#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
+#: replaygain/rgdialog.cpp:432 tags/tageditor.cpp:812
 msgid "Failed to update the tags of the following tracks:"
 msgstr "Сбой обновления тегов для следующих треков:"
 
-#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
-#: tags/trackorganiser.cpp:451
+#: replaygain/rgdialog.cpp:473 tags/tageditor.cpp:885
+#: tags/trackorganiser.cpp:483
 msgid "Device is not connected."
 msgstr "Устройство не подключено"
 
-#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
-#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
+#: replaygain/rgdialog.cpp:513 replaygain/rgdialog.cpp:520
+#: replaygain/rgdialog.cpp:599 replaygain/rgdialog.cpp:601
 msgid "%1 dB"
 msgstr "%1 дБ"
 
-#: replaygain/rgdialog.cpp:520 replaygain/rgdialog.cpp:521
-#: replaygain/rgdialog.cpp:527 replaygain/rgdialog.cpp:528
-#: replaygain/rgdialog.cpp:579 replaygain/rgdialog.cpp:580
-#: replaygain/rgdialog.cpp:581 replaygain/rgdialog.cpp:582
+#: replaygain/rgdialog.cpp:516 replaygain/rgdialog.cpp:517
+#: replaygain/rgdialog.cpp:523 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:575 replaygain/rgdialog.cpp:576
+#: replaygain/rgdialog.cpp:577 replaygain/rgdialog.cpp:578
 msgid "Failed"
 msgstr "Произошла ошибка"
 
-#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
+#: replaygain/rgdialog.cpp:651 tags/trackorganiser.cpp:428
 msgid "Remove the selected tracks from the list?"
 msgstr "Удалить выбранные треки из списка?"
 
-#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
+#: replaygain/rgdialog.cpp:652 tags/trackorganiser.cpp:429
 msgid "Remove Tracks"
 msgstr "Удалить треки"
 
@@ -5540,19 +6019,19 @@ msgstr "AAC 64к"
 msgid "AAC 128k"
 msgstr "AAC 128к"
 
-#: streams/digitallyimportedsettings.cpp:109
+#: streams/digitallyimportedsettings.cpp:110
 msgid "Logged out"
 msgstr "Выполнен выход"
 
-#: streams/digitallyimportedsettings.cpp:112
+#: streams/digitallyimportedsettings.cpp:113
 msgid "Logging in..."
 msgstr "Выполняется вход..."
 
-#: streams/digitallyimportedsettings.cpp:136
+#: streams/digitallyimportedsettings.cpp:137
 msgid "Logout"
 msgstr "Выйти"
 
-#: streams/streamdialog.cpp:71
+#: streams/streamdialog.cpp:72
 msgid "URL:"
 msgstr "URL:"
 
@@ -5576,7 +6055,7 @@ msgstr "Редактировать поток"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>ОШИБКА:</b> недопустимый протокол</i>"
 
-#: streams/streamfetcher.cpp:205
+#: streams/streamfetcher.cpp:209
 msgid "Fetching %1"
 msgstr "Загрузка %1"
 
@@ -5592,89 +6071,89 @@ msgstr "Экспортировать избранные потоки"
 msgid "Add New Stream To Favorites"
 msgstr "Добавить новый поток в Избранное"
 
-#: streams/streamspage.cpp:124
+#: streams/streamspage.cpp:125
 msgctxt "Service name"
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:243
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|потоки XML"
 
-#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
+#: streams/streamspage.cpp:243 streams/streamspage.cpp:245
 msgid "Import Streams"
 msgstr "Импортировать потоки"
 
-#: streams/streamspage.cpp:245
+#: streams/streamspage.cpp:246
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "Потоки XML (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:253
+#: streams/streamspage.cpp:254
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr "Сбой импорта <b>%1</b>.<br/>Проверьте правильность формата."
 
-#: streams/streamspage.cpp:265
+#: streams/streamspage.cpp:266
 msgid "*.xml|XML Streams"
 msgstr "*.xml|потоки XML"
 
-#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
+#: streams/streamspage.cpp:266 streams/streamspage.cpp:268
 msgid "Export Streams"
 msgstr "Экспортировать потоки"
 
-#: streams/streamspage.cpp:267
+#: streams/streamspage.cpp:268
 msgid "XML Streams (*.xml)"
 msgstr "Потоки XML (*.xml)"
 
-#: streams/streamspage.cpp:279
+#: streams/streamspage.cpp:280
 msgid "Failed to create <b>%1</b>!"
 msgstr "Сбой создания <b>%1</b>"
 
-#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
+#: streams/streamspage.cpp:297 streams/streamspage.cpp:493
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "Поток уже существует:<br/><b>%1</b>"
 
-#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
+#: streams/streamspage.cpp:299 streams/streamspage.cpp:495
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "Поток с именем <b>%1</b> уже существует."
 
-#: streams/streamspage.cpp:318
+#: streams/streamspage.cpp:319
 msgid "Bookmark added"
 msgstr "Закладка добавлена"
 
-#: streams/streamspage.cpp:320
+#: streams/streamspage.cpp:321
 msgid "Already bookmarked"
 msgstr "Уже в закладках"
 
-#: streams/streamspage.cpp:366
+#: streams/streamspage.cpp:367
 msgid "Added to favorites"
 msgstr "Добавлено в Избранное"
 
-#: streams/streamspage.cpp:368
+#: streams/streamspage.cpp:369
 msgid "Already in favorites"
 msgstr "Уже в Избранном"
 
-#: streams/streamspage.cpp:393
+#: streams/streamspage.cpp:394
 msgid "Reload <b>%1</b> streams?"
 msgstr "Обновить <b>%1</b> потоков?"
 
-#: streams/streamspage.cpp:411
+#: streams/streamspage.cpp:412
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr "Точно удалить закладку для <b>%1</b>?"
 
-#: streams/streamspage.cpp:417
+#: streams/streamspage.cpp:418
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr "Точно удалить все <b>%1</b> закладок?"
 
-#: streams/streamspage.cpp:445
+#: streams/streamspage.cpp:446
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "Точно удалить все %1 выбранных потоков?"
 
-#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
+#: streams/streamspage.cpp:450 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "Точно удалить <b>%1</b>?"
 
-#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+#: streams/streamspage.cpp:561 streams/streamspage.cpp:577
 msgid "Search %1:"
 msgstr "Поиск %1:"
 
@@ -5714,139 +6193,90 @@ msgstr "Не удалось сохранить список потоков"
 msgid "Failed to remove streams folder!"
 msgstr "Не удалось удалить папку с потоками."
 
-#: support/dialog.cpp:89
+#: support/dialog.cpp:73
 msgid "&OK"
 msgstr "&Ok"
 
-#: support/dialog.cpp:90
+#: support/dialog.cpp:74
 msgid "&Cancel"
 msgstr "&Отмена"
 
-#: support/dialog.cpp:91
+#: support/dialog.cpp:75
 msgid "&Yes"
 msgstr "&Да"
 
-#: support/dialog.cpp:92
+#: support/dialog.cpp:76
 msgid "&No"
 msgstr "&Нет"
 
-#: support/dialog.cpp:93
+#: support/dialog.cpp:77
 msgid "&Discard"
 msgstr "&Отклонить"
 
-#: support/dialog.cpp:94
+#: support/dialog.cpp:78
 msgid "&Save"
 msgstr "&Сохранить"
 
-#: support/dialog.cpp:95
+#: support/dialog.cpp:79
 msgid "&Apply"
 msgstr "&Применить"
 
-#: support/dialog.cpp:96
+#: support/dialog.cpp:80
 msgid "&Close"
 msgstr "&Закрыть"
 
-#: support/dialog.cpp:98
+#: support/dialog.cpp:82
 msgid "&Overwrite"
 msgstr "&Заменить"
 
-#: support/dialog.cpp:99
+#: support/dialog.cpp:83
 msgid "&Reset"
 msgstr "&Сбросить"
 
-#: support/dialog.cpp:100
+#: support/dialog.cpp:84
 msgid "&Continue"
 msgstr "&Продолжить"
 
-#: support/dialog.cpp:101
+#: support/dialog.cpp:85
 msgid "&Delete"
 msgstr "&Удалить"
 
-#: support/dialog.cpp:102
+#: support/dialog.cpp:86
 msgid "&Stop"
 msgstr "&Остановить"
 
-#: support/dialog.cpp:103
+#: support/dialog.cpp:87
 msgid "&Remove"
 msgstr "&Удалить"
 
-#: support/dialog.cpp:104
+#: support/dialog.cpp:88
 msgid "&Previous"
 msgstr "&Предыдущее"
 
-#: support/dialog.cpp:105
+#: support/dialog.cpp:89
 msgid "&Next"
 msgstr "&Далее"
 
-#: support/fancytabwidget.cpp:957
-msgid "Icons Only"
-msgstr "Только значки"
-
-#: support/fancytabwidget.cpp:958
-msgid "Style"
-msgstr "Стиль"
-
-#: support/fancytabwidget.cpp:959
-msgid "Large Sidebar"
-msgstr "Большая панель"
-
-#: support/fancytabwidget.cpp:960
-msgid "Small Sidebar"
-msgstr "Маленькая панель"
-
-#: support/fancytabwidget.cpp:961
-msgid "Top Bar"
-msgstr "Верхняя панель"
-
-#: support/fancytabwidget.cpp:962
-msgid "Bottom Bar"
-msgstr "Нижняя панель"
-
-#: support/fancytabwidget.cpp:963
-msgid "Tabs On Side"
-msgstr "Вкладки сбоку"
-
-#: support/fancytabwidget.cpp:964
-msgid "Tabs On Top"
-msgstr "Вкладки сверху"
-
-#: support/fancytabwidget.cpp:965
-msgid "Tabs On Bottom"
-msgstr "Вкладки снизу"
-
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Password"
 msgstr "Пароль"
 
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Please enter password:"
 msgstr "Введите пароль:"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:123
+#: support/messagebox.cpp:50 support/messagebox.cpp:124
 msgid "Warning"
 msgstr "Предупреждение"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:118
+#: support/messagebox.cpp:50 support/messagebox.cpp:119
 msgid "Question"
 msgstr "Вопрос"
 
-#: support/messagebox.cpp:107 support/messagebox.cpp:113
-#: support/messagebox.h:62
-msgid "Error"
-msgstr "Ошибка"
-
 #: support/messagebox.h:65
 msgid "Information"
 msgstr "Инфо"
 
-#: support/onoffbutton.cpp:47
-msgid "ON"
-msgstr "Вкл"
-
-#: support/onoffbutton.cpp:48
-msgid "OFF"
-msgstr "Выкл"
-
 #: support/pathrequester.cpp:50
 msgid "Select Folder"
 msgstr "Выбрать папку"
@@ -5891,33 +6321,33 @@ msgstr[1] "%1 дня %2"
 msgstr[2] "%1 дней %2"
 msgstr[3] "%1 день %2"
 
-#: tags/tageditor.cpp:134
+#: tags/tageditor.cpp:147
 msgid "Tags"
 msgstr "Теги"
 
-#: tags/tageditor.cpp:147
+#: tags/tageditor.cpp:160
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr "Взять значение «Исполнитель альбома» из значения «Исполнитель»"
 
-#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
+#: tags/tageditor.cpp:261 tags/tageditor.cpp:592
 msgid "All tracks"
 msgstr "Все треки"
 
-#: tags/tageditor.cpp:295
+#: tags/tageditor.cpp:323
 msgid "(Various)"
 msgstr "(Несколько)"
 
-#: tags/tageditor.cpp:336
+#: tags/tageditor.cpp:368
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr ""
 "Применить обходное решение «несколько исполнителей» для <b>всех</b> треков?"
 
-#: tags/tageditor.cpp:378
+#: tags/tageditor.cpp:410
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr ""
 "Откатить обходное решение «несколько исполнителей» для <b>всех</b> треков?"
 
-#: tags/tageditor.cpp:428
+#: tags/tageditor.cpp:460
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5925,17 +6355,17 @@ msgstr ""
 "Установить значение «Исполнитель альбома» из значения «Исполнитель» (при "
 "пустом значении «Исполнитель альбома») для <b>всех</b> треков?"
 
-#: tags/tageditor.cpp:429
+#: tags/tageditor.cpp:461
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr ""
 "Установить значение «Исполнитель альбома» из значения «Исполнитель» (при "
 "пустом значении «Исполнитель альбома») ?"
 
-#: tags/tageditor.cpp:430
+#: tags/tageditor.cpp:462
 msgid "Album Artist from Artist"
 msgstr "Исполнитель альбома как Исполнитель"
 
-#: tags/tageditor.cpp:463
+#: tags/tageditor.cpp:495
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5943,52 +6373,52 @@ msgstr ""
 "Менять первую букву в значениях «Название», «Исполнитель», «Исполнитель "
 "альбома» и «Альбом» на заглавную?"
 
-#: tags/tageditor.cpp:496
+#: tags/tageditor.cpp:528
 msgid "Adjust the value of each track number by:"
 msgstr "Настроить значение номера каждого трека по:"
 
-#: tags/tageditor.cpp:554
+#: tags/tageditor.cpp:586
 msgid "All tracks [modified]"
 msgstr "Все треки [изменено]"
 
-#: tags/tageditor.cpp:556
+#: tags/tageditor.cpp:588
 msgid "%1 [modified]"
 msgstr "%1 [изменено]"
 
-#: tags/tageditor.cpp:783
+#: tags/tageditor.cpp:827
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr "Переименовать также и файлы песен, для соответствия тегам?"
 
-#: tags/tageditor.cpp:784
+#: tags/tageditor.cpp:828
 msgid "Rename Files"
 msgstr "Переименовать файлы"
 
-#: tags/trackorganiser.cpp:150
+#: tags/trackorganiser.cpp:164
 msgid "Abort renaming of files?"
 msgstr "Прервать переименование файлов?"
 
-#: tags/trackorganiser.cpp:263
+#: tags/trackorganiser.cpp:279
 msgid "Source file does not exist!<br/>%1"
 msgstr "Исходный файл не существует.<br/>%1"
 
-#: tags/trackorganiser.cpp:282
+#: tags/trackorganiser.cpp:298
 msgid "Destination file already exists!<br/>%1"
 msgstr "Конечный файл уже существует <br/>%1"
 
-#: tags/trackorganiser.cpp:304
+#: tags/trackorganiser.cpp:320
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "Сбой создания папки назначения. <br/>%1"
 
-#: tags/trackorganiser.cpp:325
+#: tags/trackorganiser.cpp:341
 msgid "Failed to rename %1 to %2"
 msgstr "Сбой переименования %1 в %2"
 
-#: widgets/coverwidget.cpp:267
+#: widgets/coverwidget.cpp:280
 msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
 msgstr "<tr><td align=\"right\"><b>Автор музыки:</b></td><td>%1</td></tr>"
 
-#: widgets/coverwidget.cpp:269
+#: widgets/coverwidget.cpp:282
 msgid ""
 "<tr><td align=\"right\"><b>Artist:</b></td><td>%1</td></tr><tr><td align="
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Year:"
@@ -5998,37 +6428,41 @@ msgstr ""
 "align=\"right\"><b>Альбом:</b></td><td>%2</td></tr><tr><td align=\"right"
 "\"><b>Год:</b></td><td>%3</td></tr>"
 
-#: widgets/genrecombo.cpp:54
+#: widgets/genrecombo.cpp:44
+msgid "Filter On Genre"
+msgstr ""
+
+#: widgets/genrecombo.cpp:66
 msgid "All Genres"
 msgstr "Все жанры"
 
-#: widgets/groupedview.cpp:267
+#: widgets/groupedview.cpp:265
 msgctxt "album (albumYear)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: widgets/groupedview.cpp:269
+#: widgets/groupedview.cpp:267
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: widgets/itemview.cpp:480
+#: widgets/itemview.cpp:561
 msgid "Go Back"
 msgstr "Назад"
 
-#: widgets/itemview.cpp:485
+#: widgets/itemview.cpp:566
 msgid "Go Home"
 msgstr "Домашняя папка"
 
-#: widgets/menubutton.cpp:36
+#: widgets/menubutton.cpp:39
 msgid "Menu"
 msgstr "Меню"
 
-#: widgets/searchwidget.cpp:62
+#: widgets/searchwidget.cpp:63
 msgid "Search..."
 msgstr "Поиск..."
 
-#: widgets/searchwidget.cpp:66
+#: widgets/searchwidget.cpp:67
 msgid "Close Search Bar"
 msgstr "Закрыть панель поиска"
 
@@ -6040,7 +6474,7 @@ msgstr "%1: вход выполнен"
 msgid "<b>NOT</b> logged into %1"
 msgstr "%1: вход <b>НЕ</b> выполнен"
 
-#: widgets/songdialog.cpp:48
+#: widgets/songdialog.cpp:49
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
 "\" setting, and MPD's \"music_directory\" setting.</p>"
@@ -6048,7 +6482,7 @@ msgstr ""
 "<p>Нет доступа к файлам!<br/><br/>Проверьте настройки «папки с музыкой» "
 "программы Cantata и настройки «каталога с музыкой» сервера MPD.</p>"
 
-#: widgets/songdialog.cpp:51
+#: widgets/songdialog.cpp:52
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check that the device is still "
 "attached.</p>"
@@ -6056,28 +6490,24 @@ msgstr ""
 "<p>Нет доступа к файлам!<br/><br/>Убедитесь, что устройство всё ещё "
 "подключено.</p>"
 
-#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:115 widgets/volumeslider.cpp:230
+#: widgets/volumeslider.cpp:237
 msgid "Mute"
 msgstr "Заглушить звук"
 
-#: widgets/volumeslider.cpp:199
+#: widgets/volumeslider.cpp:198
 msgid "Muted"
 msgstr "Звук отключён"
 
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:237
 msgid "Unmute"
 msgstr "Включить звук"
 
-#: widgets/volumeslider.cpp:276
-msgid "Volume Disabled"
-msgstr "Громкость отключена"
-
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1% (Muted)"
 msgstr "Громкость %1% (звук отключён)"
 
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1%"
 msgstr "Громкость %1%"
 
@@ -6181,6 +6611,182 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Episodes"
 msgstr "%1 эпизодов"
 
+#~ msgid "Transcoding failed.<br/><br/<hr/>%1"
+#~ msgstr "Сбой перекодирования.<br/><br/<hr/>%1"
+
+#~ msgid "Failed to download track.<br/><br/<hr/>%1"
+#~ msgstr "Сбой загрузки трека.<br/><br/<hr/>%1"
+
+#~ msgid "<b>Error</b><br/>"
+#~ msgstr "<b>Ошибка</b><br/>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
+#~ "td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Исполнитель:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Альбом:</td><td>%2</td></tr><tr><td align=\"right\">Трек:</"
+#~ "td><td>%3</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Destination file:</td><td>%2</td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">Исходный файл:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Целевой файл:</td><td>%2</td></tr>"
+
+#~ msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
+#~ msgstr "<tr><td align=\"right\">Файл:</td><td>%1</td></tr>"
+
+#~ msgid ""
+#~ "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
+#~ "i></tr>"
+#~ msgstr ""
+#~ "<tr><i><td align=\"right\"><i>Осталось времени:</i></td><td><i>%5</i></"
+#~ "td></i></tr>"
+
+#~ msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
+#~ msgstr "<tr><td>%album%</td><td>%1</td><td>Название альбома.</td></tr>"
+
+#~ msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
+#~ msgstr "<tr><td>%composer%</td><td>%1</td><td>Автор музыки.</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
+#~ msgstr ""
+#~ "<tr><td>%artist%</td><td>%1</td><td>Исполнитель каждого трека.</td></tr>"
+
+#~ msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
+#~ msgstr "<tr><td>%track%</td><td>%1</td><td>Номер трека.</td></tr>"
+
+#~ msgid ""
+#~ "<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></"
+#~ "tr>"
+#~ msgstr "<tr><td>%year%</td><td>%1</td><td>Год выхода альбома.</td></tr>"
+
+#~ msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
+#~ msgstr "<tr><td>%genre%</td><td>%1</td><td>Жанр альбома.</td></tr>"
+
+#~ msgctxt ""
+#~ "Google\n"
+#~ "width x height (file size)"
+#~ msgid ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+#~ msgstr ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+
+#~ msgctxt ""
+#~ "Discogs\n"
+#~ "width x height"
+#~ msgid ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+#~ msgstr ""
+#~ "Discogs\n"
+#~ "%1 x %2"
+
+#~ msgid "Grouped by 'Album Artist'"
+#~ msgstr "Отсортировано по «Исполнителю альбома»"
+
+#~ msgid "Search Play Queue"
+#~ msgstr "Искать в очереди"
+
+#~ msgid "Do not fadeout"
+#~ msgstr "Без затухания"
+
+#~ msgid "Inactive"
+#~ msgstr "Неактивно"
+
+#~ msgctxt "Track Number (#)"
+#~ msgid "#"
+#~ msgstr "#"
+
+#~ msgid "Search For Podcasts"
+#~ msgstr "Искать подкасты"
+
+#~ msgid "Subscribe to Podcast"
+#~ msgstr "Подписаться на подкаст"
+
+#~ msgid "You are already subscribed to this URL!"
+#~ msgstr "Вы уже подписаны на этот адрес URL."
+
+#~ msgid "Already downloading this URL!"
+#~ msgstr "Загрузка с этого URL уже идёт."
+
+#~ msgid "Use backdrop"
+#~ msgstr "Использовать оформление"
+
+#~ msgid "Automatically lookup"
+#~ msgstr "Автоматически искать"
+
+#~ msgid "<html><head/><body><p>Cancel current query</p></body></html>"
+#~ msgstr "<html><head/><body><p>Отменить текущую очередь</p></body></html>"
+
+#~ msgid "<html><head/><body><p>Add a local file</p></body></html>"
+#~ msgstr "<html><head/><body><p>Добавить локальный файл</p></body></html>"
+
+#~ msgid "Use current album cover as background:"
+#~ msgstr "Использовать обложку текущего альбома как фон:"
+
+#~ msgid "Multiple artist albums:"
+#~ msgstr "Альбомы с несколькими исполнителями:"
+
+#~ msgid "Crossfading:"
+#~ msgstr "Перекрёстное затухание:"
+
+#~ msgid " seconds"
+#~ msgstr " секунд"
+
+#~ msgid "Devices:"
+#~ msgstr "Устройства:"
+
+#~ msgid "Current URL:"
+#~ msgstr "Текущий URL:"
+
+#~ msgid ""
+#~ "The following is a list of online providers, to hide a provider simply un-"
+#~ "check its entry in this list."
+#~ msgstr ""
+#~ "Ниже показан список источников в сети, чтобы «спрятать» источник, просто "
+#~ "уберите соответствующую галочку в списке."
+
+#~ msgid ""
+#~ "The following is a list of the top-level stream categories, to hide a "
+#~ "category simply un-check its entry in this list."
+#~ msgstr ""
+#~ "Ниже показан список самых популярных категорий потокового аудио, чтобы "
+#~ "«спрятать» категорию, просто уберите соответствующую галочку в списке."
+
+#~ msgid "Icons Only"
+#~ msgstr "Только значки"
+
+#~ msgid "Style"
+#~ msgstr "Стиль"
+
+#~ msgid "Small Sidebar"
+#~ msgstr "Маленькая панель"
+
+#~ msgid "Tabs On Side"
+#~ msgstr "Вкладки сбоку"
+
+#~ msgid "Tabs On Top"
+#~ msgstr "Вкладки сверху"
+
+#~ msgid "Tabs On Bottom"
+#~ msgstr "Вкладки снизу"
+
+#~ msgid "ON"
+#~ msgstr "Вкл"
+
+#~ msgid "OFF"
+#~ msgstr "Выкл"
+
+#~ msgid "Volume Disabled"
+#~ msgstr "Громкость отключена"
+
 #~ msgid ""
 #~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
 #~ msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 2ff1143..b369c87 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Cantata 0.9.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-14 20:26+0000\n"
+"POT-Creation-Date: 2014-02-02 20:02+0000\n"
 "PO-Revision-Date: 2012-12-20 15:00+0800\n"
 "Last-Translator: AI Corleone <xuejingedison at sina.com>\n"
 "Language-Team: AI Corleone <xuejingedison at sina.com>\n"
@@ -19,15 +19,14 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "服务器信息"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:307
-#: gui/cachesettings.cpp:262
+#: context/albumview.cpp:71 gui/cachesettings.cpp:269
 #, fuzzy
 msgid "Album Information"
 msgstr "信息"
 
-#. i18n: file: devices/albumdetails.ui:143
+#. i18n: file: devices/albumdetails.ui:136
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
+#: context/albumview.cpp:175 po/rc.cpp:107 rc.cpp:107
 msgid "Tracks"
 msgstr "音轨"
 
@@ -36,22 +35,22 @@ msgstr "音轨"
 msgid "Refresh Artist Information"
 msgstr "艺术家信息"
 
-#: context/artistview.cpp:92 context/contextwidget.cpp:306
-#: gui/cachesettings.cpp:260
+#: context/artistview.cpp:92 gui/cachesettings.cpp:267
 msgid "Artist Information"
 msgstr "艺术家信息"
 
-#. i18n: file: gui/interfacesettings.ui:137
+#. i18n: file: gui/interfacesettings.ui:272
 #. i18n: ectx: attribute (title), widget (QWidget, tab_2)
-#: context/artistview.cpp:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
+#: context/artistview.cpp:314 gui/interfacesettings.cpp:106
+#: gui/mainwindow.cpp:308 po/rc.cpp:588 rc.cpp:588
 msgid "Albums"
 msgstr "专辑"
 
-#: context/artistview.cpp:333
+#: context/artistview.cpp:337
 msgid "Web Links"
 msgstr "Web 链接"
 
-#: context/artistview.cpp:419
+#: context/artistview.cpp:424
 msgid "Similar Artists"
 msgstr "相似艺术家"
 
@@ -59,23 +58,32 @@ msgstr "相似艺术家"
 msgid "Lyrics Providers"
 msgstr ""
 
-#: context/contextsettings.cpp:37
+#: context/contextsettings.cpp:37 gui/cachesettings.cpp:278
 msgid "Wikipedia Languages"
 msgstr ""
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
-#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1388
+#: models/streamsmodel.cpp:1434 models/streamsmodel.cpp:1642
 #, fuzzy
 msgid "Other"
 msgstr "其他视图"
 
-#: context/contextwidget.cpp:98
+#: context/contextwidget.cpp:293
 msgid "Reset Spacing"
 msgstr ""
 
-#: context/contextwidget.cpp:308 context/songview.cpp:105
-#: gui/cachesettings.cpp:259
-msgid "Lyrics"
+#: context/contextwidget.cpp:506
+#, fuzzy
+msgid "&Artist"
+msgstr "艺术家"
+
+#: context/contextwidget.cpp:507
+msgid "Al&bum"
+msgstr ""
+
+#: context/contextwidget.cpp:508
+#, fuzzy
+msgid "&Lyrics"
 msgstr "歌词"
 
 #: context/lastfmengine.cpp:63
@@ -93,37 +101,38 @@ msgid ""
 "original song title and artist as displayed in Cantata."
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:115
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:38
 #. i18n: ectx: property (text), widget (StateLabel, titleLabel)
-#: context/lyricsdialog.cpp:64 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
-#: rc.cpp:61 rc.cpp:304 rc.cpp:789
+#: context/lyricsdialog.cpp:64 gui/searchpage.cpp:204 po/rc.cpp:92
+#: po/rc.cpp:377 po/rc.cpp:941 rc.cpp:92 rc.cpp:377 rc.cpp:941
 msgid "Title:"
 msgstr "标题:"
 
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#. i18n: file: devices/albumdetails.ui:34
+#. i18n: file: devices/albumdetails.ui:37
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: dynamic/dynamicrule.ui:25
+#. i18n: file: dynamic/dynamicrule.ui:50
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: tags/tageditor.ui:51
 #. i18n: ectx: property (text), widget (StateLabel, artistLabel)
-#: context/lyricsdialog.cpp:66 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
-#: rc.cpp:55 rc.cpp:292 rc.cpp:792
+#: context/lyricsdialog.cpp:66 devices/actiondialog.cpp:800
+#: gui/searchpage.cpp:197 po/rc.cpp:86 po/rc.cpp:362 po/rc.cpp:944 rc.cpp:86
+#: rc.cpp:362 rc.cpp:944
 msgid "Artist:"
 msgstr "艺术家:"
 
@@ -135,102 +144,131 @@ msgstr "搜索歌词"
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "选择歌词搜索网站。"
 
-#: context/lyricsettings.cpp:66
-msgid "(Polish Translations)"
-msgstr "(波兰语翻译)"
+#: context/othersettings.cpp:45 gui/coverdialog.cpp:877
+#: gui/interfacesettings.cpp:174
+msgid "Images (*.png *.jpg)"
+msgstr "图片 Images (*.png *.jpg)"
 
-#: context/lyricsettings.cpp:67
-msgid "(Portuguese Translations)"
-msgstr "(葡萄牙语翻译)"
+#: context/othersettings.cpp:47 gui/interfacesettings.cpp:176
+msgctxt "pixels"
+msgid "10px"
+msgstr ""
+
+#: context/othersettings.cpp:102 gui/interfacesettings.cpp:524
+msgctxt "value%"
+msgid "%1%"
+msgstr ""
 
-#: context/songview.cpp:89
+#: context/othersettings.cpp:107 gui/interfacesettings.cpp:529
+#, c-format
+msgctxt "pixels"
+msgid "%1px"
+msgstr ""
+
+#: context/songview.cpp:90
 #, fuzzy
 msgid "Refresh Lyrics"
 msgstr "刷新设备"
 
-#: context/songview.cpp:90
+#: context/songview.cpp:91
 msgid "Edit Lyrics"
 msgstr "编辑歌词"
 
-#: context/songview.cpp:91
+#: context/songview.cpp:92
 msgid "Save Lyrics"
 msgstr "保存歌词"
 
-#: context/songview.cpp:92
+#: context/songview.cpp:93
 msgid "Cancel Editing Lyrics"
 msgstr "取消编辑歌词"
 
-#: context/songview.cpp:93
+#: context/songview.cpp:94
 msgid "Delete Lyrics File"
 msgstr "删除歌词文件"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:106 gui/cachesettings.cpp:266
+msgid "Lyrics"
+msgstr "歌词"
+
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 msgid "Abort editing of lyrics?"
 msgstr "放弃编辑歌词?"
 
-#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
 #, fuzzy
 msgid "Abort Editing"
 msgstr "放弃编辑歌词?"
 
-#: context/songview.cpp:119 context/songview.cpp:138 context/songview.cpp:197
-#: replaygain/rgdialog.cpp:252 replaygain/rgdialog.cpp:253
-#: replaygain/rgdialog.cpp:261 replaygain/rgdialog.cpp:262
-#: tags/trackorganiser.cpp:150
+#: context/songview.cpp:120 context/songview.cpp:139 context/songview.cpp:198
+#: replaygain/rgdialog.cpp:247 replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:256 replaygain/rgdialog.cpp:257
+#: tags/trackorganiser.cpp:164
 msgid "Abort"
 msgstr ""
 
-#: context/songview.cpp:121
+#: context/songview.cpp:122
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr "删除已下载的歌词并重新下载?"
 
-#: context/songview.cpp:121 context/songview.cpp:122
-#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
+#: context/songview.cpp:122 context/songview.cpp:123
+#: online/onlineservicespage.cpp:458 online/onlineservicespage.cpp:459
 #, fuzzy
 msgid "Re-download"
 msgstr "下载:"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Current playing song has changed, still perform search?"
 msgstr "当前播放的歌曲已改变,继续搜索?"
 
-#: context/songview.cpp:147
+#: context/songview.cpp:148
 msgid "Song Changed"
 msgstr ""
 
-#: context/songview.cpp:148
+#: context/songview.cpp:149
 #, fuzzy
 msgid "Perform Search"
 msgstr "搜索"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save updated lyrics?"
 msgstr "保存更新后的歌词?"
 
-#: context/songview.cpp:172
+#: context/songview.cpp:173
 msgid "Save"
 msgstr "保存"
 
-#: context/songview.cpp:185
+#: context/songview.cpp:186
 msgid "Failed to save lyrics."
 msgstr "无法保存歌词."
 
-#: context/songview.cpp:207
+#: context/songview.cpp:208
 msgid "Delete lyrics file?"
 msgstr "确定删除歌词?"
 
-#: context/songview.cpp:207 gui/mainwindow.cpp:292
-#: widgets/messageoverlay.cpp:43
-msgid "Cancel"
-msgstr "取消"
+#: context/songview.cpp:208
+#, fuzzy
+msgid "Delete File"
+msgstr "选择文件"
 
-#: context/songview.cpp:431
+#: context/songview.cpp:462
 #, fuzzy
 msgid "Fetching lyrics via %1"
 msgstr ""
 "%1 - %2\n"
 "从 %3 获取歌词"
 
+#: context/ultimatelyricsprovider.cpp:200
+msgid "(Polish Translations)"
+msgstr "(波兰语翻译)"
+
+#: context/ultimatelyricsprovider.cpp:201
+msgid "(Portuguese Translations)"
+msgstr "(葡萄牙语翻译)"
+
+#: context/view.cpp:91 gui/mainwindow.cpp:328 widgets/messageoverlay.cpp:44
+msgid "Cancel"
+msgstr "取消"
+
 #: context/wikipediaengine.cpp:248
 #, fuzzy
 msgid "Track listing"
@@ -254,15 +292,15 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr ""
 
-#: context/wikipediasettings.cpp:99
+#: context/wikipediasettings.cpp:114
 #, fuzzy
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
 msgstr "选择歌词搜索网站。"
 
-#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
-#: online/podcastsearchdialog.cpp:393
+#: context/wikipediasettings.cpp:115 models/streamsmodel.cpp:598
+#: online/podcastsearchdialog.cpp:404
 msgid "Reload"
 msgstr ""
 
@@ -270,37 +308,47 @@ msgstr ""
 msgid "Cantata is playing a track"
 msgstr ""
 
-#: devices/actiondialog.cpp:76
+#: devices/actiondialog.cpp:83
 msgid "Songs To Be Copied"
 msgstr ""
 
-#: devices/actiondialog.cpp:146
+#: devices/actiondialog.cpp:153
 msgid "<b>INVALID</b>"
 msgstr "<b>无效</b>"
 
-#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
+#: devices/actiondialog.cpp:167 devices/actiondialog.cpp:170
 msgid "<i>(When different)</i>"
 msgstr "<i>(当不同的时候)</i>"
 
-#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:185 tags/tageditor.cpp:713
+#: tags/trackorganiser.cpp:444
+msgid ""
+"Cantata has detected that you are connected to a Mopidy server.\n"
+"\n"
+"Currently it is not possible for Cantata to force Mopidy to refresh its "
+"local music listing. Therefore, you will need to stop Cantata, manually "
+"refresh Mopidy's database, and restart Cantata for any changes to be active."
+msgstr ""
+
+#: devices/actiondialog.cpp:211 devices/synccollectionwidget.cpp:274
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr ""
 
-#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
-#: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
+#: devices/actiondialog.cpp:271 devices/mtpdevice.cpp:1622
+#: devices/remotefsdevice.cpp:571 devices/umsdevice.cpp:103
 msgid "%1 free"
 msgstr "剩余 %1"
 
-#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
+#: devices/actiondialog.cpp:284 devices/actiondialog.cpp:288
 msgid "Local Music Library"
 msgstr "本地音乐库"
 
-#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
+#: devices/actiondialog.cpp:286 devices/albumdetailsdialog.cpp:104
+#: gui/preferencesdialog.cpp:115 widgets/groupedview.cpp:251
 msgid "Audio CD"
 msgstr "音乐 CD"
 
-#: devices/actiondialog.cpp:293
+#: devices/actiondialog.cpp:309
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -311,7 +359,7 @@ msgstr ""
 "歌曲需要 %1 但是设备中仅有 %2.\n"
 "歌曲需要转码成较小的文件大小才能复制."
 
-#: devices/actiondialog.cpp:300
+#: devices/actiondialog.cpp:316
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -319,255 +367,284 @@ msgstr ""
 "设备剩余空间不足.\n"
 "歌曲需要 %1 但是设备中仅有 %2."
 
-#: devices/actiondialog.cpp:349
+#: devices/actiondialog.cpp:365
 msgid "Copy Songs"
 msgstr "复制歌曲"
 
-#: devices/actiondialog.cpp:349 devices/devicespage.cpp:503
-#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: devices/actiondialog.cpp:365 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:214 gui/folderpage.cpp:270 gui/librarypage.cpp:257
 #: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "删除歌曲"
 
-#: devices/actiondialog.cpp:380
+#: devices/actiondialog.cpp:402
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
 msgstr "<p>没有设置目标设备。<br/>使用默认设置然后继续?</p>"
 
-#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
+#: devices/actiondialog.cpp:403 devices/actiondialog.cpp:407
 #, fuzzy
 msgid "Not Configured"
 msgstr "设置"
 
-#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
+#: devices/actiondialog.cpp:404 devices/actiondialog.cpp:408
 #, fuzzy
 msgid "Use Defaults"
 msgstr "默认"
 
-#: devices/actiondialog.cpp:384
+#: devices/actiondialog.cpp:406
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
 msgstr "<p>没有设置来源设备。<br/>使用默认设置然后继续?</p>"
 
-#: devices/actiondialog.cpp:446
+#: devices/actiondialog.cpp:468
 #, fuzzy
 msgid "Are you sure you wish to stop?"
 msgstr "确定退出?"
 
-#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
+#: devices/actiondialog.cpp:468 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "停止"
 
-#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
-#: tags/trackorganiser.cpp:446
+#: devices/actiondialog.cpp:513 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:468 tags/tageditor.cpp:880
+#: tags/trackorganiser.cpp:478
 msgid "Device has been removed!"
 msgstr "设备已移除!"
 
-#: devices/actiondialog.cpp:491
+#: devices/actiondialog.cpp:515
 msgid "Device is not connected!"
 msgstr "设备未连接!"
 
-#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
-#: tags/trackorganiser.cpp:456
+#: devices/actiondialog.cpp:517 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:478 tags/tageditor.cpp:890
+#: tags/trackorganiser.cpp:488
 msgid "Device is busy?"
 msgstr "设备正忙?"
 
-#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:519 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "设备已改变?"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:586
 msgid "Clearing unused folders"
 msgstr "清除不用的文件夹"
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr ""
 
-#: devices/actiondialog.cpp:577
+#: devices/actiondialog.cpp:601
 #, fuzzy
 msgid "ReplyGain"
 msgstr "播放增益"
 
-#: devices/actiondialog.cpp:578
+#: devices/actiondialog.cpp:602
 #, fuzzy
 msgid "Calculate"
 msgstr "计算中..."
 
-#: devices/actiondialog.cpp:634
-msgid "The destination filename already exists!<hr/>%1"
+#: devices/actiondialog.cpp:661
+#, fuzzy
+msgid "The destination filename already exists!"
 msgstr "目标文件名已存在!<hr/>%1"
 
-#: devices/actiondialog.cpp:637
-msgid "Song already exists!<hr/>%1"
+#: devices/actiondialog.cpp:664
+#, fuzzy
+msgid "Song already exists!"
 msgstr "歌曲已存在!<hr/>%1"
 
-#: devices/actiondialog.cpp:640
-msgid "Song does not exist!<hr/>%1"
+#: devices/actiondialog.cpp:667
+#, fuzzy
+msgid "Song does not exist!"
 msgstr "歌曲不存在!<hr/>%1"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:670
+#, fuzzy
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
-"permissions.<hr/>%1"
+"permissions."
 msgstr "创建文件夹失败!<br/>请检查文件权限<hr/>%1"
 
-#: devices/actiondialog.cpp:646
-msgid "Source file no longer exists?<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:673
+#, fuzzy
+msgid "Source file no longer exists?"
 msgstr "源文件不再存在?<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:649
-msgid "Failed to copy.<hr/>%1"
+#: devices/actiondialog.cpp:676
+#, fuzzy
+msgid "Failed to copy."
 msgstr "复制失败.<hr/>%1"
 
-#: devices/actiondialog.cpp:650
-msgid "Failed to delete.<hr/>%1"
+#: devices/actiondialog.cpp:676
+#, fuzzy
+msgid "Failed to delete."
 msgstr "删除失败 <hr/>%1"
 
-#: devices/actiondialog.cpp:653
-msgid "Not connected to device.<hr/>%1"
+#: devices/actiondialog.cpp:679
+#, fuzzy
+msgid "Not connected to device."
 msgstr "设备未连接.<hr/>%1"
 
-#: devices/actiondialog.cpp:656
-msgid "Selected codec is not available.<hr/>%1"
+#: devices/actiondialog.cpp:682
+#, fuzzy
+msgid "Selected codec is not available."
 msgstr "选择的编码不存在.<hr/>%1"
 
-#: devices/actiondialog.cpp:659
-msgid "Transcoding failed.<br/><br/<hr/>%1"
-msgstr "转码失败.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:685
+#, fuzzy
+msgid "Transcoding failed."
+msgstr "正在转码"
 
-#: devices/actiondialog.cpp:662
+#: devices/actiondialog.cpp:688
+#, fuzzy
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
-"devices.)<hr/>%1"
+"devices.)"
 msgstr "临时文件创建失败.<br/>(转码 MTP 设备必须使用)<hr/>%1"
 
-#: devices/actiondialog.cpp:665
-msgid "Failed to read source file.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:691
+#, fuzzy
+msgid "Failed to read source file."
 msgstr "读取源文件失败.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:668
-msgid "Failed to write to destination file.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:694
+#, fuzzy
+msgid "Failed to write to destination file."
 msgstr "目标文件写入失败.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:671
-msgid "No space left on device.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:697
+#, fuzzy
+msgid "No space left on device."
 msgstr "设备剩余空间不足.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:674
-msgid "Failed to update metadata.<br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:700
+#, fuzzy
+msgid "Failed to update metadata."
 msgstr "无法更新元数据 <hr/>%1"
 
-#: devices/actiondialog.cpp:677
-msgid "Failed to download track.<br/><br/<hr/>%1"
-msgstr "无法下载音轨 <br/><br/<hr/>%1"
+#: devices/actiondialog.cpp:703
+#, fuzzy
+msgid "Failed to download track."
+msgstr "下载失败"
 
-#: devices/actiondialog.cpp:680
-msgid "Failed to lock device.<hr/>%1"
+#: devices/actiondialog.cpp:706
+#, fuzzy
+msgid "Failed to lock device."
 msgstr "无法锁定设备. <hr/>%1"
 
-#: devices/actiondialog.cpp:709
+#: devices/actiondialog.cpp:735
 msgid "Local Music Library Properties"
 msgstr "本地音乐库属性"
 
-#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
-msgid "<b>Error</b><br/>"
-msgstr "<b>错误</b><br/>"
+#: devices/actiondialog.cpp:776 devices/actiondialog.cpp:790
+#: support/messagebox.cpp:108 support/messagebox.cpp:114
+#: support/messagebox.h:62
+msgid "Error"
+msgstr "错误"
 
-#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:780 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Skip"
 msgstr "跳过"
 
-#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
-#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
-#: tags/trackorganiser.cpp:326
+#: devices/actiondialog.cpp:781 tags/trackorganiser.cpp:280
+#: tags/trackorganiser.cpp:299 tags/trackorganiser.cpp:321
+#: tags/trackorganiser.cpp:342
 msgid "Auto Skip"
 msgstr "自动跳过"
 
-#: devices/actiondialog.cpp:759
+#: devices/actiondialog.cpp:785
 msgid "Retry"
 msgstr "重试"
 
-#: devices/actiondialog.cpp:774
-msgid ""
-"<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
-"\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
-"td></tr>"
-msgstr ""
-"<table><tr><td align=\"right\">艺术家:</td><td>%1</td></tr><tr><td align="
-"\"right\">专辑:</td><td>%2</td></tr><tr><td align=\"right\">音轨:</td><td>"
-"%3</td></tr></table>"
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#. i18n: file: dynamic/dynamicrule.ui:102
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:90
+#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
+#: devices/actiondialog.cpp:801 gui/searchpage.cpp:203 po/rc.cpp:374
+#: po/rc.cpp:953 rc.cpp:374 rc.cpp:953
+msgid "Album:"
+msgstr "专辑:"
 
-#: devices/actiondialog.cpp:781
-msgid ""
-"<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
-"\"right\">Destination file:</td><td>%2</td></tr>"
-msgstr ""
-"<tr><td align=\"right\">源文件:</td><td>%1</td></tr><tr><td align=\"right\">"
-"目标文件:</td><td>%2</td></tr>"
+#. i18n: file: tags/tageditor.ui:25
+#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
+#: devices/actiondialog.cpp:802 po/rc.cpp:938 rc.cpp:938
+msgid "Track:"
+msgstr "音轨:"
 
-#: devices/actiondialog.cpp:786
-msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
-msgstr "<tr><td align=\"right\">文件:</td><td>%1</td></tr>"
+#: devices/actiondialog.cpp:806
+#, fuzzy
+msgid "Source file:"
+msgstr "源: %1"
+
+#: devices/actiondialog.cpp:807
+#, fuzzy
+msgid "Destination file:"
+msgstr "目标格式:"
+
+#: devices/actiondialog.cpp:809 gui/searchpage.cpp:207
+#, fuzzy
+msgid "File:"
+msgstr "文件(&F)"
 
-#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
-#: gui/cachesettings.cpp:230
+#: devices/actiondialog.cpp:815 gui/cachesettings.cpp:179
+#: gui/cachesettings.cpp:235
 msgid "Calculating..."
 msgstr "计算中..."
 
-#: devices/actiondialog.cpp:799
+#: devices/actiondialog.cpp:822
 #, fuzzy
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (估算时间)"
 
-#: devices/actiondialog.cpp:802
-msgid ""
-"<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
-"i></tr>"
-msgstr ""
-"<tr><i><td align=\"right\"><i>剩余时间:</i></td><td><i>%5</i></td></i></tr>"
+#: devices/actiondialog.cpp:824
+#, fuzzy
+msgid "Time remaining:"
+msgstr "播放时间:"
 
-#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: devices/actiondialog.cpp:847 devices/fsdevice.cpp:762
 #: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "正在保存缓存"
 
-#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
+#: devices/albumdetailsdialog.cpp:139 devices/albumdetailsdialog.cpp:236
+#: tags/tageditor.cpp:158 tags/tageditor.cpp:373
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "使用\"多个艺术家\" 环境"
 
-#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
+#: devices/albumdetailsdialog.cpp:140 devices/albumdetailsdialog.cpp:260
+#: tags/tageditor.cpp:159 tags/tageditor.cpp:418
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "恢复 \"多个艺术家\" 环境"
 
-#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
-#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
+#: devices/albumdetailsdialog.cpp:141 devices/albumdetailsdialog.cpp:278
+#: tags/tageditor.cpp:161 tags/tageditor.cpp:499
 msgid "Capitalize"
 msgstr "转为大写"
 
-#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
-#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
+#: devices/albumdetailsdialog.cpp:142 devices/albumdetailsdialog.cpp:295
+#: tags/tageditor.cpp:162 tags/tageditor.cpp:528
 msgid "Adjust Track Numbers"
 msgstr "调整音轨号"
 
-#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
+#: devices/albumdetailsdialog.cpp:144 tags/tageditor.cpp:156
 msgid "Tools"
 msgstr "工具"
 
-#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:369
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "确定使用\"多个艺术家\" 环境?"
 
-#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
+#: devices/albumdetailsdialog.cpp:234 tags/tageditor.cpp:371
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -575,11 +652,11 @@ msgstr ""
 "<i>'专辑艺人' 和 '艺术家'将被设置成 '多个艺术家','标题'将被设置为'音轨艺人 "
 "- 音轨标题'。</i>"
 
-#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:411
 msgid "Revert \"Various Artists\" workaround"
 msgstr "恢复 \"多个艺术家\" 环境"
 
-#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
+#: devices/albumdetailsdialog.cpp:255 tags/tageditor.cpp:413
 msgid ""
 "<i>Where the 'Album artist' is the same as 'Artist' and the 'Title' is of "
 "the format \"TrackArtist - TrackTitle\", 'Artist' will be taken from 'Title' "
@@ -588,36 +665,26 @@ msgid ""
 "will be set to \"Wobble\"</i>"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
+#: devices/albumdetailsdialog.cpp:261 tags/tageditor.cpp:419
 msgid "Revert"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
+#: devices/albumdetailsdialog.cpp:277 tags/tageditor.cpp:497
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr "'标题', '艺术家', '专辑艺术家', '专辑' 的首字母大写。"
 
-#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
+#: devices/albumdetailsdialog.cpp:295 tags/tageditor.cpp:529
 msgid "Adjust track number by:"
 msgstr "调整音轨号为:"
 
-#: devices/albumdetailsdialog.cpp:335 devices/cddbinterface.cpp:143
-#: devices/deviceoptions.cpp:358 devices/musicbrainz.cpp:202
-#: devices/musicbrainz.cpp:324 gui/mainwindow.cpp:1771 gui/mainwindow.cpp:1784
-#: models/musiclibraryitemroot.cpp:362 models/musiclibraryitemroot.cpp:520
-#: models/playqueuemodel.cpp:325 mpd/mpdparseutils.cpp:249
-#: mpd/mpdparseutils.cpp:409 mpd/song.cpp:228 mpd/song.cpp:233
-#: mpd/song.cpp:272 mpd/song.cpp:299 widgets/groupedview.cpp:260
-msgid "Unknown"
-msgstr "未知"
-
 #: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "正在读碟"
 
-#: devices/audiocddevice.cpp:353 gui/mainwindow.cpp:2199
-#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
-#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
+#: devices/audiocddevice.cpp:358 gui/mainwindow.cpp:2345
+#: gui/searchpage.cpp:220 models/albumsmodel.cpp:245 models/musicmodel.cpp:217
+#: models/playlistsmodel.cpp:309 models/playlistsmodel.cpp:324
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "%1 音轨 (%2)"
@@ -639,7 +706,7 @@ msgid "Failed to open CD device"
 msgstr "打开 CD 设备失败"
 
 #: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
-#: devices/musicbrainz.cpp:217
+#: devices/musicbrainz.cpp:216
 #, fuzzy
 msgid "Track %1"
 msgstr "音轨 #"
@@ -660,19 +727,19 @@ msgstr "CDDB 错误: %1"
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr "发现多个匹配项目,请在下面选择合适的:"
 
-#. i18n: file: devices/albumdetails.ui:170
+#. i18n: file: devices/albumdetails.ui:163
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:66
-#: models/playqueuemodel.cpp:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
-#: rc.cpp:82
+#: models/playqueuemodel.cpp:106 po/rc.cpp:113 replaygain/rgdialog.cpp:128
+#: rc.cpp:113
 msgid "Artist"
 msgstr "艺术家"
 
-#. i18n: file: devices/albumdetails.ui:175
+#. i18n: file: devices/albumdetails.ui:168
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
 #: devices/cddbselectiondialog.cpp:47 dynamic/dynamicrulesdialog.cpp:76
-#: models/playqueuemodel.cpp:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
-#: rc.cpp:85
+#: models/playqueuemodel.cpp:105 po/rc.cpp:116 replaygain/rgdialog.cpp:130
+#: rc.cpp:116
 msgid "Title"
 msgstr "标题"
 
@@ -746,7 +813,7 @@ msgid ""
 "from the 'Title' tag.</p>"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:99
+#: devices/devicepropertieswidget.cpp:98
 msgid ""
 "<p>If you enable this, then Cantata will create a cache of the device's "
 "music library. This will help to speed up subsequent library scans (as the "
@@ -757,19 +824,19 @@ msgid ""
 "removed, and the contents of the device re-scanned.</p>"
 msgstr ""
 
-#: devices/devicepropertieswidget.cpp:204
+#: devices/devicepropertieswidget.cpp:209
 msgid "Do not transcode"
 msgstr "不转码"
 
-#: devices/devicepropertieswidget.cpp:212
+#: devices/devicepropertieswidget.cpp:216
 msgid "Encoder"
 msgstr "编码"
 
-#: devices/devicepropertieswidget.cpp:228
+#: devices/devicepropertieswidget.cpp:231
 msgid "Transcode to %1"
 msgstr "转码成 %1"
 
-#: devices/devicepropertieswidget.cpp:259
+#: devices/devicepropertieswidget.cpp:262
 msgctxt "name (size free)"
 msgid "%1 (%2 free)"
 msgstr "%1 (剩余 %2)"
@@ -782,11 +849,11 @@ msgstr "复制到库"
 msgid "Sync"
 msgstr "同步"
 
-#: devices/devicespage.cpp:71
+#: devices/devicespage.cpp:70
 msgid "Forget Device"
 msgstr "清除设备历史"
 
-#: devices/devicespage.cpp:114 devices/remotedevicepropertiesdialog.cpp:60
+#: devices/devicespage.cpp:113 devices/remotedevicepropertiesdialog.cpp:60
 msgid "Add Device"
 msgstr "添加设备"
 
@@ -795,7 +862,7 @@ msgid "Lookup album and track details?"
 msgstr "查看专辑和音轨信息?"
 
 #: devices/devicespage.cpp:433 devices/devicespage.cpp:445
-#: devices/devicespage.cpp:455
+#: devices/devicespage.cpp:455 gui/mainwindow.cpp:589
 msgid "Refresh"
 msgstr "刷新"
 
@@ -824,8 +891,8 @@ msgstr "部分"
 msgid "Full"
 msgstr "完全"
 
-#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
-#: gui/librarypage.cpp:257
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:213 gui/folderpage.cpp:269
+#: gui/librarypage.cpp:256
 #, fuzzy
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
@@ -857,11 +924,11 @@ msgstr "确定断开 '%1' 的连接?"
 msgid "Disconnect"
 msgstr "连接断开"
 
-#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1220
 msgid "Please close other dialogs first."
 msgstr "请先关闭其他对话框."
 
-#: devices/encoders.cpp:77
+#: devices/encoders.cpp:78
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -875,7 +942,7 @@ msgstr ""
 "</a>是一种有专利授权的无损压缩数字音频格式.<br> 它的音质比同比特率的 MP3 更"
 "好.它是 iPod 或者其他移动播放设备上的一个较好选择.限于非商业合同使用"
 
-#: devices/encoders.cpp:82
+#: devices/encoders.cpp:83
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>AAC</b> encoder used by Cantata supports a <a "
@@ -893,21 +960,21 @@ msgid ""
 "s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:100 devices/encoders.cpp:140
+#: devices/encoders.cpp:101 devices/encoders.cpp:141
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr "可变比特率编码使用平均比特率"
 
-#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
-#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:293 devices/encoders.cpp:329
 msgid "Smaller file"
 msgstr "较小文件"
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:233 devices/encoders.cpp:329
+#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
+#: devices/encoders.cpp:234 devices/encoders.cpp:330
 msgid "Better sound quality"
 msgstr "较好音质"
 
-#: devices/encoders.cpp:119
+#: devices/encoders.cpp:120
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -921,7 +988,7 @@ msgstr ""
 "有损压缩的专利音频编码格式.<br>尽管有缺陷,但它仍然市易奏常见的音频存储格式,"
 "几乎所有的移动播放设备都支持 MP3."
 
-#: devices/encoders.cpp:123
+#: devices/encoders.cpp:124
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>MP3</b> encoder used by Cantata supports a <a "
@@ -937,11 +1004,11 @@ msgid ""
 "anything above <b>205kb/s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
+#: devices/encoders.cpp:156 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:158
+#: devices/encoders.cpp:159
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -955,7 +1022,7 @@ msgstr ""
 "无损压缩音频编码格式.<br>它的文件比同比特率的 MP3 更小. Ogg Vorbis是一种很不"
 "错的选择,特别是对支持它的播放器来说."
 
-#: devices/encoders.cpp:163
+#: devices/encoders.cpp:164
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Vorbis</b> encoder used by Cantata supports a "
@@ -974,15 +1041,15 @@ msgid ""
 "anything above <b>8</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:183
+#: devices/encoders.cpp:184
 msgid "Quality rating"
 msgstr "评级"
 
-#: devices/encoders.cpp:200
+#: devices/encoders.cpp:201
 msgid "Opus"
 msgstr ""
 
-#: devices/encoders.cpp:203
+#: devices/encoders.cpp:204
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -991,7 +1058,7 @@ msgid ""
 "patent-free digital audio codec using a form of lossy data compression."
 msgstr ""
 
-#: devices/encoders.cpp:205
+#: devices/encoders.cpp:206
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>The <b>Opus</b> encoder used by Cantata supports a <a "
@@ -1007,15 +1074,15 @@ msgid ""
 "anything above <b>256kb/s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:222 devices/encoders.cpp:319
+#: devices/encoders.cpp:223 devices/encoders.cpp:320
 msgid "Bitrate"
 msgstr "比特率"
 
-#: devices/encoders.cpp:241
+#: devices/encoders.cpp:242
 msgid "Apple Lossless"
 msgstr "Apple 无损"
 
-#: devices/encoders.cpp:244
+#: devices/encoders.cpp:245
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1029,11 +1096,11 @@ msgstr ""
 "%8B%A4>苹果无损格式 苹果无损格式</a> (ALAC) 是一种无损压缩的数字音乐格式.<br>"
 "推荐在苹果播放器或者其他不支持 FLAC 的播放器上使用."
 
-#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:260 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:262
+#: devices/encoders.cpp:263
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1047,7 +1114,7 @@ msgstr ""
 "(FLAC) 是一种开放的自由的无损压缩数字音乐格式.<br>如果想要确保音乐品质, FLAC "
 "是最好的选择."
 
-#: devices/encoders.cpp:266
+#: devices/encoders.cpp:267
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1062,19 +1129,19 @@ msgid ""
 "file, and are not recommended."
 msgstr ""
 
-#: devices/encoders.cpp:281
+#: devices/encoders.cpp:282
 msgid "Compression level"
 msgstr "压缩级别"
 
-#: devices/encoders.cpp:291
+#: devices/encoders.cpp:292
 msgid "Faster compression"
 msgstr "快速压缩"
 
-#: devices/encoders.cpp:298
+#: devices/encoders.cpp:299
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:301
+#: devices/encoders.cpp:302
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1088,7 +1155,7 @@ msgstr ""
 "%96%B4_%EC%98%A4%EB%94%94%EC%98%A4>Windows Media Audio</a> (WMA)是一种微软开"
 "发的有损压缩音频编码格式.<br>推荐用在不支持 Ogg Vorbis的设备上"
 
-#: devices/encoders.cpp:305
+#: devices/encoders.cpp:306
 msgid ""
 "The bitrate is a measure of the quantity of data used to represent a second "
 "of the audio track.<br>Due to the limitations of the proprietary <b>WMA</b> "
@@ -1102,163 +1169,107 @@ msgid ""
 "probably overkill."
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:33
+#: devices/filenameschemedialog.cpp:34
 msgid "Filename Scheme"
 msgstr "文件名框架"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:62
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "多个艺术家"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:63
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Wibble"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:64
 msgctxt "Example composer"
 msgid "Vivaldi"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:65
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "现在 5001"
 
-#: devices/filenameschemedialog.cpp:56
+#: devices/filenameschemedialog.cpp:66
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:57
+#: devices/filenameschemedialog.cpp:67
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "舞曲"
 
-#: devices/filenameschemedialog.cpp:101
+#: devices/filenameschemedialog.cpp:121
 msgid ""
 "<p>The following variables will be replaced with their corresponding meaning "
 "for each track name.</p>"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:103
+#: devices/filenameschemedialog.cpp:123
 msgid ""
-"<tr><th><em>Button</em></th><th><em>Variable</em></th><th><em>Description</"
+"<tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</"
 "em></th></tr>"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:104
-msgid ""
-"<tr><td>%albumartist%</td><td>%1</td><td>The artist of the album. For most "
-"albums, this will be the same as the <i>Track Artist.</i> For compilations, "
-"this will often be <i>Various Artists.</i> </td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:106
-msgid "<tr><td>%album%</td><td>%1</td><td>The name of the album.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:107
-msgid "<tr><td>%composer%</td><td>%1</td><td>The composer.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:108
-msgid "<tr><td>%artist%</td><td>%1</td><td>The artist of each track.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:109
-msgid ""
-"<tr><td>%title%</td><td>%1</td><td>The track title (without <i>Track Artist</"
-"i>).</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:110
-msgid ""
-"<tr><td>%artistandtitle%</td><td>%1</td><td>The track title (with <i>Track "
-"Artist</i>, if different to <i>Album Artist</i>).</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:111
-msgid "<tr><td>%track%</td><td>%1</td><td>The track number.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:112
-msgid ""
-"<tr><td>%discnumber%</td><td>%1</td><td>The album number of a multi-album "
-"album. Often compilations consist of several albums.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:113
-msgid ""
-"<tr><td>%year%</td><td>%1</td><td>The year of the album's release.</td></tr>"
-msgstr ""
-
-#: devices/filenameschemedialog.cpp:114
-msgid "<tr><td>%genre%</td><td>%1</td><td>The genre of the album.</td></tr>"
-msgstr ""
-
-#: devices/fsdevice.cpp:668
+#: devices/fsdevice.cpp:675 gui/albumspage.cpp:287 gui/folderpage.cpp:304
+#: gui/librarypage.cpp:414
 msgid "Updating..."
 msgstr "更新..."
 
-#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: devices/fsdevice.cpp:757 online/onlineservice.cpp:94
 #: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "读取缓存"
 
-#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
+#: devices/fsdevice.cpp:769 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr ""
 
-#: devices/mtpdevice.cpp:137
+#: devices/mtpdevice.cpp:153
 msgid "Connecting to device..."
 msgstr "正在连接到设备 ..."
 
-#: devices/mtpdevice.cpp:139 devices/mtpdevice.cpp:161
+#: devices/mtpdevice.cpp:155 devices/mtpdevice.cpp:202
 msgid "No devices found"
 msgstr "没有发现设备"
 
-#: devices/mtpdevice.cpp:173
+#: devices/mtpdevice.cpp:217
 msgid "Connected to device"
 msgstr "连接到设备"
 
-#: devices/mtpdevice.cpp:183
+#: devices/mtpdevice.cpp:230
 msgid "Disconnected from device"
 msgstr "设备连接断开"
 
-#: devices/mtpdevice.cpp:250
+#: devices/mtpdevice.cpp:304
 msgid "Updating folders..."
 msgstr "更新文件夹..."
 
-#: devices/mtpdevice.cpp:257
+#: devices/mtpdevice.cpp:320
 msgid "Updating files..."
 msgstr "更新文件..."
 
-#: devices/mtpdevice.cpp:262 devices/remotefsdevice.cpp:465
-#: devices/remotefsdevice.cpp:485
+#: devices/mtpdevice.cpp:334 devices/remotefsdevice.cpp:461
+#: devices/remotefsdevice.cpp:481
 msgid "Updating tracks..."
 msgstr "更新音轨..."
 
-#: devices/mtpdevice.cpp:281 devices/mtpdevice.cpp:383
-#: models/musiclibraryitemroot.cpp:78 models/musiclibraryitemroot.cpp:117
-#: models/musiclibraryitemroot.cpp:171 models/musiclibraryitemroot.cpp:833
-#: models/musiclibraryitemroot.cpp:1012 mpd/song.cpp:371
-msgid "Various Artists"
-msgstr "多个艺术家"
-
-#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
-#: models/devicesmodel.cpp:140
+#: devices/mtpdevice.cpp:1619 devices/remotefsdevice.cpp:564
+#: devices/umsdevice.cpp:100 gui/initialsettingswizard.cpp:57
+#: models/devicesmodel.cpp:157
 msgid "Not Connected"
 msgstr "未连接"
 
-#: devices/musicbrainz.cpp:320
+#: devices/musicbrainz.cpp:319
 msgid "%1 (Disc %2)"
 msgstr "%1 (碟 %2)"
 
-#: devices/musicbrainz.cpp:408
+#: devices/musicbrainz.cpp:407
 msgid "No matches found in MusicBrainz"
 msgstr "没有在 MusicBrainz 中找到匹配数据"
 
@@ -1266,7 +1277,7 @@ msgstr "没有在 MusicBrainz 中找到匹配数据"
 msgid "Connection"
 msgstr "连接"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:261
 msgid "Music Library"
 msgstr "音乐库"
 
@@ -1294,81 +1305,81 @@ msgstr "安全 Shell (sshfs)"
 msgid "Locally Mounted Folder"
 msgstr "本地挂载的文件夹"
 
-#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:612
+#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:608
 msgid "Available"
 msgstr "可用"
 
-#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:610
+#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:606
 msgid "Not Available"
 msgstr "不可用"
 
-#: devices/remotefsdevice.cpp:315
+#: devices/remotefsdevice.cpp:313
 msgid "Failed to resolve connection details for %1"
 msgstr "解析连接 %1 的信息失败"
 
-#: devices/remotefsdevice.cpp:330 devices/remotefsdevice.cpp:345
-#: devices/remotefsdevice.cpp:403
+#: devices/remotefsdevice.cpp:328 devices/remotefsdevice.cpp:343
+#: devices/remotefsdevice.cpp:399
 msgid "Connecting..."
 msgstr "连接中..."
 
-#: devices/remotefsdevice.cpp:358
+#: devices/remotefsdevice.cpp:356
 msgid ""
 "Password prompting does not work when cantata is started from the "
 "commandline."
 msgstr "Cantata 从命令行启动时无法使用密码."
 
-#: devices/remotefsdevice.cpp:379
+#: devices/remotefsdevice.cpp:375
 msgid ""
 "No suitable ssh-askpass application installed! This is required for entering "
 "passwords."
 msgstr "匹配的 ssh-askpass 程序未安装! 输入密码必须安装它."
 
-#: devices/remotefsdevice.cpp:386
+#: devices/remotefsdevice.cpp:382
 msgid "Mount point (\"%1\") is not empty!"
 msgstr "挂载点 (\"%1\") 非空!"
 
-#: devices/remotefsdevice.cpp:398
+#: devices/remotefsdevice.cpp:394
 msgid "\"sshfs\" is not installed!"
 msgstr "\"sshfs\"未安装!"
 
-#: devices/remotefsdevice.cpp:426 devices/remotefsdevice.cpp:446
+#: devices/remotefsdevice.cpp:422 devices/remotefsdevice.cpp:442
 msgid "Disconnecting..."
 msgstr "正在断开连接..."
 
-#: devices/remotefsdevice.cpp:440
+#: devices/remotefsdevice.cpp:436
 msgid "\"fusermount\" is not installed!"
 msgstr "\"fusermount\"未安装!"
 
-#: devices/remotefsdevice.cpp:461 devices/remotefsdevice.cpp:482
+#: devices/remotefsdevice.cpp:457 devices/remotefsdevice.cpp:478
 msgid "Failed to connect to \"%1\""
 msgstr "\"%1\" 连接失败"
 
-#: devices/remotefsdevice.cpp:462 devices/remotefsdevice.cpp:497
+#: devices/remotefsdevice.cpp:458 devices/remotefsdevice.cpp:493
 msgid "Failed to disconnect from \"%1\""
 msgstr "\"%1\" 的连接无法断开"
 
-#: devices/remotefsdevice.cpp:573
+#: devices/remotefsdevice.cpp:569
 msgid "Capacity Unknown"
 msgstr "容量未知"
 
-#. i18n: file: gui/coverdialog.ui:30
+#. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (text), widget (QPushButton, search)
-#: devices/synccollectionwidget.cpp:53 gui/stdactions.cpp:92
-#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
+#: devices/synccollectionwidget.cpp:54 gui/mainwindow.cpp:323
+#: online/podcastsearchdialog.cpp:334 po/rc.cpp:404 rc.cpp:404
 msgid "Search"
 msgstr "搜索"
 
-#: devices/synccollectionwidget.cpp:62
+#: devices/synccollectionwidget.cpp:63
 #, fuzzy
 msgid "Check Items"
 msgstr "缓存项目"
 
-#: devices/synccollectionwidget.cpp:64
+#: devices/synccollectionwidget.cpp:65
 #, fuzzy
 msgid "Uncheck Items"
 msgstr "缓存项目"
 
-#: devices/synccollectionwidget.cpp:266
+#: devices/synccollectionwidget.cpp:272
 #, fuzzy
 msgid "Nothing selected"
 msgstr "未连接"
@@ -1393,7 +1404,7 @@ msgstr "同步"
 msgid "Device and library are in sync."
 msgstr "设备和库已同步"
 
-#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:190
+#: devices/umsdevice.cpp:58 devices/umsdevice.cpp:188
 msgid "Not Scanned"
 msgstr "未扫描"
 
@@ -1401,92 +1412,92 @@ msgstr "未扫描"
 msgid " (recommended)"
 msgstr " (推荐)"
 
-#: dynamic/dynamic.cpp:208
+#: dynamic/dynamic.cpp:215
 msgid "Start Dynamic Playlist"
 msgstr "开始动态列表"
 
-#: dynamic/dynamic.cpp:209
+#: dynamic/dynamic.cpp:216
 msgid "Stop Dynamic Mode"
 msgstr "停止动态模式"
 
-#: dynamic/dynamic.cpp:257
+#: dynamic/dynamic.cpp:264
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "%1 规则"
 
-#: dynamic/dynamic.cpp:396
+#: dynamic/dynamic.cpp:403
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr ""
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:410
 msgid "Failed to locate rules file - %1"
 msgstr "无法加载配置 - %1"
 
-#: dynamic/dynamic.cpp:411
+#: dynamic/dynamic.cpp:418
 msgid "Failed to remove previous rules file - %1"
 msgstr "无法删除前一个配置 - %1"
 
-#: dynamic/dynamic.cpp:416
+#: dynamic/dynamic.cpp:423
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "无法安装配置 - %1 到 %2"
 
-#: dynamic/dynamic.cpp:729
+#: dynamic/dynamic.cpp:736
 #, fuzzy
 msgid "Dynamizer has been terminated."
 msgstr "动态未启用"
 
-#: dynamic/dynamic.cpp:816
+#: dynamic/dynamic.cpp:823 mpd/mpdconnection.cpp:150
 msgid "Uknown"
 msgstr "未知"
 
-#: dynamic/dynamic.cpp:818
+#: dynamic/dynamic.cpp:825
 msgid "Loading list of rules"
 msgstr "加载规则列表"
 
-#: dynamic/dynamic.cpp:819
+#: dynamic/dynamic.cpp:826
 msgid "Saving rule"
 msgstr "正在保存规则"
 
-#: dynamic/dynamic.cpp:820
+#: dynamic/dynamic.cpp:827
 msgid "Deleting rule"
 msgstr "删除规则"
 
-#: dynamic/dynamic.cpp:821
+#: dynamic/dynamic.cpp:828
 msgid "Setting active rule"
 msgstr "设置活动的配置"
 
-#: dynamic/dynamic.cpp:822
+#: dynamic/dynamic.cpp:829
 msgid "Stopping dynamizer"
 msgstr "正在停止动态"
 
-#: dynamic/dynamic.cpp:823
+#: dynamic/dynamic.cpp:830
 #, fuzzy
 msgid "Requesting ID details"
 msgstr "连接详情"
 
-#: dynamic/dynamic.cpp:826
+#: dynamic/dynamic.cpp:833
 msgid "Awaiting response for previous command. (%1)"
 msgstr "等待响应前一个命令. (%1)"
 
-#: dynamic/dynamic.cpp:981
+#: dynamic/dynamic.cpp:988
 msgid "Dynamizer is not active"
 msgstr "动态未启用"
 
-#: dynamic/dynamic.cpp:989
+#: dynamic/dynamic.cpp:996
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "获取动态列表失败. (%1)"
 
-#: dynamic/dynamic.cpp:1020
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to delete rules file. (%1)"
 msgstr "删除 (%1) 失败."
 
-#: dynamic/dynamic.cpp:1027
+#: dynamic/dynamic.cpp:1034
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "设置动态 (%1) 失败"
 
-#: dynamic/dynamic.cpp:1036
+#: dynamic/dynamic.cpp:1043
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "无法设置当前动态规则. (%1)"
 
@@ -1502,11 +1513,11 @@ msgstr "添加动态规则"
 msgid "Edit Dynamic Rules"
 msgstr "编辑动态配置"
 
-#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:151
+#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:150
 msgid "Remove Dynamic Rules"
 msgstr "删除动态配置"
 
-#: dynamic/dynamicpage.cpp:150
+#: dynamic/dynamicpage.cpp:149
 #, fuzzy
 msgid ""
 "Are you sure you wish to remove the selected rules?\n"
@@ -1521,15 +1532,15 @@ msgstr "动态规则"
 
 #. i18n: file: dynamic/dynamicrules.ui:53
 #. i18n: ectx: property (text), widget (QPushButton, addBtn)
-#: dynamic/dynamicruledialog.cpp:136 po/rc.cpp:280 rc.cpp:280
+#: dynamic/dynamicruledialog.cpp:145 po/rc.cpp:341 rc.cpp:341
 msgid "Add"
 msgstr "添加"
 
-#: dynamic/dynamicruledialog.cpp:202
+#: dynamic/dynamicruledialog.cpp:211
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr "<i><b>错误</b>: 原有的年份应在更改后的年份之前</i>"
 
-#: dynamic/dynamicruledialog.cpp:205
+#: dynamic/dynamicruledialog.cpp:214
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1543,27 +1554,27 @@ msgstr "相似艺术家"
 msgid "AlbumArtist"
 msgstr "专辑艺术家"
 
-#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: file: devices/filenameschemedialog.ui:102
 #. i18n: ectx: property (text), widget (QPushButton, composer)
-#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:212 rc.cpp:212
 msgid "Composer"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:48
+#: models/playqueuemodel.cpp:107 replaygain/rgdialog.cpp:129
 msgid "Album"
 msgstr "专辑"
 
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: file: devices/filenameschemedialog.ui:184
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:128
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:106
-#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:78 models/playqueuemodel.cpp:112
+#: po/rc.cpp:254 po/rc.cpp:380 rc.cpp:254 rc.cpp:380
 msgid "Genre"
 msgstr "流派"
 
@@ -1624,84 +1635,85 @@ msgstr "覆盖歌曲:"
 msgid "Saving %1"
 msgstr "正在保存 %1"
 
-#: gui/cachesettings.cpp:168
+#: gui/cachesettings.cpp:173
 #, fuzzy
 msgid "Deleting..."
 msgstr "删除规则"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Name"
 msgstr "名称"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Item Count"
 msgstr "计数"
 
-#: gui/cachesettings.cpp:191
+#: gui/cachesettings.cpp:196
 msgid "Space Used"
 msgstr "已用空间"
 
-#: gui/cachesettings.cpp:234
+#: gui/cachesettings.cpp:239
 msgid "Total space used: %1"
 msgstr ""
 
-#: gui/cachesettings.cpp:245
+#: gui/cachesettings.cpp:250
 msgid ""
-"To speed up loading of the music library, Cantata caches a local copy of the "
-"MPD listing. Cantata might also have cached covers, or lyrics, if these have "
-"been downloaded and could not be saved into the MPD folder (because Cantata "
-"cannot access it, or you have configured Cantata to not save these items "
-"there). Below is a summary of Cantata's cache usage."
+"Cantata caches a local copy of the MPD listing to speed up loading of the "
+"music library. Cantata might also have cached covers, lyrics, or artist "
+"images, if these have been downloaded and could not be saved into the MPD "
+"folder (because Cantata cannot access it, or you have configured Cantata to "
+"not save these items there). Below is a summary of Cantata's current cache "
+"usage."
 msgstr ""
 
-#: gui/cachesettings.cpp:257
+#: gui/cachesettings.cpp:263
 msgid "Covers"
 msgstr "封面"
 
-#: gui/cachesettings.cpp:258
+#: gui/cachesettings.cpp:264
+#, fuzzy
+msgid "Scaled Covers"
+msgstr "设定封面"
+
+#: gui/cachesettings.cpp:265
 #, fuzzy
 msgid "Backdrops"
 msgstr "后退"
 
-#: gui/cachesettings.cpp:263 gui/interfacesettings.cpp:167
-#: gui/mainwindow.cpp:283 gui/preferencesdialog.cpp:85
-#: widgets/groupedview.cpp:256
-msgid "Streams"
+#: gui/cachesettings.cpp:271
+#, fuzzy
+msgid "Stream Listings"
 msgstr "流媒体"
 
-#: gui/cachesettings.cpp:264
+#: gui/cachesettings.cpp:274
 msgid "Jamendo"
 msgstr ""
 
-#: gui/cachesettings.cpp:265
+#: gui/cachesettings.cpp:275
 msgid "Magnatune"
 msgstr ""
 
-#: gui/cachesettings.cpp:266
+#: gui/cachesettings.cpp:276
 msgid "Podcast Directories"
 msgstr ""
 
-#: gui/cachesettings.cpp:273
+#: gui/cachesettings.cpp:285
 msgid "Delete All"
 msgstr "删除全部"
 
-#: gui/cachesettings.cpp:312
+#: gui/cachesettings.cpp:324
 msgid "Delete all '%1' items?"
 msgstr "确定所有 '%1' 的项目?"
 
-#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
+#: gui/cachesettings.cpp:325 gui/cachesettings.cpp:335
 msgid "Delete Cache Items"
 msgstr "确定删除缓存?"
 
-#: gui/cachesettings.cpp:322
+#: gui/cachesettings.cpp:334
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr "<p>删除下面所有的项目吗?<ul>%1</ul></p>"
 
-#: gui/coverdialog.cpp:151 gui/main.cpp:231
-msgid "Last.fm"
-msgstr ""
-
-#: gui/coverdialog.cpp:165
+#: gui/coverdialog.cpp:124
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1712,70 +1724,66 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:184
-msgctxt ""
-"Google\n"
-"width x height (file size)"
-msgid ""
-"Google\n"
-"%1 x %2 (%3)"
-msgstr ""
-"Google\n"
-"%1 x %2 (%3)"
-
-#: gui/coverdialog.cpp:204
+#: gui/coverdialog.cpp:126
+#, fuzzy
 msgctxt ""
-"Discogs\n"
+"name\n"
 "width x height"
 msgid ""
-"Discogs\n"
-"%1 x %2"
+"%1\n"
+"%2 x %3"
 msgstr ""
+"%1\n"
+"%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:238
-msgctxt ""
-"Current Cover\n"
-"width x height"
-msgid ""
-"Current Cover\n"
-"%1 x %2"
+#: gui/coverdialog.cpp:162
+#, fuzzy
+msgid "Current Cover"
 msgstr ""
 "当前封面\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:256
+#: gui/coverdialog.cpp:211 gui/coverdialog.cpp:411
+msgid "CoverArt Archive"
+msgstr ""
+
+#: gui/coverdialog.cpp:242
 msgid "Image"
 msgstr "图片"
 
-#: gui/coverdialog.cpp:259
+#: gui/coverdialog.cpp:245
 msgid "Downloading..."
 msgstr "正在下载..."
 
-#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
+#: gui/coverdialog.cpp:290 gui/coverdialog.cpp:325
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "图片 (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:446
 #, fuzzy
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
 msgstr "<p>这个专辑已存在封面, 且文件无法写入.<p></p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:433
+#: gui/coverdialog.cpp:447
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
 msgstr "<p>这个专辑已存在封面, 且文件无法写入.<p></p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:440 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:234
-msgctxt "Album by Artist"
-msgid "%1 by %2"
-msgstr "%2 的 %1"
+#: gui/coverdialog.cpp:452
+#, fuzzy
+msgid "'%1' Artist Image"
+msgstr "%1 艺术家"
 
-#: gui/coverdialog.cpp:579
+#: gui/coverdialog.cpp:454
+msgctxt "'Artist - Album' Album Cover"
+msgid "'%1 - %2' Album Cover"
+msgstr ""
+
+#: gui/coverdialog.cpp:582
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1783,27 +1791,23 @@ msgstr ""
 "设置封面失败!\n"
 "无法下载临时文件!"
 
-#: gui/coverdialog.cpp:607
+#: gui/coverdialog.cpp:616
 msgid "Failed to download image!"
 msgstr "下载图片失败!"
 
-#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
+#: gui/coverdialog.cpp:875 gui/coverdialog.cpp:877
 msgid "Load Local Cover"
 msgstr "加载本地封面"
 
-#: gui/coverdialog.cpp:795
-msgid "Images (*.png *.jpg)"
-msgstr "图片 Images (*.png *.jpg)"
-
-#: gui/coverdialog.cpp:800
+#: gui/coverdialog.cpp:882
 msgid "File is already in list!"
 msgstr "文件已在列表中!"
 
-#: gui/coverdialog.cpp:804
+#: gui/coverdialog.cpp:886
 msgid "Failed to read image!"
 msgstr "读取图片失败!"
 
-#: gui/coverdialog.cpp:817
+#: gui/coverdialog.cpp:899
 msgid "Display"
 msgstr "显示"
 
@@ -1815,12 +1819,12 @@ msgstr "显示"
 #. i18n: ectx: property (text), widget (QPushButton, removeBtn)
 #. i18n: file: streams/streamssettings.ui:73
 #. i18n: ectx: property (text), widget (QPushButton, removeButton)
-#: gui/coverdialog.cpp:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
-#: rc.cpp:286 rc.cpp:765
+#: gui/coverdialog.cpp:900 gui/stdactions.cpp:90 po/rc.cpp:347 po/rc.cpp:917
+#: rc.cpp:347 rc.cpp:917
 msgid "Remove"
 msgstr "删除"
 
-#: gui/coverdialog.cpp:1181
+#: gui/coverdialog.cpp:1333
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1828,7 +1832,7 @@ msgstr ""
 "设置封面失败!\n"
 "复制图片失败!"
 
-#: gui/coverdialog.cpp:1190
+#: gui/coverdialog.cpp:1342
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1836,7 +1840,7 @@ msgstr ""
 "设置封面失败!\n"
 "备份原封面失败!"
 
-#: gui/coverdialog.cpp:1239
+#: gui/coverdialog.cpp:1391
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1844,577 +1848,687 @@ msgstr ""
 "设置封面失败!\n"
 "无法文件复制到 '%1'!"
 
-#: gui/folderpage.cpp:45
+#: gui/coverdialog.cpp:1449 models/onlineservicesmodel.cpp:157
+#, fuzzy
+msgid "Searching..."
+msgstr "搜索 %1 ..."
+
+#: gui/folderpage.cpp:44
 msgid "Open In File Manager"
 msgstr "在文件管理器里打开"
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Established"
 msgstr ""
 
-#: gui/initialsettingswizard.cpp:140
+#: gui/initialsettingswizard.cpp:141
 msgid "Connection Failed"
 msgstr "连接失败"
 
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
+#. i18n: file: support/shortcutssettingswidget.ui:78
+#. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
+#. i18n: file: context/othersettings.ui:29
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_none)
+#. i18n: file: gui/interfacesettings.ui:502
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_none)
+#. i18n: file: gui/playbacksettings.ui:51
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, stopFadeDuration)
+#. i18n: file: gui/playbacksettings.ui:145
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, crossfading)
 #. i18n: file: support/shortcutssettingswidget.ui:78
 #. i18n: ectx: property (text), widget (QLabel, defaultShortcut)
-#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
-#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
+#: gui/interfacesettings.cpp:48 gui/playbacksettings.cpp:46
+#: online/magnatuneservice.cpp:159 po/rc.cpp:6 po/rc.cpp:660 po/rc.cpp:751
+#: po/rc.cpp:778 po/rc.cpp:932 rc.cpp:6 rc.cpp:660 rc.cpp:751 rc.cpp:778
+#: rc.cpp:932
 msgid "None"
 msgstr "无"
 
-#: gui/interfacesettings.cpp:40
+#: gui/interfacesettings.cpp:49 gui/interfacesettings.cpp:160
 msgid "Small"
 msgstr "小"
 
-#: gui/interfacesettings.cpp:41
+#: gui/interfacesettings.cpp:50
 msgid "Medium"
 msgstr "中"
 
-#: gui/interfacesettings.cpp:42
+#: gui/interfacesettings.cpp:51 gui/interfacesettings.cpp:159
 msgid "Large"
 msgstr "大"
 
-#: gui/interfacesettings.cpp:43
+#: gui/interfacesettings.cpp:52
 msgid "Extra Large"
 msgstr "非常大"
 
-#: gui/interfacesettings.cpp:48
+#: gui/interfacesettings.cpp:57
+msgid "Basic Tree (No Icons)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:58
 msgid "Simple Tree"
 msgstr "简单树形"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:59
 msgid "Detailed Tree"
 msgstr "详细信息"
 
-#. i18n: file: gui/interfacesettings.ui:329
+#. i18n: file: gui/interfacesettings.ui:449
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
+#: gui/interfacesettings.cpp:61 po/rc.cpp:639 rc.cpp:639
 msgid "Grouped Albums"
 msgstr "分组专辑"
 
-#: gui/interfacesettings.cpp:53
+#: gui/interfacesettings.cpp:63
 msgid "List"
 msgstr "列表"
 
-#: gui/interfacesettings.cpp:55
+#: gui/interfacesettings.cpp:65
 msgid "Icon/List"
 msgstr "图标/列表"
 
-#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+#. i18n: file: gui/interfacesettings.ui:454
+#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
+#: gui/interfacesettings.cpp:68 po/rc.cpp:642 rc.cpp:642
+msgid "Table"
+msgstr "表单"
+
+#: gui/interfacesettings.cpp:104
+#, fuzzy
+msgid "Play queue"
+msgstr "播放队列"
+
+#. i18n: file: gui/interfacesettings.ui:182
+#. i18n: ectx: attribute (title), widget (QWidget, tab)
+#: gui/interfacesettings.cpp:105 gui/mainwindow.cpp:307 po/rc.cpp:569
+#: rc.cpp:569
+msgid "Artists"
+msgstr "艺术家"
+
+#: gui/interfacesettings.cpp:107 gui/interfacesettings.cpp:138
+#: gui/mainwindow.cpp:309
 msgid "Folders"
 msgstr "文件夹"
 
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:337
+#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
+#: gui/interfacesettings.cpp:108 gui/mainwindow.cpp:310 po/rc.cpp:609
+#: rc.cpp:609
+msgid "Playlists"
+msgstr "播放列表"
+
+#: gui/interfacesettings.cpp:110
+#, fuzzy
+msgid "Dynamic Playlists"
+msgstr "开始动态列表"
+
+#: gui/interfacesettings.cpp:114
+#, fuzzy
+msgid "Streams (e.g. Radio Stations)"
+msgstr "流媒体"
+
+#: gui/interfacesettings.cpp:121
+msgid "Online Services - Jamendo, Maganatune, SoundCloud, and Podcasts"
+msgstr ""
+
+#: gui/interfacesettings.cpp:128
+msgid "Devices - UMS, MTP (e.g. Android), and AudioCDs"
+msgstr ""
+
+#: gui/interfacesettings.cpp:134
+msgid "Search (via MPD)"
+msgstr ""
+
+#: gui/interfacesettings.cpp:135
+msgid "Info - Current song information (artist, album, and lyrics)"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#. i18n: file: gui/interfacesettings.ui:38
+#. i18n: file: gui/interfacesettings.ui:131
+#. i18n: ectx: property (text), widget (BuddyLabel, sbStyleLabel)
+#. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#. i18n: file: gui/interfacesettings.ui:146
+#. i18n: file: gui/interfacesettings.ui:281
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3a)
-#. i18n: file: gui/interfacesettings.ui:211
+#. i18n: file: gui/interfacesettings.ui:346
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: gui/interfacesettings.ui:313
+#. i18n: file: gui/interfacesettings.ui:438
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueGroupedLabel)
-#: gui/interfacesettings.cpp:165 gui/interfacesettings.cpp:168
-#: gui/interfacesettings.cpp:171 gui/interfacesettings.cpp:174 po/rc.cpp:472
-#: po/rc.cpp:491 po/rc.cpp:512 po/rc.cpp:536 rc.cpp:472 rc.cpp:491 rc.cpp:512
-#: rc.cpp:536
+#: gui/interfacesettings.cpp:139 po/rc.cpp:554 po/rc.cpp:572 po/rc.cpp:591
+#: po/rc.cpp:612 po/rc.cpp:636 rc.cpp:554 rc.cpp:572 rc.cpp:591 rc.cpp:612
+#: rc.cpp:636
 msgid "Style:"
 msgstr "视图:"
 
-#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
-#: gui/preferencesdialog.cpp:89
-msgid "Online"
-msgstr "在线"
+#: gui/interfacesettings.cpp:161
+msgid "Tab-bar"
+msgstr ""
 
-#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
-msgid "Devices"
-msgstr "设备"
+#: gui/interfacesettings.cpp:162
+msgid "Left"
+msgstr ""
 
-#: gui/interfacesettings.cpp:178
-msgid "Grouped by 'Album Artist'"
-msgstr "'专辑艺术家'分组"
+#: gui/interfacesettings.cpp:162
+msgid "Right"
+msgstr ""
 
-#: gui/interfacesettings.cpp:179
-msgid "Grouped under 'Various Artists'"
-msgstr "'多个艺术家'分组"
+#: gui/interfacesettings.cpp:163
+#, fuzzy
+msgid "Top"
+msgstr "顶栏"
+
+#: gui/interfacesettings.cpp:164
+#, fuzzy
+msgid "Bottom"
+msgstr "底部栏"
+
+#: gui/interfacesettings.cpp:391
+#, fuzzy
+msgid "System default"
+msgstr "默认"
 
-#: gui/main.cpp:213 gui/mainwindow.cpp:1941 gui/trayitem.cpp:98
-#: gui/trayitem.cpp:100 gui/trayitem.cpp:135 gui/trayitem.cpp:199
-#: gui/trayitem.cpp:209 gui/trayitem.cpp:212 gui/trayitem.cpp:215
-#: gui/trayitem.cpp:228 gui/trayitem.cpp:230
+#: gui/main.cpp:224 gui/mainwindow.cpp:2075 gui/trayitem.cpp:112
+#: gui/trayitem.cpp:118 gui/trayitem.cpp:153 gui/trayitem.cpp:217
+#: gui/trayitem.cpp:227 gui/trayitem.cpp:230 gui/trayitem.cpp:233
+#: gui/trayitem.cpp:246 gui/trayitem.cpp:248
 msgid "Cantata"
 msgstr ""
 
-#: gui/main.cpp:214
+#: gui/main.cpp:225
 msgid "A KDE client for MPD"
 msgstr "KDE 下的 MPD 客户端"
 
-#: gui/main.cpp:216
-#, fuzzy
-msgid "Copyright (c) 2011–2013 Craig Drummond"
-msgstr "Copyright (c) 2011-2013 Craig Drummond"
+#: gui/main.cpp:227
+msgid "© 2011-2014 Craig Drummond"
+msgstr ""
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:220
+#: gui/main.cpp:231
 msgid "Maintainer"
 msgstr "维护者"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:221
+#: gui/main.cpp:232
 msgid "UI Improvements"
 msgstr "界面优化"
 
-#: gui/main.cpp:222
+#: gui/main.cpp:233
 msgid "Sander Knopper"
 msgstr "Sander Knopper"
 
-#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
+#: gui/main.cpp:233 gui/main.cpp:234 gui/main.cpp:235 gui/main.cpp:236
 msgid "QtMPC author"
 msgstr "QtMPC 作者"
 
-#: gui/main.cpp:223
+#: gui/main.cpp:234
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:224
+#: gui/main.cpp:235
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:225
+#: gui/main.cpp:236
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid "FanArt.tv"
 msgstr ""
 
-#: gui/main.cpp:229
+#: gui/main.cpp:237
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr ""
 
-#: gui/main.cpp:230
+#: gui/main.cpp:238
 msgid "Wikipedia"
 msgstr ""
 
-#: gui/main.cpp:230 gui/main.cpp:231
+#: gui/main.cpp:238 gui/main.cpp:239
 msgid "Context view metadata"
 msgstr ""
 
-#: gui/main.cpp:235
-msgid "URL to open"
-msgstr "打开 URL"
+#: gui/main.cpp:239
+msgid "Last.fm"
+msgstr ""
+
+#: gui/main.cpp:243
+msgid "URL to open"
+msgstr "打开 URL"
 
-#: gui/mainwindow.cpp:238
+#: gui/mainwindow.cpp:269
 msgid "Quit"
 msgstr "退出"
 
-#: gui/mainwindow.cpp:242
+#: gui/mainwindow.cpp:273
 msgid "Show Window"
 msgstr "显示窗口"
 
 #. i18n: file: gui/initialsettingswizard.ui:469
 #. i18n: ectx: property (text), widget (QPushButton, connectButton)
-#: gui/mainwindow.cpp:245 po/rc.cpp:418 rc.cpp:418
+#: gui/mainwindow.cpp:276 po/rc.cpp:482 rc.cpp:482
 msgid "Connect"
 msgstr "连接"
 
-#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
+#: gui/mainwindow.cpp:277 gui/preferencesdialog.cpp:83
 #, fuzzy
 msgid "Collection"
 msgstr "连接"
 
-#: gui/mainwindow.cpp:247
+#: gui/mainwindow.cpp:278
 msgid "Outputs"
 msgstr "输出"
 
-#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
+#: gui/mainwindow.cpp:279 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "音轨后停止"
 
-#: gui/mainwindow.cpp:249
+#: gui/mainwindow.cpp:280
 msgid "Add To Stored Playlist"
 msgstr "添加到已有列表"
 
-#: gui/mainwindow.cpp:250
+#: gui/mainwindow.cpp:281
 msgid "Remove From Play Queue"
 msgstr "从播放队列中删除"
 
-#: gui/mainwindow.cpp:251
+#: gui/mainwindow.cpp:282
 msgid "Copy Track Info"
 msgstr "复制音轨信息"
 
-#: gui/mainwindow.cpp:252
+#: gui/mainwindow.cpp:283
 msgid "Crop"
 msgstr "裁减"
 
-#: gui/mainwindow.cpp:253
+#: gui/mainwindow.cpp:284
 #, fuzzy
 msgid "Shuffle Tracks"
 msgstr "单个音轨"
 
-#: gui/mainwindow.cpp:254
+#: gui/mainwindow.cpp:285
 #, fuzzy
 msgid "Shuffle Albums"
 msgstr "随机"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:286
 msgid "Add Stream URL"
 msgstr "添加流媒体"
 
-#: gui/mainwindow.cpp:256
+#: gui/mainwindow.cpp:287
 msgid "Clear"
 msgstr "清除"
 
-#: gui/mainwindow.cpp:257
+#: gui/mainwindow.cpp:288
 msgid "Expanded Interface"
 msgstr "展开界面"
 
-#: gui/mainwindow.cpp:258
+#: gui/mainwindow.cpp:289
 #, fuzzy
 msgid "Show Current Song Information"
 msgstr "服务器信息"
 
-#: gui/mainwindow.cpp:261
+#: gui/mainwindow.cpp:292
 msgid "Full Screen"
 msgstr "全屏"
 
-#: gui/mainwindow.cpp:263
+#: gui/mainwindow.cpp:294
 msgid "Random"
 msgstr "随机"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:295
 msgid "Repeat"
 msgstr "重复"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid "Single"
 msgstr "单曲"
 
-#: gui/mainwindow.cpp:265
+#: gui/mainwindow.cpp:296
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
 msgstr ""
 "'单曲'启用时, 将在当前歌曲完成后停止播放. 或者 '重复'启用时, 将反复播放."
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid "Consume"
 msgstr "省资源"
 
-#: gui/mainwindow.cpp:266
+#: gui/mainwindow.cpp:297
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
 msgstr "当节省资源打开时,播放过的歌曲将被从队列中移除."
 
-#: gui/mainwindow.cpp:267
-#, fuzzy
-msgid "Search Play Queue"
-msgstr "搜索播放队列..."
-
-#: gui/mainwindow.cpp:269
+#: gui/mainwindow.cpp:298
 msgid "Set Priority"
 msgstr "设置优先级"
 
-#: gui/mainwindow.cpp:271
+#: gui/mainwindow.cpp:300
 msgid "Play Stream"
 msgstr "播放流媒体"
 
-#: gui/mainwindow.cpp:273
+#: gui/mainwindow.cpp:302
 msgid "Locate In Library"
 msgstr "在库中定位"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:304
 msgid "Edit Song Tags"
 msgstr "编辑歌曲标签"
 
-#. i18n: file: gui/interfacesettings.ui:304
+#. i18n: file: gui/interfacesettings.ui:429
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
+#: gui/mainwindow.cpp:306 po/rc.cpp:633 rc.cpp:633
 msgid "Play Queue"
 msgstr "播放队列"
 
-#. i18n: file: gui/interfacesettings.ui:27
-#. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
-msgid "Artists"
-msgstr "艺术家"
-
-#. i18n: file: gui/interfacesettings.ui:202
-#. i18n: ectx: attribute (title), widget (QWidget, tab_6)
-#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
-msgid "Playlists"
-msgstr "播放列表"
-
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:312
 msgid "Dynamic"
 msgstr "动态"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:315 gui/preferencesdialog.cpp:89
+#: widgets/groupedview.cpp:251
+msgid "Streams"
+msgstr "流媒体"
+
+#: gui/mainwindow.cpp:318 gui/preferencesdialog.cpp:94
+msgid "Online"
+msgstr "在线"
+
+#: gui/mainwindow.cpp:321
+msgid "Devices"
+msgstr "设备"
+
+#: gui/mainwindow.cpp:324
 msgid "Expand All"
 msgstr "展开所有"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:325
 msgid "Collapse All"
 msgstr "收起所有"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:326
 #, fuzzy
 msgid "Remove All Songs"
 msgstr "删除播放列表?"
 
-#: gui/mainwindow.cpp:398
+#: gui/mainwindow.cpp:456
 msgid "Info"
 msgstr "信息"
 
-#: gui/mainwindow.cpp:405
-msgid "Auto Hide"
-msgstr "自动隐藏"
-
-#: gui/mainwindow.cpp:411
-msgid "Monochrome Icons"
-msgstr ""
-
-#: gui/mainwindow.cpp:541
+#: gui/mainwindow.cpp:585
 msgid "Server information..."
 msgstr "服务器信息..."
 
-#: gui/mainwindow.cpp:552
+#: gui/mainwindow.cpp:588
+msgid "Refresh Database"
+msgstr "刷新数据"
+
+#: gui/mainwindow.cpp:602
 msgid "Configure Cantata..."
 msgstr "设置 Cantata..."
 
-#: gui/mainwindow.cpp:559
+#: gui/mainwindow.cpp:612
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "关于 Cantata..."
 
-#: gui/mainwindow.cpp:571
+#: gui/mainwindow.cpp:624
 msgid "&File"
 msgstr "文件(&F)"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:628
+#, fuzzy
+msgid "&Edit"
+msgstr "编辑"
+
+#: gui/mainwindow.cpp:631
 msgid "&Settings"
 msgstr "设置(&S)"
 
-#: gui/mainwindow.cpp:589 support/dialog.cpp:97
+#: gui/mainwindow.cpp:646 support/dialog.cpp:81
 msgid "&Help"
 msgstr "帮助(&H)"
 
-#: gui/mainwindow.cpp:948
+#: gui/mainwindow.cpp:1035
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr "无法给歌曲匹配动态设置."
 
-#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
+#: gui/mainwindow.cpp:1157 mpd/mpdconnection.cpp:401
 msgid "Connecting to %1"
 msgstr "连接到 %1"
 
-#: gui/mainwindow.cpp:1151
+#: gui/mainwindow.cpp:1189
+#, fuzzy
+msgid "Refresh MPD Database?"
+msgstr "刷新数据"
+
+#: gui/mainwindow.cpp:1257
 msgid ""
 "Podcasts are currently being downloaded\n"
 "\n"
 "Quiting now will abort all downloads."
 msgstr ""
 
-#: gui/mainwindow.cpp:1152
+#: gui/mainwindow.cpp:1258
 msgid "Abort downloads and quit"
 msgstr ""
 
-#: gui/mainwindow.cpp:1447
+#: gui/mainwindow.cpp:1577
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "关于 Cantata"
 
-#: gui/mainwindow.cpp:1448
+#: gui/mainwindow.cpp:1578
 #, fuzzy
 msgctxt "Qt-only"
 msgid ""
-"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
-"<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl.html"
-"\">GPLv3</a>"
+"<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>Released under the <a href=\"http://www.gnu.org/licenses/gpl."
+"html\">GPLv3</a>"
 msgstr ""
-"<b>Cantata %1</b><br/><br/>MPD 的简单前端.<br/><br/>(c) Craig Drummond "
-"2011-2012.<br/>采用 GPLv2 协议发布<br/><br/><i><small>基于 QtMPC - (c) "
+"<b>Cantata %1</b><br/><br/>MPD 的简单前端.<br/><br/>© 2011-2014 Craig "
+"Drummond<br/>采用 GPLv2 协议发布<br/><br/><i><small>基于 QtMPC - © "
 "2007-2010 QtMPC 作者版权所有</small></i>"
 
-#: gui/mainwindow.cpp:1450
+#: gui/mainwindow.cpp:1580
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
-"QtMPC Authors<br/>"
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - © 2007-2010 "
+"The QtMPC Authors<br/>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1451
+#: gui/mainwindow.cpp:1581
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1452
+#: gui/mainwindow.cpp:1582
 msgctxt "Qt-only"
 msgid ""
 "Context view metadata courtesy of <a href=\"http://www.wikipedia.org"
 "\">Wikipedia</a> and <a href=\"http://www.last.fm\">Last.fm</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1453
+#: gui/mainwindow.cpp:1583
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1594
 #, fuzzy
 msgid ""
-"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
-"</td><td>%1.%2.%3</td></tr><tr><td align=\"right\">Uptime:</td><td>%4</td></"
-"tr><tr><td align=\"right\">Time playing:</td><td>%5</td></tr>"
+"<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right"
+"\">Protocol version: </td><td>%1.%2.%3</td></tr><tr><td align="
+"\"right\">Uptime: </td><td>%4</td></tr><tr><td align=\"right"
+"\">Time playing: </td><td>%5</td></tr>"
 msgstr ""
 "<table><tr><td align=\"right\">艺术家:</td><td>%1</td></tr><tr><td align="
 "\"right\">专辑:</td><td>%2</td></tr><tr><td align=\"right\">音轨:</td><td>"
 "%3</td></tr><tr><td align=\"right\">文件:</td><td>%4</td></tr></table>"
 
-#: gui/mainwindow.cpp:1472
+#: gui/mainwindow.cpp:1602
 #, fuzzy
 msgid ""
 "<tr><td colspan=\"2\"><b>Database</b></td></tr><tr><td align=\"right"
-"\">Artists:</td><td>%1</td></tr><tr><td align=\"right\">Albums:</td><td>%2</"
-"td></tr><tr><td align=\"right\">Songs:</td><td>%3</td></tr><tr><td align="
-"\"right\">URL handlers:</td><td>%4</td></tr><tr><td align=\"right\">Total "
-"duration:</td><td>%5</td></tr><tr><td align=\"right\">Last update:</td><td>"
-"%6</td></tr></table></p>"
+"\">Artists: </td><td>%1</td></tr><tr><td align=\"right\">Albums: </"
+"td><td>%2</td></tr><tr><td align=\"right\">Songs: </td><td>%3</td></"
+"tr><tr><td align=\"right\">URL handlers: </td><td>%4</td></"
+"tr><tr><td align=\"right\">Total duration: </td><td>%5</td></"
+"tr><tr><td align=\"right\">Last update: </td><td>%6</td></tr></"
+"table></p>"
 msgstr ""
 "<table><tr><td align=\"right\">艺术家:</td><td>%1</td></tr><tr><td align="
 "\"right\">专辑:</td><td>%2</td></tr><tr><td align=\"right\">音轨:</td><td>"
 "%3</td></tr><tr><td align=\"right\">源文件:</td><td>%4</td></tr><tr><td "
 "align=\"right\">目标文件:</td><td>%5</td></tr></table>"
 
-#: gui/mainwindow.cpp:1481
+#: gui/mainwindow.cpp:1611
 msgid "Server Information"
 msgstr "服务器信息"
 
-#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
+#: gui/mainwindow.cpp:1859 gui/mainwindow.cpp:1866
 msgid "Cantata (%1)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
+#: gui/mainwindow.cpp:1862 gui/mainwindow.cpp:1869
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: Cantata (%2)"
 
-#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
+#: gui/mainwindow.cpp:1863 gui/mainwindow.cpp:1870
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: Cantata"
 
-#: gui/mainwindow.cpp:1728
+#: gui/mainwindow.cpp:1874
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: Cantata (%3)"
 
-#: gui/mainwindow.cpp:1730
+#: gui/mainwindow.cpp:1876
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: Cantata"
 
-#: gui/mainwindow.cpp:1773
+#: gui/mainwindow.cpp:1919
 msgid "(Stream)"
 msgstr "(流媒体)"
 
-#: gui/mainwindow.cpp:1775
+#: gui/mainwindow.cpp:1921
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
+#: gui/mainwindow.cpp:1939 widgets/groupedview.cpp:278
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1843
+#: gui/mainwindow.cpp:1989 mpd/mpdconnection.cpp:543 mpd/mpdconnection.cpp:550
 msgid "MPD reported the following error: %1"
 msgstr ""
 
-#: gui/mainwindow.cpp:1990
+#: gui/mainwindow.cpp:2119
 #, fuzzy
 msgid "Remove all songs from play queue?"
 msgstr "从播放队列中删除"
 
-#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
+#: gui/mainwindow.cpp:2210 models/playqueuemodel.cpp:113
 msgid "Priority"
 msgstr "优先级"
 
-#: gui/mainwindow.cpp:2080
+#: gui/mainwindow.cpp:2210
 msgid "Enter priority (0..255):"
 msgstr "输入优先级 (0到255)"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Playlist Name"
 msgstr "播放列表名称"
 
-#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+#: gui/mainwindow.cpp:2233 gui/playlistspage.cpp:326
 msgid "Enter a name for the playlist:"
 msgstr "输入播放列表名称:"
 
-#: gui/mainwindow.cpp:2106
+#: gui/mainwindow.cpp:2236
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr "已经有名为 <b>%1</b>的播放列表!<br/>添加到它吗?"
 
-#: gui/mainwindow.cpp:2107
+#: gui/mainwindow.cpp:2237
 msgid "Existing Playlist"
 msgstr "已有同名播放列表"
 
-#: gui/playbacksettings.cpp:42
-msgid "Do not fadeout"
-msgstr "不淡出"
+#: gui/mainwindow.cpp:2303
+#, fuzzy
+msgid "Stream URL"
+msgstr "添加流媒体"
 
-#: gui/playbacksettings.cpp:43
-msgid " ms"
-msgstr " 毫秒"
+#: gui/mainwindow.cpp:2303
+msgid "Enter URL of stream:"
+msgstr ""
+
+#: gui/mainwindow.cpp:2306
+msgid "Invalid, or unsupported, URL!"
+msgstr ""
+
+#: gui/mainwindow.cpp:2889
+msgid "Can only edit tags of songs within MPD's music collection."
+msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:165
+#. i18n: file: devices/albumdetails.ui:158
 #. i18n: ectx: property (text), widget (QTreeWidget, tracks)
-#: gui/playbacksettings.cpp:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
-#: rc.cpp:79
+#: gui/playbacksettings.cpp:47 models/playqueuemodel.cpp:108 po/rc.cpp:110
+#: rc.cpp:110
 msgid "Track"
 msgstr "音轨"
 
-#: gui/playbacksettings.cpp:51
+#: gui/playbacksettings.cpp:49
 #, fuzzy
 msgid "Auto"
 msgstr "自动跳过"
 
-#: gui/playbacksettings.cpp:164
+#: gui/playbacksettings.cpp:161
 #, fuzzy
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
 msgstr "<i><b>%1 已连接</b><br/>下面是已经连接的MPD。</i>"
 
-#. i18n: file: gui/playbacksettings.ui:26
+#. i18n: file: gui/playbacksettings.ui:114
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
+#: gui/playbacksettings.cpp:164 po/rc.cpp:769 rc.cpp:769
 #, fuzzy
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
 msgstr "<i><b>未连接到 MPD 。</b><br/>选项无法修改。</i>"
 
-#: gui/playbacksettings.cpp:174
+#: gui/playbacksettings.cpp:171
 msgid ""
 "<p>Replay Gain is a proposed standard published in 2001 to normalize the "
 "perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It "
@@ -2428,11 +2542,20 @@ msgid ""
 "li></ul></p>"
 msgstr ""
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:95 widgets/playqueueview.cpp:160
+msgid "Stretch Columns To Fit Window"
+msgstr ""
+
+#: gui/playlistspage.cpp:146 tags/tageditor.cpp:828 tags/trackorganiser.cpp:72
 msgid "Rename"
 msgstr "重命名"
 
-#: gui/playlistspage.cpp:190
+#: gui/playlistspage.cpp:147 models/playqueuemodel.cpp:156
+#, fuzzy
+msgid "Remove Duplicates"
+msgstr "删除播放列表?"
+
+#: gui/playlistspage.cpp:309
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2440,122 +2563,182 @@ msgstr ""
 "确定删除选择的列表?\n"
 "操作将无法恢复。"
 
-#: gui/playlistspage.cpp:191
+#: gui/playlistspage.cpp:310
 #, fuzzy
 msgid "Remove Playlists"
 msgstr "删除播放列表?"
 
-#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
+#: gui/playlistspage.cpp:330 gui/playlistspage.cpp:357
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr "已经有名为 <b>%1</b>的播放列表!<br/><br/>覆盖吗?"
 
-#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
+#: gui/playlistspage.cpp:331 gui/playlistspage.cpp:358
 #, fuzzy
 msgid "Overwrite Playlist"
 msgstr "覆盖播放列表?"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Rename Playlist"
 msgstr "重命名播放列表"
 
-#: gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:353
 msgid "Enter new name for playlist:"
 msgstr "输入播放列表新名称:"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/playlistspage.cpp:446
+msgid "Cannot add songs from '%1' to '%2'"
+msgstr ""
+
+#: gui/preferencesdialog.cpp:83
 #, fuzzy
 msgid "Collection Settings"
 msgstr "连接设置"
 
-#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: file: gui/playbacksettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
+#: gui/preferencesdialog.cpp:84 po/rc.cpp:742 rc.cpp:742
 msgid "Playback"
 msgstr "回放"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:84
 msgid "Playback Settings"
 msgstr "回放设置"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "Files"
 msgstr "文件"
 
-#: gui/preferencesdialog.cpp:82
+#: gui/preferencesdialog.cpp:85
 msgid "File Settings"
 msgstr "设置"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface"
 msgstr "界面"
 
-#: gui/preferencesdialog.cpp:83
+#: gui/preferencesdialog.cpp:86
 msgid "Interface Settings"
 msgstr "界面设置"
 
-#: gui/preferencesdialog.cpp:85
+#: gui/preferencesdialog.cpp:89
 #, fuzzy
 msgid "Streams Settings"
 msgstr "流媒体"
 
-#: gui/preferencesdialog.cpp:89
+#: gui/preferencesdialog.cpp:94
 #, fuzzy
 msgid "Online Providers"
 msgstr "在线视图:"
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 msgid "Context"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:92
+#: gui/preferencesdialog.cpp:97
 #, fuzzy
 msgid "Context View Settings"
 msgstr "连接设置"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server"
 msgstr "HTTP 服务器"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:106
 msgid "HTTP Server Settings"
 msgstr "HTTP 服务器设置"
 
-#: gui/preferencesdialog.cpp:103
+#: gui/preferencesdialog.cpp:115
 msgid "Audio CD Settings"
 msgstr "音乐 CD 设置"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 #, fuzzy
 msgid "Proxy"
 msgstr "代理"
 
-#: gui/preferencesdialog.cpp:108
+#: gui/preferencesdialog.cpp:120
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "代理设置"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "快捷"
 
-#: gui/preferencesdialog.cpp:112
+#: gui/preferencesdialog.cpp:124
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "快捷键设定"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cache"
 msgstr "缓存"
 
-#: gui/preferencesdialog.cpp:115
+#: gui/preferencesdialog.cpp:127
 msgid "Cached Items"
 msgstr "缓存项目"
 
-#: gui/preferencesdialog.cpp:116
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#. i18n: file: devices/actiondialog.ui:49
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureSourceButton)
+#. i18n: file: devices/actiondialog.ui:102
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureDestButton)
+#. i18n: file: gui/coverdialog.ui:37
+#. i18n: ectx: property (toolTip), widget (QToolButton, configureButton)
+#: gui/preferencesdialog.cpp:128 po/rc.cpp:53 po/rc.cpp:65 po/rc.cpp:410
+#: rc.cpp:53 rc.cpp:65 rc.cpp:410
 msgid "Configure"
 msgstr "设置"
 
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#. i18n: file: devices/albumdetails.ui:50
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: dynamic/dynamicrule.ui:89
+#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
+#. i18n: file: tags/tageditor.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
+#: gui/searchpage.cpp:200 po/rc.cpp:89 po/rc.cpp:371 po/rc.cpp:950 rc.cpp:89
+#: rc.cpp:371 rc.cpp:950
+msgid "Composer:"
+msgstr ""
+
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#. i18n: file: devices/albumdetails.ui:76
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: tags/tageditor.ui:129
+#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
+#: gui/searchpage.cpp:205 po/rc.cpp:95 po/rc.cpp:962 rc.cpp:95 rc.cpp:962
+msgid "Genre:"
+msgstr "流派:"
+
+#: gui/searchpage.cpp:206
+#, fuzzy
+msgid "Date:"
+msgstr "日期"
+
+#: gui/searchpage.cpp:208
+msgid "Any:"
+msgstr ""
+
+#: gui/searchpage.cpp:215
+#, fuzzy
+msgid "No tracks found."
+msgstr "没有发现设备"
+
 #: gui/serversettings.cpp:87
 msgid ""
 "<i> This folder will also be used to locate music files for transferring to "
@@ -2579,8 +2762,8 @@ msgstr "未使用"
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: network/proxysettings.ui:63
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
-#: gui/serversettings.cpp:103 po/rc.cpp:208 po/rc.cpp:247 po/rc.cpp:705
-#: rc.cpp:208 rc.cpp:247 rc.cpp:705
+#: gui/serversettings.cpp:103 po/rc.cpp:269 po/rc.cpp:308 po/rc.cpp:857
+#: rc.cpp:269 rc.cpp:308 rc.cpp:857
 msgid "Host:"
 msgstr "主机名:"
 
@@ -2616,7 +2799,7 @@ msgid ""
 "</i></p>"
 msgstr ""
 
-#: gui/serversettings.cpp:252
+#: gui/serversettings.cpp:257
 msgid ""
 "Which type of collection do you wish to connect to?<br/><ul><li>Standard - "
 "music collection may be shared, is on another machine, or is already setup</"
@@ -2624,78 +2807,66 @@ msgid ""
 "configure and control the MPD instance</li></ul>"
 msgstr ""
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 #, fuzzy
 msgid "Add Collection"
 msgstr "连接"
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Standard"
 msgstr ""
 
-#: gui/serversettings.cpp:255
+#: gui/serversettings.cpp:260
 msgid "Basic"
 msgstr ""
 
-#: gui/serversettings.cpp:297
+#: gui/serversettings.cpp:302
 #, fuzzy
 msgid "Delete <b>%1</b>?"
 msgstr "确定删除 %1 ?"
 
-#: gui/serversettings.cpp:298
+#: gui/serversettings.cpp:303
 #, fuzzy
 msgid "Delete"
 msgstr "删除全部"
 
-#: gui/serversettings.cpp:336
+#: gui/serversettings.cpp:341
 #, fuzzy
 msgid "New Collection %1"
 msgstr "连接到 %1"
 
-#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
+#: gui/serversettings.cpp:357 mpd/mpdconnection.cpp:173
 msgid "Default"
 msgstr "默认"
 
-#: gui/shortcutssettingspage.cpp:74
+#: gui/shortcutssettingspage.cpp:76
 msgid "Multi-Media Keys"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:80
+#: gui/shortcutssettingspage.cpp:82
 msgid "Do not use media keys to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:81
+#: gui/shortcutssettingspage.cpp:83 gui/shortcutssettingspage.cpp:97
 msgid "Use media keys to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:84
+#: gui/shortcutssettingspage.cpp:86 gui/shortcutssettingspage.cpp:104
 msgid "Use media keys, as configured in desktop settings, to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:85
+#: gui/shortcutssettingspage.cpp:87 gui/shortcutssettingspage.cpp:105
 msgid ""
 "Use media keys, as configured in GNOME/Unity settings, to control Cantata"
 msgstr ""
 
-#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
-#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+#: gui/shortcutssettingspage.cpp:90 gui/shortcutssettingspage.cpp:107
+#: online/onlineservicespage.cpp:99 streams/streamspage.cpp:99
+#: support/fancytabwidget.cpp:825
 #, fuzzy
 msgid "Configure..."
 msgstr "设置"
 
-#: gui/shortcutssettingspage.cpp:95
-msgid "Use media keys to control Cantata:"
-msgstr ""
-
-#: gui/shortcutssettingspage.cpp:106
-msgid "Use media keys, as configured in desktop settings, to control Cantata:"
-msgstr ""
-
-#: gui/shortcutssettingspage.cpp:107
-msgid ""
-"Use media keys, as configured in GNOME/Unity settings, to control Cantata:"
-msgstr ""
-
 #: gui/stdactions.cpp:55
 msgid "Previous Track"
 msgstr "上一个"
@@ -2768,7 +2939,7 @@ msgstr "自定义优先级..."
 msgid "Add To Playlist"
 msgstr "添加到播放列表"
 
-#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:66
 msgid "Organize Files"
 msgstr "组织文件"
 
@@ -2776,7 +2947,7 @@ msgstr "组织文件"
 msgid "Edit Tags"
 msgstr "编辑标签"
 
-#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:106
 msgid "ReplayGain"
 msgstr "播放增益"
 
@@ -2791,20 +2962,20 @@ msgid "Set Image"
 msgstr "图片"
 
 #: gui/stdactions.cpp:88
-msgid "Refresh Database"
-msgstr "刷新数据"
-
-#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "后退"
 
-#: gui/trayitem.cpp:192
+#: gui/stdactions.cpp:91
+msgid "Find"
+msgstr ""
+
+#: gui/trayitem.cpp:210
 #, fuzzy
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%2 的 %3 中的 %1"
 
-#: gui/trayitem.cpp:193
+#: gui/trayitem.cpp:211
 #, fuzzy
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
@@ -2812,71 +2983,72 @@ msgstr ""
 "Google\n"
 "%1 x %2 (%3)"
 
-#: gui/trayitem.cpp:195
+#: gui/trayitem.cpp:213
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%2 的 %3 中的 %1"
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:214
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr "%2 的 %3 中的 %1"
 
-#: gui/trayitem.cpp:223
+#: gui/trayitem.cpp:241
 msgid "Now playing"
 msgstr "正在播放"
 
-#: http/httpserversettings.cpp:40
+#: http/httpserversettings.cpp:39
 msgid "Local loopback (%1)"
 msgstr ""
 
-#: http/httpserversettings.cpp:43
+#: http/httpserversettings.cpp:42
 msgid "Wired (%1)"
 msgstr ""
 
-#: http/httpserversettings.cpp:46
+#: http/httpserversettings.cpp:45
 msgid "Wireless (%1)"
 msgstr ""
 
-#: http/httpserversettings.cpp:53
+#: http/httpserversettings.cpp:52
 msgid "First active interface"
 msgstr ""
 
-#: http/httpserversettings.cpp:98
-msgid "Inactive"
-msgstr "非交互"
+#: models/albumsmodel.cpp:260 models/musicmodel.cpp:254
+msgctxt "Album by Artist"
+msgid "%1 by %2"
+msgstr "%2 的 %1"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:221
+#: models/musicmodel.cpp:133
 msgid "Cue Sheet"
 msgstr "Cue 表"
 
-#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
-#: models/musicmodel.cpp:128
+#: models/albumsmodel.cpp:284 models/dirviewmodel.cpp:220
+#: models/musicmodel.cpp:133
 msgid "Playlist"
 msgstr "播放列表"
 
-#: models/devicesmodel.cpp:108
+#: models/devicesmodel.cpp:116
 msgid "Configure Device"
 msgstr "设置设备"
 
-#: models/devicesmodel.cpp:109
+#: models/devicesmodel.cpp:117
 msgid "Refresh Device"
 msgstr "刷新设备"
 
-#: models/devicesmodel.cpp:110
+#: models/devicesmodel.cpp:118
 msgid "Connect Device"
 msgstr "连接设备"
 
-#: models/devicesmodel.cpp:111
+#: models/devicesmodel.cpp:119
 msgid "Disconnect Device"
 msgstr "断开设备"
 
-#: models/devicesmodel.cpp:113
+#: models/devicesmodel.cpp:121
 msgid "Edit CD Details"
 msgstr "编辑 CD 详细信息"
 
-#: models/devicesmodel.cpp:690
+#: models/devicesmodel.cpp:730
 msgid "No Devices Attached"
 msgstr "没有关联设备"
 
@@ -2910,257 +3082,264 @@ msgstr ""
 msgid "Session expired"
 msgstr ""
 
-#: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
+#: models/dirviewmodel.cpp:204 models/dirviewmodel.cpp:212
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:696
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "接口 %1"
 
-#: models/dirviewmodel.cpp:190
+#: models/dirviewmodel.cpp:219
 msgid "Audio File"
 msgstr "音频文件"
 
-#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
-#: models/musiclibraryitemroot.cpp:844
+#: models/musiclibraryitemartist.cpp:248 models/musiclibraryitemartist.cpp:261
+#: models/musiclibraryitemroot.cpp:840
 msgid "Single Tracks"
 msgstr "单个音轨"
 
-#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
-#: widgets/groupedview.cpp:366
+#: models/musicmodel.cpp:190 models/onlineservicesmodel.cpp:167
+#: widgets/groupedview.cpp:364
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "1 音轨"
 
-#: models/musicmodel.cpp:185
+#: models/musicmodel.cpp:196
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "艺术家 %1"
 
-#: models/musicmodel.cpp:192
+#: models/musicmodel.cpp:203
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "专辑封面 %1"
 
-#: models/musicmodel.cpp:198
+#: models/musicmodel.cpp:209
 msgid "1 Episode"
 msgid_plural "%1 Episodes"
 msgstr[0] ""
 
 #. i18n: file: online/onlinesettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: models/onlineservicesmodel.cpp:83 po/rc.cpp:720 rc.cpp:720
+#: models/onlineservicesmodel.cpp:91 po/rc.cpp:872 rc.cpp:872
 #, fuzzy
 msgid "Configure Service"
 msgstr "设置设备"
 
-#: models/onlineservicesmodel.cpp:84
+#: models/onlineservicesmodel.cpp:92
 #, fuzzy
 msgid "Refresh Service"
 msgstr "刷新设备"
 
-#: models/onlineservicesmodel.cpp:85
+#: models/onlineservicesmodel.cpp:93
 #, fuzzy
 msgid "Add Subscription"
 msgstr "连接"
 
-#: models/onlineservicesmodel.cpp:86
+#: models/onlineservicesmodel.cpp:94
 msgid "Remove Subscription"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:87
+#: models/onlineservicesmodel.cpp:95
 #, fuzzy
 msgid "Refresh Subscription"
 msgstr "服务器信息"
 
-#: models/onlineservicesmodel.cpp:137
+#: models/onlineservicesmodel.cpp:145
 #, fuzzy
 msgid "Last Search:%1"
 msgstr "搜索:"
 
-#: models/onlineservicesmodel.cpp:149
-#, fuzzy
-msgid "Searching..."
-msgstr "搜索 %1 ..."
-
-#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
-#: models/streamsmodel.cpp:670
+#: models/onlineservicesmodel.cpp:160 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:691
 msgid "Not Loaded"
 msgstr "未加载"
 
-#: models/onlineservicesmodel.cpp:155
+#: models/onlineservicesmodel.cpp:163
 msgid "Use search to locate tracks"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:166
+#: models/onlineservicesmodel.cpp:174
 msgid "1 Podcast"
 msgid_plural "%1 Podcasts"
 msgstr[0] ""
 
-#: models/onlineservicesmodel.cpp:177
+#: models/onlineservicesmodel.cpp:185
 #, fuzzy
 msgid "(Downloading: %1%)"
 msgstr "下载 %1"
 
-#: models/onlineservicesmodel.cpp:235
+#: models/onlineservicesmodel.cpp:243
 #, fuzzy
 msgctxt "podcast name (num unplayed episodes)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: models/playlistsmodel.cpp:77
+#: models/playlistsmodel.cpp:105
 msgid "New Playlist..."
 msgstr "新播放列表..."
 
-#: models/playqueuemodel.cpp:102
-msgctxt "Track Number (#)"
-msgid "#"
-msgstr "#"
+#: models/playlistsmodel.cpp:321
+#, fuzzy
+msgid "Smart Playlist"
+msgstr "播放列表"
 
-#: models/playqueuemodel.cpp:103
+#: models/playqueuemodel.cpp:109
 msgid "Length"
 msgstr "长度"
 
-#: models/playqueuemodel.cpp:104
+#: models/playqueuemodel.cpp:110
 msgid "Disc"
 msgstr "碟片"
 
-#. i18n: file: devices/filenameschemedialog.ui:138
+#. i18n: file: devices/filenameschemedialog.ui:174
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
+#: models/playqueuemodel.cpp:111 po/rc.cpp:248 rc.cpp:248
 msgid "Year"
 msgstr "年份"
 
-#: models/playqueuemodel.cpp:360
+#: models/playqueuemodel.cpp:158
+msgid "Undo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:160
+msgid "Redo"
+msgstr ""
+
+#: models/playqueuemodel.cpp:404
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(属性: %1)</b>"
 
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:693
 #, fuzzy
 msgid "Loading..."
 msgstr "正在下载..."
 
-#: models/streamsmodel.cpp:286
+#: models/streamsmodel.cpp:302
 msgid "Bookmarks"
 msgstr ""
 
-#: models/streamsmodel.cpp:560
+#: models/streamsmodel.cpp:576
 msgid "TuneIn"
 msgstr ""
 
-#: models/streamsmodel.cpp:563
+#: models/streamsmodel.cpp:579
 msgid "IceCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:564
+#: models/streamsmodel.cpp:580
 msgid "ShoutCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:567
+#: models/streamsmodel.cpp:583
 msgid "SomaFM"
 msgstr ""
 
-#: models/streamsmodel.cpp:568
+#: models/streamsmodel.cpp:584
+msgid "Radio GFM"
+msgstr ""
+
+#: models/streamsmodel.cpp:585
 msgid "Digitally Imported"
 msgstr ""
 
-#: models/streamsmodel.cpp:569
+#: models/streamsmodel.cpp:586
 msgid "JazzRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:570
+#: models/streamsmodel.cpp:587
 msgid "RockRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:571
+#: models/streamsmodel.cpp:588
 msgid "Sky.fm"
 msgstr ""
 
-#: models/streamsmodel.cpp:572
+#: models/streamsmodel.cpp:589
 msgid "Favorites"
 msgstr ""
 
-#: models/streamsmodel.cpp:573
+#: models/streamsmodel.cpp:590
 msgid "Listen Live"
 msgstr ""
 
-#: models/streamsmodel.cpp:578
+#: models/streamsmodel.cpp:595
 #, fuzzy
 msgid "Bookmark Category"
 msgstr "添加类别"
 
-#: models/streamsmodel.cpp:579
+#: models/streamsmodel.cpp:596
 msgid "Add Stream To Favorites"
 msgstr ""
 
-#: models/streamsmodel.cpp:580
+#: models/streamsmodel.cpp:597
 #, fuzzy
 msgid "Configure Streams"
 msgstr "设置"
 
-#: models/streamsmodel.cpp:660
+#: models/streamsmodel.cpp:681
 msgid "%1 (Read-Only)"
 msgstr ""
 
-#: models/streamsmodel.cpp:1241
+#: models/streamsmodel.cpp:1261
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr "保存流媒体列表失败. 请检查 %1 的写入全线"
 
-#: models/streamsmodel.cpp:1639
+#: models/streamsmodel.cpp:1659
 msgid "All"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:154
+#: mpd/mpdconnection.cpp:179
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr ""
 
-#: mpd/mpdconnection.cpp:156
+#: mpd/mpdconnection.cpp:181
 #, fuzzy
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr "%1 (%2:%3)"
 
-#: mpd/mpdconnection.cpp:372 mpd/mpdconnection.cpp:415
-#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
-#: mpd/mpdconnection.cpp:1036
+#: mpd/mpdconnection.cpp:406 mpd/mpdconnection.cpp:451
+#: mpd/mpdconnection.cpp:501 mpd/mpdconnection.cpp:1137
+#: mpd/mpdconnection.cpp:1164
 msgid "Connection to %1 failed"
 msgstr "连接 %1 失败"
 
-#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
+#: mpd/mpdconnection.cpp:412 mpd/mpdconnection.cpp:455
 msgid "Connection to %1 failed - incorrect password"
 msgstr "连接 %1 失败 - 密码错误"
 
-#: mpd/mpdconnection.cpp:455
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to send command to %1 - not connected"
 msgstr "发送到 %1 失败 - 未能连接"
 
-#: mpd/mpdconnection.cpp:491
+#: mpd/mpdconnection.cpp:539
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr "无法加载. 请检查 \"mpd\" 是否有读取权限."
 
-#: mpd/mpdconnection.cpp:493
+#: mpd/mpdconnection.cpp:541
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
 msgstr "无法加载. MPD 只能从本地 Socket 播放本地文件."
 
-#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
+#: mpd/mpdconnection.cpp:547 mpd/mpdconnection.cpp:558
 msgid "Failed to send command. Disconnected from %1"
 msgstr "发送失败. %1 已断开"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1306
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr "<b>%1</b> 重命名为 <b>%2</b> 失败"
 
-#: mpd/mpdconnection.cpp:1183
+#: mpd/mpdconnection.cpp:1318
 msgid "Failed to save <b>%1</b>"
 msgstr "<b>%1</b> 保存失败"
 
-#: mpd/mpdconnection.cpp:1196
+#: mpd/mpdconnection.cpp:1331
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1199
+#: mpd/mpdconnection.cpp:1334
 msgid "You cannot add a playlist to another playlist!"
 msgstr ""
 
@@ -3168,7 +3347,15 @@ msgstr ""
 msgid "Personal"
 msgstr ""
 
-#: mpd/song.cpp:343
+#: mpd/song.cpp:62
+msgid "Unknown"
+msgstr "未知"
+
+#: mpd/song.cpp:63
+msgid "Various Artists"
+msgstr "多个艺术家"
+
+#: mpd/song.cpp:427
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3239,8 +3426,8 @@ msgstr "Magnatune 设置"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
-#: rc.cpp:711 rc.cpp:729
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:863 po/rc.cpp:881
+#: rc.cpp:863 rc.cpp:881
 msgid "Username:"
 msgstr "用户名:"
 
@@ -3268,9 +3455,9 @@ msgstr "用户名:"
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPasswordLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:220 po/rc.cpp:238
-#: po/rc.cpp:412 po/rc.cpp:647 po/rc.cpp:714 po/rc.cpp:732 rc.cpp:220
-#: rc.cpp:238 rc.cpp:412 rc.cpp:647 rc.cpp:714 rc.cpp:732
+#: online/magnatunesettingsdialog.cpp:44 po/rc.cpp:281 po/rc.cpp:299
+#: po/rc.cpp:476 po/rc.cpp:802 po/rc.cpp:866 po/rc.cpp:884 rc.cpp:281
+#: rc.cpp:299 rc.cpp:476 rc.cpp:802 rc.cpp:866 rc.cpp:884
 msgid "Password:"
 msgstr "密码:"
 
@@ -3310,163 +3497,188 @@ msgstr "下载失败"
 msgid "Download To Library"
 msgstr "下载到库"
 
-#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
-#, fuzzy
-msgid "Search For Podcasts"
-msgstr "搜索歌词"
-
-#: online/onlineservicespage.cpp:63
+#: online/onlineservicespage.cpp:62
 msgid "Download Podcast Episodes"
 msgstr ""
 
-#: online/onlineservicespage.cpp:64
+#: online/onlineservicespage.cpp:63
 msgid "Delete Downloaded Podcast Episodes"
 msgstr ""
 
-#: online/onlineservicespage.cpp:329
+#: online/onlineservicespage.cpp:320
 #, fuzzy
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "搜索:"
 
-#: online/onlineservicespage.cpp:464
+#: online/onlineservicespage.cpp:458
 msgid "Re-download music listing for %1?"
 msgstr "重新下载音乐列表 %1?"
 
-#: online/onlineservicespage.cpp:532
-msgid "Subscribe to Podcast"
-msgstr ""
-
-#: online/onlineservicespage.cpp:532
-msgid "Enter podcast URL:"
-msgstr ""
-
-#: online/onlineservicespage.cpp:541
-msgid "Invalid URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:546
-msgid "You are already subscribed to this URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:550
-msgid "Already downloading this URL!"
-msgstr ""
-
-#: online/onlineservicespage.cpp:579
+#: online/onlineservicespage.cpp:544
 msgid "Unsubscribe from <b>%1</b>?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:600
+#: online/onlineservicespage.cpp:565
 msgid "Refresh all podcast listings?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:621
+#: online/onlineservicespage.cpp:586
 msgid "Refresh episode listing from <b>%1</b>?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:695
+#: online/onlineservicespage.cpp:652
 msgid "All selected podcasts have already been downloaded!"
 msgstr ""
 
-#: online/onlineservicespage.cpp:699
+#: online/onlineservicespage.cpp:656
 msgid "Do you wish to download the following podcast episode?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:702
+#: online/onlineservicespage.cpp:659
 msgid "Do you wish to download the following podcast episodes?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:705
+#: online/onlineservicespage.cpp:662
 #, fuzzy
 msgid "Do you wish to download the selected podcast episodes?"
 msgstr "确定不保存选择的设备?"
 
-#: online/onlineservicespage.cpp:753
+#: online/onlineservicespage.cpp:710
 msgid "All selected downloaded podcast episodes have already been deleted!"
 msgstr ""
 
-#: online/onlineservicespage.cpp:757
+#: online/onlineservicespage.cpp:714
 msgid ""
 "Do you wish to delete the downloaded file of the following podcast episode?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:760
+#: online/onlineservicespage.cpp:717
 msgid ""
 "Do you wish to the delete downloaded files of the following podcast episodes?"
 msgstr ""
 
-#: online/onlineservicespage.cpp:763
+#: online/onlineservicespage.cpp:720
 msgid ""
 "Do you wish to the delete downloaded files of the selected podcast episodes?"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:243
+#: online/podcastsearchdialog.cpp:253
 msgid "RSS:"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:245
+#: online/podcastsearchdialog.cpp:255
 msgid "Website:"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 #, fuzzy
 msgid "Podcast details"
 msgstr "连接详情"
 
-#: online/podcastsearchdialog.cpp:252
+#: online/podcastsearchdialog.cpp:262
 msgid "Select a podcast to display its details"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:322
+#: online/podcastsearchdialog.cpp:333
 msgid "Enter search term..."
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:372
+#: online/podcastsearchdialog.cpp:383
 #, fuzzy
 msgid "Failed to fetch podcasts from %1"
 msgstr "\"%1\" 的连接无法断开"
 
-#: online/podcastsearchdialog.cpp:378
+#: online/podcastsearchdialog.cpp:389
 msgid "There was a problem parsing the response from %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:439
+#: online/podcastsearchdialog.cpp:450
 #, fuzzy
 msgid "Failed to download directory listing"
 msgstr "下载流媒体列表失败"
 
-#: online/podcastsearchdialog.cpp:447
+#: online/podcastsearchdialog.cpp:458
 #, fuzzy
 msgid "Failed to parse directory listing"
 msgstr "清除流媒体列表失败"
 
 #: online/podcastsearchdialog.cpp:508
+msgid "URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:517
+msgid "Enter podcast URL..."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:518
+#, fuzzy
+msgid "Load"
+msgstr "已加载"
+
+#: online/podcastsearchdialog.cpp:525
+msgid "Enter podcast URL below, and press 'Load'"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:552
+msgid "Invalid URL!"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:562
+#, fuzzy
+msgid "Failed to fetch podcast!"
+msgstr "\"%1\" 的连接无法断开"
+
+#: online/podcastsearchdialog.cpp:567
+#, fuzzy
+msgid "Failed to parse podcast."
+msgstr "操作失败"
+
+#: online/podcastsearchdialog.cpp:571
+msgid ""
+"Cantata only supports audio podcasts! The URL entered contains only video "
+"podcasts."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:589
 msgid "Subscribe"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:607
+msgid "Enter URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:607
+msgid "Manual podcast URL"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 #, fuzzy
 msgid "Search %1"
 msgstr "搜索:"
 
-#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#: online/podcastsearchdialog.cpp:611 online/podcastsearchdialog.cpp:615
 msgid "Search for podcasts on %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:543
+#: online/podcastsearchdialog.cpp:628
 msgid "Browse %1 podcasts"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:602
+#: online/podcastsearchdialog.cpp:639
+#, fuzzy
+msgid "Add Podcast Subscription"
+msgstr "连接"
+
+#: online/podcastsearchdialog.cpp:695
 msgid "Subscription added"
 msgstr ""
 
-#: online/podcastsearchdialog.cpp:604
+#: online/podcastsearchdialog.cpp:697
 msgid "You are already subscribed to this podcast!"
 msgstr ""
 
@@ -3474,97 +3686,177 @@ msgstr ""
 msgid "Podcasts"
 msgstr ""
 
-#: online/podcastservice.cpp:284
+#: online/podcastservice.cpp:288
 msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
 msgstr ""
 
-#: online/podcastservice.cpp:286
+#: online/podcastservice.cpp:290
 #, fuzzy
 msgid "Failed to parse %1"
 msgstr "操作失败"
 
-#: online/podcastservice.cpp:290
+#: online/podcastservice.cpp:294
 #, fuzzy
 msgid "Failed to download %1"
 msgstr "下载失败"
 
-#: online/podcastsettingsdialog.cpp:58
+#: online/podcastsettingsdialog.cpp:59
 msgid "Check for new episodes:"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:59
+#: online/podcastsettingsdialog.cpp:60
 #, fuzzy
 msgid "Download episodes to:"
 msgstr "下载:"
 
-#: online/podcastsettingsdialog.cpp:60
+#: online/podcastsettingsdialog.cpp:67
 #, fuzzy
-msgid "Automatically download new episodes:"
-msgstr "自动查找:"
+msgid "Automatically download new episodes"
+msgstr "自动查找"
 
-#: online/podcastsettingsdialog.cpp:82
+#: online/podcastsettingsdialog.cpp:80
 #, fuzzy
 msgid "Podcast Settings"
 msgstr "代理设置"
 
-#: online/podcastsettingsdialog.cpp:84
+#: online/podcastsettingsdialog.cpp:82
 msgid "Manually"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:85
+#: online/podcastsettingsdialog.cpp:83
 msgid "Every 15 minutes"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:86
+#: online/podcastsettingsdialog.cpp:84
 msgid "Every 30 minutes"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:87
+#: online/podcastsettingsdialog.cpp:85
 msgid "Every hour"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:88
+#: online/podcastsettingsdialog.cpp:86
 msgid "Every 2 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:89
+#: online/podcastsettingsdialog.cpp:87
 msgid "Every 6 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:90
+#: online/podcastsettingsdialog.cpp:88
 msgid "Every 12 hours"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:91
+#: online/podcastsettingsdialog.cpp:89
 msgid "Every day"
 msgstr ""
 
-#: online/podcastsettingsdialog.cpp:92
+#: online/podcastsettingsdialog.cpp:90
 msgid "Every week"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:19
-#. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
-#: po/rc.cpp:3 rc.cpp:3
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: context/othersettings.ui:23
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: gui/interfacesettings.ui:496
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:3 po/rc.cpp:657 rc.cpp:3 rc.cpp:657
+msgid "Background Image"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:36
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_artist)
+#: po/rc.cpp:9 rc.cpp:9
 #, fuzzy
-msgid "Use backdrop:"
-msgstr "使用缓存:"
+msgid "Artist image"
+msgstr "显示艺术家图片:"
+
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#. i18n: file: context/othersettings.ui:43
+#. i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_custom)
+#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom)
+#: po/rc.cpp:12 po/rc.cpp:666 rc.cpp:12 rc.cpp:666
+#, fuzzy
+msgid "Custom image:"
+msgstr "自定义:"
 
-#. i18n: file: context/othersettings.ui:32
-#. i18n: ectx: property (text), widget (BuddyLabel, contextDarkBackgroundLabel)
-#: po/rc.cpp:6 rc.cpp:6
-msgid "Dark background:"
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: context/othersettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#. i18n: file: gui/interfacesettings.ui:536
+#. i18n: ectx: property (text), widget (QLabel, label_4b)
+#: po/rc.cpp:15 po/rc.cpp:669 rc.cpp:15 rc.cpp:669
+msgid "Blur:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#. i18n: file: context/othersettings.ui:100
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropBlurLabel)
+#. i18n: file: gui/interfacesettings.ui:570
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel)
+#: po/rc.cpp:18 po/rc.cpp:672 rc.cpp:18 rc.cpp:672
+msgid "10px"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: context/othersettings.ui:112
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: gui/interfacesettings.ui:585
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: po/rc.cpp:21 po/rc.cpp:675 rc.cpp:21 rc.cpp:675
+msgid "Opacity:"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#. i18n: file: context/othersettings.ui:149
+#. i18n: ectx: property (text), widget (QLabel, contextBackdropOpacityLabel)
+#. i18n: file: gui/interfacesettings.ui:619
+#. i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel)
+#: po/rc.cpp:25 po/rc.cpp:679 rc.cpp:25 rc.cpp:679
+#, no-c-format
+msgid "40%"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:45
-#. i18n: ectx: property (text), widget (BuddyLabel, wikipediaIntroOnlyLabel)
-#: po/rc.cpp:9 rc.cpp:9
-msgid "Only show basic wikipedia text:"
+#. i18n: file: context/othersettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, contextDarkBackground)
+#: po/rc.cpp:28 rc.cpp:28
+msgid "Dark background"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, wikipediaIntroOnly)
+#: po/rc.cpp:31 rc.cpp:31
+msgid "Only show basic wikipedia text"
 msgstr ""
 
-#. i18n: file: context/othersettings.ui:86
+#. i18n: file: context/othersettings.ui:178
+#. i18n: ectx: property (text), widget (QCheckBox, contextAlwaysCollapsed)
+#: po/rc.cpp:34 rc.cpp:34
+msgid "Always collapse into a single pane"
+msgstr ""
+
+#. i18n: file: context/othersettings.ui:207
 #. i18n: ectx: property (text), widget (StateLabel, wikipediaIntroOnlyNote)
-#: po/rc.cpp:13 rc.cpp:13
+#: po/rc.cpp:38 rc.cpp:38
 #, no-c-format
 msgid ""
 "<i><b>NOTE:</b> Cantata does not show the full wikipedia pages (with images, "
@@ -3577,190 +3869,176 @@ msgstr ""
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:16 rc.cpp:16
+#: po/rc.cpp:41 rc.cpp:41
 #, fuzzy
 msgid "Available:"
 msgstr "可用"
 
 #. i18n: file: context/togglelist.ui:24
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:19 rc.cpp:19
+#: po/rc.cpp:44 rc.cpp:44
 #, fuzzy
 msgid "Selected:"
 msgstr "选择文件"
 
-#. i18n: file: devices/actiondialog.ui:30
+#. i18n: file: devices/actiondialog.ui:33
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:22 rc.cpp:22
+#: po/rc.cpp:47 rc.cpp:47
 msgid "Copy songs from:"
 msgstr "从复制歌曲:"
 
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#. i18n: file: devices/actiondialog.ui:39
+#. i18n: file: devices/actiondialog.ui:42
 #. i18n: ectx: property (text), widget (QLabel, sourceLabel)
-#. i18n: file: devices/actiondialog.ui:82
+#. i18n: file: devices/actiondialog.ui:95
 #. i18n: ectx: property (text), widget (QLabel, destinationLabel)
-#. i18n: file: devices/actiondialog.ui:335
-#. i18n: ectx: property (text), widget (QLabel, progressLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:122
 #. i18n: ectx: property (text), widget (QLabel, loginStatusLabel)
-#: po/rc.cpp:25 po/rc.cpp:31 po/rc.cpp:49 po/rc.cpp:744 rc.cpp:25 rc.cpp:31
-#: rc.cpp:49 rc.cpp:744
+#: po/rc.cpp:50 po/rc.cpp:62 po/rc.cpp:896 rc.cpp:50 rc.cpp:62 rc.cpp:896
 msgid "TextLabel"
 msgstr "文本标签"
 
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#. i18n: file: devices/actiondialog.ui:58
+#. i18n: file: devices/actiondialog.ui:64
 #. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
-#. i18n: file: devices/actiondialog.ui:101
+#. i18n: file: devices/actiondialog.ui:117
 #. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
-#: po/rc.cpp:28 po/rc.cpp:34 rc.cpp:28 rc.cpp:34
+#: po/rc.cpp:56 po/rc.cpp:68 rc.cpp:56 rc.cpp:68
 msgid "(Needs configuring)"
 msgstr "(需要设置)"
 
-#. i18n: file: devices/actiondialog.ui:123
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:37 rc.cpp:37
-msgid "Overwrite songs:"
-msgstr "覆盖歌曲:"
-
-#. i18n: file: devices/actiondialog.ui:150
+#. i18n: file: devices/actiondialog.ui:86
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:40 rc.cpp:40
+#: po/rc.cpp:59 rc.cpp:59
 msgid "Copy songs to:"
 msgstr "复制歌曲到:"
 
-#. i18n: file: devices/actiondialog.ui:157
+#. i18n: file: devices/actiondialog.ui:149
 #. i18n: ectx: property (text), widget (QLabel, codecLabel)
-#: po/rc.cpp:43 rc.cpp:43
+#: po/rc.cpp:71 rc.cpp:71
 msgid "Destination format:"
 msgstr "目标格式:"
 
-#. i18n: file: devices/actiondialog.ui:171
+#. i18n: file: devices/actiondialog.ui:163
+#. i18n: ectx: property (text), widget (QCheckBox, overwrite)
+#: po/rc.cpp:74 rc.cpp:74
+#, fuzzy
+msgid "Overwrite songs"
+msgstr "覆盖歌曲:"
+
+#. i18n: file: devices/actiondialog.ui:170
 #. i18n: ectx: property (text), widget (QLabel, songCountLabel)
-#: po/rc.cpp:46 rc.cpp:46
+#: po/rc.cpp:77 rc.cpp:77
 msgid "To copy:"
 msgstr ""
 
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: devices/actiondialog.ui:187
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/tageditor.ui:157
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#. i18n: file: tags/trackorganiser.ui:130
+#. i18n: ectx: property (text), widget (UrlLabel, mopidyNote)
+#: po/rc.cpp:80 po/rc.cpp:968 po/rc.cpp:995 rc.cpp:80 rc.cpp:968 rc.cpp:995
+msgid ""
+"<i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i>"
+msgstr ""
+
 #. i18n: file: devices/albumdetails.ui:26
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:52 rc.cpp:52
+#: po/rc.cpp:83 rc.cpp:83
 msgid "Album Details"
 msgstr "专辑详情"
 
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#. i18n: file: devices/albumdetails.ui:47
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
-#. i18n: ectx: property (text), widget (BuddyLabel, composerLabel)
-#. i18n: file: tags/tageditor.ui:77
-#. i18n: ectx: property (text), widget (StateLabel, composerLabel)
-#: po/rc.cpp:58 po/rc.cpp:298 po/rc.cpp:798 rc.cpp:58 rc.cpp:298 rc.cpp:798
-msgid "Composer:"
-msgstr ""
-
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:73
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:129
-#. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
-msgid "Genre:"
-msgstr "流派:"
-
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#. i18n: file: devices/albumdetails.ui:86
+#. i18n: file: devices/albumdetails.ui:89
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
 #. i18n: file: tags/tageditor.ui:142
 #. i18n: ectx: property (text), widget (StateLabel, yearLabel)
-#: po/rc.cpp:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
+#: po/rc.cpp:98 po/rc.cpp:965 rc.cpp:98 rc.cpp:965
 msgid "Year:"
 msgstr "年份:"
 
-#. i18n: file: devices/albumdetails.ui:99
+#. i18n: file: devices/albumdetails.ui:102
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:70 rc.cpp:70
+#: po/rc.cpp:101 rc.cpp:101
 msgid "Disc:"
 msgstr "碟片:"
 
-#. i18n: file: devices/albumdetails.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:73 rc.cpp:73
-msgid "Single artist:"
+#. i18n: file: devices/albumdetails.ui:115
+#. i18n: ectx: property (text), widget (QCheckBox, singleArtist)
+#: po/rc.cpp:104 rc.cpp:104
+#, fuzzy
+msgid "Single artist"
 msgstr "艺术家:"
 
-#. i18n: file: devices/audiocdsettings.ui:20
+#. i18n: file: devices/audiocdsettings.ui:29
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:119 rc.cpp:119
 msgid "Album and Track Information Retrieval"
 msgstr "专辑音轨信息"
 
-#. i18n: file: devices/audiocdsettings.ui:26
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:91 rc.cpp:91
-msgid "Automatically lookup:"
-msgstr "自动查找:"
-
-#. i18n: file: devices/audiocdsettings.ui:39
+#. i18n: file: devices/audiocdsettings.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:122 rc.cpp:122
 msgid "Initially look up via:"
 msgstr "通过下列查找:"
 
-#. i18n: file: devices/audiocdsettings.ui:52
+#. i18n: file: devices/audiocdsettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:125 rc.cpp:125
 msgid "CDDB Host:"
 msgstr "CDDB 主机名:"
 
-#. i18n: file: devices/audiocdsettings.ui:65
+#. i18n: file: devices/audiocdsettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:128 rc.cpp:128
 msgid "CDDB Port:"
 msgstr "CDDB 端口:"
 
-#. i18n: file: devices/audiocdsettings.ui:88
+#. i18n: file: devices/audiocdsettings.ui:84
+#. i18n: ectx: property (text), widget (QCheckBox, cdAuto)
+#: po/rc.cpp:131 rc.cpp:131
+msgid "Lookup information as soon as CD is inserted"
+msgstr ""
+
+#. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:134 rc.cpp:134
 msgid "Audio Extraction"
 msgstr "抽取音频"
 
-#. i18n: file: devices/audiocdsettings.ui:94
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:106 rc.cpp:106
-msgid "Full paranoia mode (best quality):"
+#. i18n: file: devices/audiocdsettings.ui:100
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaFull)
+#: po/rc.cpp:137 rc.cpp:137
+msgid "Full paranoia mode (best quality)"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:107
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:109 rc.cpp:109
-msgid "Never skip on read error:"
-msgstr "从不跳过读取错误:"
+#. i18n: ectx: property (text), widget (QCheckBox, paranoiaNeverSkip)
+#: po/rc.cpp:140 rc.cpp:140
+msgid "Never skip on read error"
+msgstr "从不跳过读取错误"
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:112 rc.cpp:112
+#: po/rc.cpp:143 rc.cpp:143
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3786,188 +4064,264 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
 #. i18n: file: gui/serversettings.ui:325
 #. i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2)
-#: po/rc.cpp:115 po/rc.cpp:415 po/rc.cpp:433 po/rc.cpp:650 po/rc.cpp:671
-#: rc.cpp:115 rc.cpp:415 rc.cpp:433 rc.cpp:650 rc.cpp:671
+#: po/rc.cpp:146 po/rc.cpp:479 po/rc.cpp:497 po/rc.cpp:805 po/rc.cpp:826
+#: rc.cpp:146 rc.cpp:479 rc.cpp:497 rc.cpp:805 rc.cpp:826
 msgid "Music folder:"
 msgstr "音乐文件夹:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:149 rc.cpp:149
 msgid "Copy album covers as:"
 msgstr "复制专辑封面为:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: po/rc.cpp:152 rc.cpp:152
 msgid "Maximum cover size:"
 msgstr "最大专辑封面大小:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:82
-#. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:124 rc.cpp:124
-msgid "'Various Artists' workaround:"
+#. i18n: file: devices/devicepropertieswidget.ui:85
+#. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
+#: po/rc.cpp:155 rc.cpp:155
+msgid "Default volume:"
+msgstr "默认音量:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, fixVariousArtists)
+#: po/rc.cpp:158 rc.cpp:158
+#, fuzzy
+msgid "'Various Artists' workaround"
 msgstr "'多个艺术家' 环境:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, autoScanLabel)
-#: po/rc.cpp:127 rc.cpp:127
-msgid "Automatically scan music when attached:"
+#. i18n: file: devices/devicepropertieswidget.ui:99
+#. i18n: ectx: property (text), widget (QCheckBox, autoScan)
+#: po/rc.cpp:161 rc.cpp:161
+#, fuzzy
+msgid "Automatically scan music when attached"
 msgstr "关联后自动搜索:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:108
-#. i18n: ectx: property (text), widget (BuddyLabel, useCacheLabel)
-#: po/rc.cpp:130 rc.cpp:130
-msgid "Use cache:"
+#. i18n: file: devices/devicepropertieswidget.ui:106
+#. i18n: ectx: property (text), widget (QCheckBox, useCache)
+#: po/rc.cpp:164 rc.cpp:164
+#, fuzzy
+msgid "Use cache"
 msgstr "使用缓存:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:121
-#. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:133 rc.cpp:133
-msgid "Default volume:"
-msgstr "默认音量:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#. i18n: file: devices/devicepropertieswidget.ui:133
-#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. i18n: file: devices/devicepropertieswidget.ui:115
+#. i18n: ectx: property (title), widget (QGroupBox, filenamesGroupBox)
 #. i18n: file: tags/trackorganiser.ui:25
 #. i18n: ectx: property (title), widget (QGroupBox, optionsBox)
-#: po/rc.cpp:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
+#: po/rc.cpp:167 po/rc.cpp:971 rc.cpp:167 rc.cpp:971
 msgid "Filenames"
 msgstr "文件名"
 
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: devices/devicepropertieswidget.ui:142
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/trackorganiser.ui:112
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
-msgid "Use only ASCII characters:"
-msgstr "仅使用 ASCII 字符:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: devices/devicepropertieswidget.ui:159
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: tags/trackorganiser.ui:95
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
-msgid "Replace spaces with underscores:"
-msgstr "用下划线替换空格:"
-
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/devicepropertieswidget.ui:176
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: tags/trackorganiser.ui:78
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
-msgid "Ignore 'The' in artist names:"
-msgstr "忽略艺术家中的 'The':"
-
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#. i18n: file: devices/devicepropertieswidget.ui:193
+#. i18n: file: devices/devicepropertieswidget.ui:124
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #. i18n: file: tags/trackorganiser.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
+#: po/rc.cpp:170 po/rc.cpp:974 rc.cpp:170 rc.cpp:974
 msgid "Filename scheme:"
 msgstr "文件名框架"
 
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: devices/devicepropertieswidget.ui:237
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: tags/trackorganiser.ui:129
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
-msgid "VFAT safe:"
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: devices/devicepropertieswidget.ui:161
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#. i18n: file: tags/trackorganiser.ui:71
+#. i18n: ectx: property (text), widget (QCheckBox, vfatSafe)
+#: po/rc.cpp:173 po/rc.cpp:977 rc.cpp:173 rc.cpp:977
+#, fuzzy
+msgid "VFAT safe"
 msgstr "VFAT 安全:"
 
-#. i18n: file: devices/devicepropertieswidget.ui:250
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: devices/devicepropertieswidget.ui:168
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#. i18n: file: tags/trackorganiser.ui:78
+#. i18n: ectx: property (text), widget (QCheckBox, asciiOnly)
+#: po/rc.cpp:176 po/rc.cpp:980 rc.cpp:176 rc.cpp:980
+#, fuzzy
+msgid "Use only ASCII characters"
+msgstr "仅使用 ASCII 字符:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: devices/devicepropertieswidget.ui:175
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#. i18n: file: tags/trackorganiser.ui:85
+#. i18n: ectx: property (text), widget (QCheckBox, replaceSpaces)
+#: po/rc.cpp:179 po/rc.cpp:983 rc.cpp:179 rc.cpp:983
+#, fuzzy
+msgid "Replace spaces with underscores"
+msgstr "用下划线替换空格:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: devices/devicepropertieswidget.ui:182
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#. i18n: file: tags/trackorganiser.ui:92
+#. i18n: ectx: property (text), widget (QCheckBox, ignoreThe)
+#: po/rc.cpp:182 po/rc.cpp:986 rc.cpp:182 rc.cpp:986
+#, fuzzy
+msgid "Ignore 'The' in artist names"
+msgstr "忽略艺术家中的 'The':"
+
+#. i18n: file: devices/devicepropertieswidget.ui:192
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:185 rc.cpp:185
 msgid "Transcoding"
 msgstr "正在转码"
 
-#. i18n: file: devices/devicepropertieswidget.ui:261
-#. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:157 rc.cpp:157
-msgid "Only transcode if source file is of a different format:"
+#. i18n: file: devices/devicepropertieswidget.ui:201
+#. i18n: ectx: property (text), widget (QCheckBox, transcoderWhenDifferent)
+#: po/rc.cpp:188 rc.cpp:188
+#, fuzzy
+msgid "Only transcode if source file is of a different format"
 msgstr "仅在格式不同时方能转码:"
 
-#. i18n: file: devices/filenameschemedialog.ui:29
+#. i18n: file: devices/filenameschemedialog.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:191 rc.cpp:191
 msgid "Example:"
 msgstr "例如:"
 
-#. i18n: file: devices/filenameschemedialog.ui:58
+#. i18n: file: devices/filenameschemedialog.ui:67
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:194 rc.cpp:194
 msgid "About filename schemes"
 msgstr "关于文件名框架"
 
-#. i18n: file: devices/filenameschemedialog.ui:70
+#. i18n: file: devices/filenameschemedialog.ui:79
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumArtist)
+#: po/rc.cpp:197 rc.cpp:197
+msgid ""
+"The artist of the album. For most albums, this will be the same as the "
+"<i>Track Artist.</i> For compilations, this will often be <i>Various Artists."
+"</i>"
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:82
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:200 rc.cpp:200
 msgid "Album Artist"
 msgstr "专辑艺术家"
 
-#. i18n: file: devices/filenameschemedialog.ui:77
+#. i18n: file: devices/filenameschemedialog.ui:89
+#. i18n: ectx: property (toolTip), widget (QPushButton, albumTitle)
+#: po/rc.cpp:203 rc.cpp:203
+msgid "The name of the album."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:92
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:206 rc.cpp:206
 msgid "Album Title"
 msgstr "专辑标题"
 
-#. i18n: file: devices/filenameschemedialog.ui:91
+#. i18n: file: devices/filenameschemedialog.ui:99
+#. i18n: ectx: property (toolTip), widget (QPushButton, composer)
+#: po/rc.cpp:209 rc.cpp:209
+msgid "The composer."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:109
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtist)
+#: po/rc.cpp:215 rc.cpp:215
+msgid "The artist of each track."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:112
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:218 rc.cpp:218
 msgid "Track Artist"
 msgstr "音轨艺术家"
 
-#. i18n: file: devices/filenameschemedialog.ui:98
+#. i18n: file: devices/filenameschemedialog.ui:119
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackTitle)
+#: po/rc.cpp:221 rc.cpp:221
+msgid "The track title (without <i>Track Artist</i>)."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:122
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:224 rc.cpp:224
 msgid "Track Title"
 msgstr "音轨标题"
 
-#. i18n: file: devices/filenameschemedialog.ui:117
+#. i18n: file: devices/filenameschemedialog.ui:141
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackArtistAndTitle)
+#: po/rc.cpp:227 rc.cpp:227
+msgid ""
+"The track title (with <i>Track Artist</i>, if different to <i>Album Artist</"
+"i>)."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:144
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:230 rc.cpp:230
 msgid "Track Title (+Artist)"
 msgstr "音轨标题(+艺术家)"
 
-#. i18n: file: devices/filenameschemedialog.ui:124
+#. i18n: file: devices/filenameschemedialog.ui:151
+#. i18n: ectx: property (toolTip), widget (QPushButton, trackNo)
+#: po/rc.cpp:233 rc.cpp:233
+#, fuzzy
+msgid "The track number."
+msgstr "音轨号:"
+
+#. i18n: file: devices/filenameschemedialog.ui:154
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:184 rc.cpp:184
+#: po/rc.cpp:236 rc.cpp:236
 msgid "Track #"
 msgstr "音轨 #"
 
-#. i18n: file: devices/filenameschemedialog.ui:131
+#. i18n: file: devices/filenameschemedialog.ui:161
+#. i18n: ectx: property (toolTip), widget (QPushButton, cdNo)
+#: po/rc.cpp:239 rc.cpp:239
+msgid ""
+"The album number of a multi-album album. Often compilations consist of "
+"several albums."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:164
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:187 rc.cpp:187
+#: po/rc.cpp:242 rc.cpp:242
 msgid "CD #"
 msgstr "CD #"
 
+#. i18n: file: devices/filenameschemedialog.ui:171
+#. i18n: ectx: property (toolTip), widget (QPushButton, year)
+#: po/rc.cpp:245 rc.cpp:245
+msgid "The year of the album's release."
+msgstr ""
+
+#. i18n: file: devices/filenameschemedialog.ui:181
+#. i18n: ectx: property (toolTip), widget (QPushButton, genre)
+#: po/rc.cpp:251 rc.cpp:251
+msgid "The genre of the album."
+msgstr ""
+
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:196 rc.cpp:196
+#: po/rc.cpp:257 rc.cpp:257
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -3975,17 +4329,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:162
+#. i18n: file: dynamic/dynamicrule.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
 #. i18n: file: network/proxysettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel)
-#: po/rc.cpp:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
+#: po/rc.cpp:260 po/rc.cpp:353 po/rc.cpp:848 rc.cpp:260 rc.cpp:353 rc.cpp:848
 msgid "Type:"
 msgstr "类型:"
 
@@ -3997,16 +4351,18 @@ msgstr "类型:"
 #. i18n: ectx: property (text), widget (BuddyLabel, nameLabel)
 #. i18n: file: gui/serversettings.ui:63
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
-#: rc.cpp:638
+#: po/rc.cpp:263 po/rc.cpp:793 streams/streamdialog.cpp:71 rc.cpp:263
+#: rc.cpp:793
 msgid "Name:"
 msgstr "名称:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:205 rc.cpp:205
+#. i18n: file: gui/interfacesettings.ui:122
+#. i18n: ectx: property (title), widget (QGroupBox, optionsGroup)
+#: po/rc.cpp:266 rc.cpp:266 po/rc.cpp:551 rc.cpp:551
 msgid "Options"
-msgstr "选项:"
+msgstr "选项"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:88
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel_2)
@@ -4028,8 +4384,8 @@ msgstr "选项:"
 #. i18n: ectx: property (text), widget (BuddyLabel, portLabel)
 #. i18n: file: network/proxysettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyPortLabel)
-#: po/rc.cpp:211 po/rc.cpp:250 po/rc.cpp:409 po/rc.cpp:644 po/rc.cpp:708
-#: rc.cpp:211 rc.cpp:250 rc.cpp:409 rc.cpp:644 rc.cpp:708
+#: po/rc.cpp:272 po/rc.cpp:311 po/rc.cpp:473 po/rc.cpp:799 po/rc.cpp:860
+#: rc.cpp:272 rc.cpp:311 rc.cpp:473 rc.cpp:799 rc.cpp:860
 msgid "Port:"
 msgstr "端口:"
 
@@ -4045,7 +4401,7 @@ msgstr "端口:"
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2x)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:322
 #. i18n: ectx: property (text), widget (BuddyLabel, userLabel)
-#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
+#: po/rc.cpp:275 po/rc.cpp:293 po/rc.cpp:314 rc.cpp:275 rc.cpp:293 rc.cpp:314
 msgid "User:"
 msgstr "用户:"
 
@@ -4057,7 +4413,7 @@ msgstr "用户:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:218
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2x)
-#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:278 po/rc.cpp:296 rc.cpp:278 rc.cpp:296
 msgid "Domain:"
 msgstr "域名"
 
@@ -4069,7 +4425,7 @@ msgstr "域名"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_2)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:248
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2)
-#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
+#: po/rc.cpp:284 po/rc.cpp:302 rc.cpp:284 rc.cpp:302
 msgid "Share:"
 msgstr "共享:"
 
@@ -4081,7 +4437,7 @@ msgstr "共享:"
 #. i18n: ectx: property (text), widget (QLabel, label_4)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:263
 #. i18n: ectx: property (text), widget (QLabel, label_4x)
-#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
+#: po/rc.cpp:287 po/rc.cpp:305 rc.cpp:287 rc.cpp:305
 msgid ""
 "<i><b>NOTE:</b> If you enter a password here, it will be stored "
 "<b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the "
@@ -4090,7 +4446,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:229 rc.cpp:229
+#: po/rc.cpp:290 rc.cpp:290
 msgid "Service name:"
 msgstr "服务名称:"
 
@@ -4102,19 +4458,19 @@ msgstr "服务名称:"
 #. i18n: ectx: property (text), widget (BuddyLabel, folderLabel)
 #. i18n: file: devices/remotedevicepropertieswidget.ui:390
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
-#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
+#: po/rc.cpp:317 po/rc.cpp:326 rc.cpp:317 rc.cpp:326
 msgid "Folder:"
 msgstr "文件夹:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:259 rc.cpp:259
+#: po/rc.cpp:320 rc.cpp:320
 msgid "Extra Options:"
 msgstr "额外选项:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:323 rc.cpp:323
 msgid ""
 "<i><b>NOTE:</b> Due to the way sshfs works, a suitable ssh-askpass "
 "application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter "
@@ -4123,7 +4479,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:329 rc.cpp:329
 msgid ""
 "<i><b>NOTE:</b> This dialog is only used to add remote devices (e.g. via "
 "Samba), or to access locally mounted folders. For normal media players, "
@@ -4133,183 +4489,163 @@ msgstr ""
 
 #. i18n: file: dynamic/dynamicpage.ui:26
 #. i18n: ectx: property (text), widget (StatusLabel, infoLabel)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:332 rc.cpp:332
 msgid "No dynamizer port defined in server settings."
 msgstr "未定义动态端口.将使用默认设置."
 
 #. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:274 rc.cpp:274
+#: po/rc.cpp:335 rc.cpp:335
 #, fuzzy
 msgid "Remote dynamizer is not running."
 msgstr "动态未启用"
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:277 rc.cpp:277
+#: po/rc.cpp:338 rc.cpp:338
 msgid "Name of Dynamic Rules"
 msgstr "动态配置名称"
 
 #. i18n: file: dynamic/dynamicrules.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, editBtn)
-#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
+#: po/rc.cpp:344 streams/streamspage.cpp:62 rc.cpp:344
 msgid "Edit"
 msgstr "编辑"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:350 rc.cpp:350
 msgid "About Rules"
 msgstr "关于规则"
 
-#. i18n: file: dynamic/dynamicrule.ui:38
+#. i18n: file: dynamic/dynamicrule.ui:37
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:356 rc.cpp:356
+#, fuzzy
+msgid "Include songs that match the following:"
+msgstr "包括符合下列条件的歌曲:"
+
+#. i18n: file: dynamic/dynamicrule.ui:42
+#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
+#: po/rc.cpp:359 rc.cpp:359
+#, fuzzy
+msgid "Exclude songs that match the following:"
+msgstr "排除符合下列条件的歌曲:"
+
+#. i18n: file: dynamic/dynamicrule.ui:63
+#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
+#: po/rc.cpp:365 rc.cpp:365
+msgid "Artists similar to:"
+msgstr "相似艺术家:"
+
+#. i18n: file: dynamic/dynamicrule.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:295 rc.cpp:295
+#: po/rc.cpp:368 rc.cpp:368
 msgid "Album Artist:"
 msgstr "专辑艺术家:"
 
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:90
-#. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
-msgid "Album:"
-msgstr "专辑:"
-
-#. i18n: file: dynamic/dynamicrule.ui:103
+#. i18n: file: dynamic/dynamicrule.ui:141
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:310 rc.cpp:310
+#: po/rc.cpp:383 rc.cpp:383
 msgid "From Year:"
 msgstr "年份:"
 
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:119
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:142
-#. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#. i18n: file: dynamic/dynamicrule.ui:157
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateFromSpin)
+#. i18n: file: dynamic/dynamicrule.ui:180
+#. i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin)
+#: po/rc.cpp:386 po/rc.cpp:392 rc.cpp:386 rc.cpp:392
 msgid "Any"
 msgstr "任意"
 
-#. i18n: file: dynamic/dynamicrule.ui:126
+#. i18n: file: dynamic/dynamicrule.ui:164
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:316 rc.cpp:316
+#: po/rc.cpp:389 rc.cpp:389
 msgid "To Year:"
-msgstr "年份:"
-
-#. i18n: file: dynamic/dynamicrule.ui:149
-#. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:322 rc.cpp:322
-msgid "Exact match:"
-msgstr "精确匹配:"
-
-#. i18n: file: dynamic/dynamicrule.ui:173
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:328 rc.cpp:328
-#, fuzzy
-msgid "Include songs that match the following:"
-msgstr "包括符合下列条件的歌曲:"
-
-#. i18n: file: dynamic/dynamicrule.ui:178
-#. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:331 rc.cpp:331
-#, fuzzy
-msgid "Exclude songs that match the following:"
-msgstr "排除符合下列条件的歌曲:"
+msgstr "年份:"
 
-#. i18n: file: dynamic/dynamicrule.ui:186
-#. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:334 rc.cpp:334
-msgid "Artists similar to:"
-msgstr "相似艺术家:"
+#. i18n: file: dynamic/dynamicrule.ui:187
+#. i18n: ectx: property (text), widget (QCheckBox, exactCheck)
+#: po/rc.cpp:395 rc.cpp:395
+msgid "Exact match"
+msgstr "精确匹配"
 
-#. i18n: file: dynamic/dynamicrule.ui:236
+#. i18n: file: dynamic/dynamicrule.ui:231
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:337 rc.cpp:337
+#: po/rc.cpp:398 rc.cpp:398
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr "<i><b>注意</b> 输入你所需要搜索的标签。 </i>"
 
-#. i18n: file: dynamic/dynamicrule.ui:262
+#. i18n: file: dynamic/dynamicrule.ui:260
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:340 rc.cpp:340
+#: po/rc.cpp:401 rc.cpp:401
 msgid ""
 "<i><b>NOTE</b> For genre, end string with an asterisk to match various "
 "genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. </i>"
 msgstr ""
 
-#. i18n: file: gui/coverdialog.ui:23
-#. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:343 rc.cpp:343
-msgid "<html><head/><body><p>Cancel current query</p></body></html>"
-msgstr ""
-
-#. i18n: file: gui/coverdialog.ui:37
+#. i18n: file: gui/coverdialog.ui:30
 #. i18n: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:349 rc.cpp:349
-msgid "<html><head/><body><p>Add a local file</p></body></html>"
-msgstr ""
-
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:22
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:716
-#. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:352 po/rc.cpp:442 rc.cpp:352 rc.cpp:442
-msgid "Save downloaded covers in music folder:"
-msgstr "保存下载的封面到音乐文件夹:"
-
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:35
-#. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:729
-#. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:355 po/rc.cpp:445 rc.cpp:355 rc.cpp:445
-msgid "Save downloaded lyrics in music folder:"
-msgstr "保存下载的歌词到音乐文件夹:"
-
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#. i18n: file: gui/initialsettingswizard.ui:746
-#. i18n: ectx: property (text), widget (BuddyLabel, storeBackdropsInMpdDirLabel)
-#: po/rc.cpp:358 po/rc.cpp:448 rc.cpp:358 rc.cpp:448
-#, fuzzy
-msgid "Save downloaded backdrops in music folder:"
-msgstr "保存下载的封面到音乐文件夹:"
-
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:69
-#. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:763
-#. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:361 po/rc.cpp:451 rc.cpp:361 rc.cpp:451
-#, fuzzy
-msgid "Save list of favorite streams in music folder:"
-msgstr "保存流媒体列表到音乐文件夹:"
-
-#. i18n: file: gui/filesettings.ui:110
+#: po/rc.cpp:407 rc.cpp:407
+msgid "Add a local file"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/filesettings.ui:29
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:714
+#. i18n: ectx: property (text), widget (QCheckBox, storeCoversInMpdDir)
+#: po/rc.cpp:413 po/rc.cpp:506 rc.cpp:413 rc.cpp:506
+msgid "Save downloaded covers in music folder"
+msgstr "保存下载的封面到音乐文件夹"
+
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/filesettings.ui:36
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:721
+#. i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir)
+#: po/rc.cpp:416 po/rc.cpp:509 rc.cpp:416 rc.cpp:509
+msgid "Save downloaded lyrics in music folder"
+msgstr "保存下载的歌词到音乐文件夹"
+
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/filesettings.ui:43
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:728
+#. i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir)
+#: po/rc.cpp:419 po/rc.cpp:512 rc.cpp:419 rc.cpp:512
+msgid "Save downloaded backdrops in music folder"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/filesettings.ui:50
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#. i18n: file: gui/initialsettingswizard.ui:735
+#. i18n: ectx: property (text), widget (QCheckBox, storeStreamsInMpdDir)
+#: po/rc.cpp:422 po/rc.cpp:515 rc.cpp:422 rc.cpp:515
+msgid "Save list of favorite streams in music folder"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:79
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:425 rc.cpp:425
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, lyrics, or "
 "backdrops, within the music folder, and you do not have write access to this "
@@ -4321,9 +4657,18 @@ msgid ""
 "will only be accessible to yourself.</i>"
 msgstr ""
 
-#. i18n: file: gui/filesettings.ui:145
+#. i18n: file: gui/filesettings.ui:108
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:428 rc.cpp:428
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. (i.e. 'Artist/Album/Tracks')"
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/filesettings.ui:140
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:431 rc.cpp:431
 msgid ""
 "<i><b>NOTE:</b> If you change the location where streams are stored (i.e. "
 "you toggle the 'Save list of favorite streams in music folder' option), then "
@@ -4335,19 +4680,19 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:370 rc.cpp:370
+#: po/rc.cpp:434 rc.cpp:434
 msgid "Cantata First Run"
 msgstr "首次运行 Cantata"
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:373 rc.cpp:373
+#: po/rc.cpp:437 rc.cpp:437
 msgid "Welcome to Cantata"
 msgstr "欢迎来到 Cantata"
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:440 rc.cpp:440
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4360,13 +4705,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:379 rc.cpp:379
+#: po/rc.cpp:443 rc.cpp:443
 msgid "<html><head/><body><p>Welcome to Cantata</p></body></html>"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:128
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:382 rc.cpp:382
+#: po/rc.cpp:446 rc.cpp:446
 msgid ""
 "<html><head/><body><p>Cantata is a feature-rich and user friendly client for "
 "Music Player Daemon (MPD). MPD is a background application that can be used "
@@ -4377,13 +4722,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:166
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:385 rc.cpp:385
+#: po/rc.cpp:449 rc.cpp:449
 msgid "Standard multi-user/server setup"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:179
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:388 rc.cpp:388
+#: po/rc.cpp:452 rc.cpp:452
 msgid ""
 "<i>Select this option if your music collection is shared between users, your "
 "MPD instance is running on another machine, or you already have a personal "
@@ -4394,13 +4739,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:211
 #. i18n: ectx: property (text), widget (QRadioButton, basic)
-#: po/rc.cpp:391 rc.cpp:391
+#: po/rc.cpp:455 rc.cpp:455
 msgid "Basic single user setup"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:224
 #. i18n: ectx: property (text), widget (BuddyLabel, label_9)
-#: po/rc.cpp:394 rc.cpp:394
+#: po/rc.cpp:458 rc.cpp:458
 msgid ""
 "<i>Select this option if your music collection is not shared with others, "
 "and you wish Cantata to configure and control the MPD instance.</i>"
@@ -4408,7 +4753,7 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:397 rc.cpp:397
+#: po/rc.cpp:461 rc.cpp:461
 msgid ""
 "<html><head/><body><p>For more information on MPD itself, please refer to "
 "the MPD website <a href=\"http://www.musicpd.org\"><span style=\" text-"
@@ -4419,13 +4764,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
-#: po/rc.cpp:400 rc.cpp:400
+#: po/rc.cpp:464 rc.cpp:464
 msgid "Connection details"
 msgstr "连接详情"
 
 #. i18n: file: gui/initialsettingswizard.ui:341
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:403 rc.cpp:403
+#: po/rc.cpp:467 rc.cpp:467
 msgid ""
 "The settings below are the basic settings required by Cantata. Please enter "
 "the relevant details, and use the 'Connect' button to test the connection."
@@ -4439,17 +4784,21 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
 #. i18n: file: gui/serversettings.ui:76
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel)
-#: po/rc.cpp:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
+#: po/rc.cpp:470 po/rc.cpp:796 rc.cpp:470 rc.cpp:796
 msgid "Host (or local socket):"
 msgstr "主机名 (或本地 Socket):"
 
 #. i18n: file: gui/initialsettingswizard.ui:494
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:421 rc.cpp:421
+#: po/rc.cpp:485 rc.cpp:485
+#, fuzzy
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
-"lyrics, etc.</i>"
+"lyrics, etc. If you're MPD instance is on a remote host, you may set this to "
+"a HTTP URL.</i>"
 msgstr ""
+"<i><b>注意:</b> '音乐文件夹' 将被用来查找专辑封面。如果有文件夹及子文件的写入"
+"权限,Cantata 将自动下载专辑封面到专辑文件夹</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:520
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
@@ -4459,7 +4808,7 @@ msgstr ""
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
 #. i18n: file: gui/serversettings.ui:225
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
-#: po/rc.cpp:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
+#: po/rc.cpp:488 po/rc.cpp:820 rc.cpp:488 rc.cpp:820
 msgid ""
 "<i><b>NOTE:</b> When using a local socket the full absolute path to the "
 "socket needs to be set. (Port number is not required.)</i>"
@@ -4468,26 +4817,26 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:553
 #. i18n: ectx: property (text), widget (QLabel, label_13)
-#: po/rc.cpp:427 rc.cpp:427
+#: po/rc.cpp:491 rc.cpp:491
 #, fuzzy
 msgid "Music folder"
 msgstr "音乐文件夹:"
 
 #. i18n: file: gui/initialsettingswizard.ui:576
 #. i18n: ectx: property (text), widget (QLabel, label_12)
-#: po/rc.cpp:430 rc.cpp:430
+#: po/rc.cpp:494 rc.cpp:494
 msgid "Please choose the folder containing your music collection."
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:662
 #. i18n: ectx: property (text), widget (QLabel, label_6f)
-#: po/rc.cpp:436 rc.cpp:436
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Covers, Lyrics, and Streams"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:685
 #. i18n: ectx: property (text), widget (QLabel, label_5f)
-#: po/rc.cpp:439 rc.cpp:439
+#: po/rc.cpp:503 rc.cpp:503
 msgid ""
 "<p>Cantata will download missing covers, and lyrics, from the internet. "
 "Cantata also allows you to save a list of internet streams (e.g. Radio "
@@ -4496,9 +4845,9 @@ msgid ""
 "music folder, or within your personal cache/config folders.</p>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: file: gui/initialsettingswizard.ui:758
 #. i18n: ectx: property (text), widget (QLabel, persNote)
-#: po/rc.cpp:454 rc.cpp:454
+#: po/rc.cpp:518 rc.cpp:518
 msgid ""
 "<i><b>NOTE:</b> If you elect to have Cantata store covers, or lyrics, within "
 "the music folder, and you do not have write access to this folder, then "
@@ -4510,33 +4859,42 @@ msgid ""
 "be accessible to yourself.</i>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:824
-#. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:457 rc.cpp:457
+#. i18n: file: gui/initialsettingswizard.ui:784
+#. i18n: ectx: property (text), widget (QLabel, persNote_2)
+#: po/rc.cpp:521 rc.cpp:521
+msgid ""
+"<i><b>NOTE:</b> Cantata can only save backdrops and artist images within the "
+"music folder hierarchy if this is 2 levels deep. i.e. 'Artist/Album/Tracks'."
+"</i>"
+msgstr ""
+
+#. i18n: file: gui/initialsettingswizard.ui:810
+#. i18n: ectx: property (text), widget (StateLabel, httpNote)
+#: po/rc.cpp:524 rc.cpp:524
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' is set to a HTTP address, and Cantata "
 "currently cannot upload files to external HTTP servers. Therefore, the above "
-"settings should be left disabled.</i>"
+"settings should be left un-checked.</i>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:857
+#. i18n: file: gui/initialsettingswizard.ui:843
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:460 rc.cpp:460
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Finished!"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:880
+#. i18n: file: gui/initialsettingswizard.ui:866
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:463 rc.cpp:463
+#: po/rc.cpp:530 rc.cpp:530
 msgid ""
 "Cantata is now configured! If you wish to further configure Cantata (to add "
 "extra MPD hosts, etc) then Canta's configuration dialog may be accessed from "
 "the menu triggered by the button in the top-right of Cantata's main window."
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:918
+#. i18n: file: gui/initialsettingswizard.ui:904
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:466 rc.cpp:466
+#: po/rc.cpp:533 rc.cpp:533
 msgid ""
 "<b>Warning:</b> You are not currently a member of the 'users' group. Cantata "
 "will function better (saving of album covers, lyrics, etc. with the correct "
@@ -4545,289 +4903,415 @@ msgid ""
 "effect."
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:36
+#. i18n: ectx: attribute (title), widget (QWidget, sidebarTab)
+#: po/rc.cpp:536 rc.cpp:536
+#, fuzzy
+msgid "Sidebar"
+msgstr "大侧边栏"
+
+#. i18n: file: gui/interfacesettings.ui:42
+#. i18n: ectx: property (title), widget (QGroupBox, viewsGroup)
+#: po/rc.cpp:539 rc.cpp:539
+msgid "Views"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:48
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:542 rc.cpp:542
+msgid "Use the checkboxes below to configure the list of active views."
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:77
+#. i18n: ectx: property (text), widget (StateLabel, sbPlayQueueLabel)
+#: po/rc.cpp:545 rc.cpp:545
+msgid ""
+"<i><b>NOTE:</b> By default, the play queue appears to the side of the other "
+"views. If you enable the option above, then it will be merged into the "
+"sidebar as per other views.</i>"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:106
+#. i18n: ectx: property (text), widget (StateLabel, sbInfoLabel)
+#: po/rc.cpp:548 rc.cpp:548
+msgid ""
+"<i><b>NOTE:</b> By default, the 'Info' (current song information) view is "
+"accessible by pressing its icon in the main toolbar. If you enable the "
+"option above, then it will be merged into the sidebar as per other views.</i>"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:144
+#. i18n: ectx: property (text), widget (BuddyLabel, sbPositionLabel)
+#: po/rc.cpp:557 rc.cpp:557
+#, fuzzy
+msgid "Position:"
+msgstr "连接"
+
+#. i18n: file: gui/interfacesettings.ui:157
+#. i18n: ectx: property (text), widget (QCheckBox, sbIconsOnly)
+#: po/rc.cpp:560 rc.cpp:560
+msgid "Only show icons, no text"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:164
+#. i18n: ectx: property (text), widget (QCheckBox, sbMonoIcons)
+#: po/rc.cpp:563 rc.cpp:563
+msgid "Use monochrome icons"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:171
+#. i18n: ectx: property (text), widget (QCheckBox, sbAutoHide)
+#: po/rc.cpp:566 rc.cpp:566
+#, fuzzy
+msgid "Auto-hide"
+msgstr "自动隐藏"
+
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: file: gui/interfacesettings.ui:206
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
-#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: file: gui/interfacesettings.ui:294
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
-#: po/rc.cpp:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
+#: po/rc.cpp:575 po/rc.cpp:594 rc.cpp:575 rc.cpp:594
 msgid "Covers:"
 msgstr "封面:"
 
-#. i18n: file: gui/interfacesettings.ui:64
-#. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:478 rc.cpp:478
-msgid "Show artist images:"
+#. i18n: file: gui/interfacesettings.ui:219
+#. i18n: ectx: property (text), widget (QCheckBox, libraryArtistImage)
+#: po/rc.cpp:578 rc.cpp:578
+#, fuzzy
+msgid "Show artist images"
 msgstr "显示艺术家图片:"
 
-#. i18n: file: gui/interfacesettings.ui:81
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:481 rc.cpp:481
-msgid "Show album year:"
+#. i18n: file: gui/interfacesettings.ui:226
+#. i18n: ectx: property (text), widget (QCheckBox, libraryYear)
+#: po/rc.cpp:581 rc.cpp:581
+#, fuzzy
+msgid "Show album year"
 msgstr "显示专辑年份:"
 
-#. i18n: file: gui/interfacesettings.ui:123
+#. i18n: file: gui/interfacesettings.ui:258
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:484 rc.cpp:484
+#: po/rc.cpp:584 rc.cpp:584
 msgid ""
 "<i><b>NOTE:</b> When looking for artist images, Cantata will look for either "
 "artist.jpg, artist.png, 'Artist'.jpg, or 'Artist'.png,\n"
 "within the folder of the current track, or within its parent folder. If no "
-"image is found, Cantata will attempt to download one. When the image is "
-"displayed, it will be cropped (either top/bottom, or left/right) to provide "
-"a square image.</i>"
+"image is found, Cantata will attempt to download one.</i>"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:172
+#. i18n: file: gui/interfacesettings.ui:307
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:497 rc.cpp:497
+#: po/rc.cpp:597 rc.cpp:597
 msgid "Sort albums:"
 msgstr "专辑分类:"
 
-#. i18n: file: gui/interfacesettings.ui:183
+#. i18n: file: gui/interfacesettings.ui:318
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:500 rc.cpp:500
+#: po/rc.cpp:600 rc.cpp:600
 msgid "Album/Artist"
 msgstr "专辑/艺术家"
 
-#. i18n: file: gui/interfacesettings.ui:188
+#. i18n: file: gui/interfacesettings.ui:323
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:503 rc.cpp:503
+#: po/rc.cpp:603 rc.cpp:603
 msgid "Artist/Album"
 msgstr "艺术家/专辑"
 
-#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: file: gui/interfacesettings.ui:328
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:506 rc.cpp:506
+#: po/rc.cpp:606 rc.cpp:606
 msgid "Artist/Year/Album"
 msgstr "艺术家/年份/专辑"
 
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:224
-#. i18n: ectx: property (text), widget (BuddyLabel, playListsStartClosedLabel)
-#. i18n: file: gui/interfacesettings.ui:337
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueStartClosedLabel)
-#: po/rc.cpp:515 po/rc.cpp:545 rc.cpp:515 rc.cpp:545
-msgid "Initially collapse albums:"
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#. i18n: file: gui/interfacesettings.ui:359
+#. i18n: ectx: property (text), widget (QCheckBox, playListsStartClosed)
+#. i18n: file: gui/interfacesettings.ui:462
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed)
+#: po/rc.cpp:615 po/rc.cpp:645 rc.cpp:615 rc.cpp:645
+#, fuzzy
+msgid "Initially collapse albums"
 msgstr "收起第一层专辑:"
 
-#. i18n: file: gui/interfacesettings.ui:242
+#. i18n: file: gui/interfacesettings.ui:367
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:518 rc.cpp:518
+#: po/rc.cpp:618 rc.cpp:618
 msgid "Other Views"
 msgstr "其他视图"
 
-#. i18n: file: gui/interfacesettings.ui:251
+#. i18n: file: gui/interfacesettings.ui:376
 #. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
-#: po/rc.cpp:521 rc.cpp:521
+#: po/rc.cpp:621 rc.cpp:621
 msgid "Folder view style:"
 msgstr "文件夹视图:"
 
-#. i18n: file: gui/interfacesettings.ui:264
+#. i18n: file: gui/interfacesettings.ui:389
 #. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
-#: po/rc.cpp:524 rc.cpp:524
+#: po/rc.cpp:624 rc.cpp:624
 msgid "Streams view style:"
 msgstr "流媒体视图:"
 
-#. i18n: file: gui/interfacesettings.ui:277
+#. i18n: file: gui/interfacesettings.ui:402
 #. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
-#: po/rc.cpp:527 rc.cpp:527
+#: po/rc.cpp:627 rc.cpp:627
 msgid "Online view style:"
 msgstr "在线视图:"
 
-#. i18n: file: gui/interfacesettings.ui:290
+#. i18n: file: gui/interfacesettings.ui:415
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:530 rc.cpp:530
+#: po/rc.cpp:630 rc.cpp:630
 msgid "Devices view style:"
 msgstr "设备查看模式:"
 
-#. i18n: file: gui/interfacesettings.ui:324
-#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:539 rc.cpp:539
-msgid "Table"
-msgstr "表单"
-
-#. i18n: file: gui/interfacesettings.ui:354
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueAutoExpandLabel)
-#: po/rc.cpp:548 rc.cpp:548
-msgid "Automatically expand current album:"
+#. i18n: file: gui/interfacesettings.ui:469
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueAutoExpand)
+#: po/rc.cpp:648 rc.cpp:648
+#, fuzzy
+msgid "Automatically expand current album"
 msgstr "自动展开当前专辑:"
 
-#. i18n: file: gui/interfacesettings.ui:371
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueScrollLabel)
-#: po/rc.cpp:551 rc.cpp:551
-msgid "Scroll to current track:"
-msgstr "跳转到当前音轨:"
-
-#. i18n: file: gui/interfacesettings.ui:384
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueBackgroundLabel)
-#: po/rc.cpp:554 rc.cpp:554
+#. i18n: file: gui/interfacesettings.ui:476
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueScroll)
+#: po/rc.cpp:651 rc.cpp:651
 #, fuzzy
-msgid "Use current album cover as background:"
-msgstr "用封面作为歌词背景:"
+msgid "Scroll to current track"
+msgstr "跳转到当前音轨:"
 
-#. i18n: file: gui/interfacesettings.ui:397
-#. i18n: ectx: property (text), widget (BuddyLabel, playQueueConfirmClearLabel)
-#: po/rc.cpp:557 rc.cpp:557
-msgid "Prompt before clearing:"
+#. i18n: file: gui/interfacesettings.ui:483
+#. i18n: ectx: property (text), widget (QCheckBox, playQueueConfirmClear)
+#: po/rc.cpp:654 rc.cpp:654
+msgid "Prompt before clearing"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:411
+#. i18n: file: gui/interfacesettings.ui:509
+#. i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_cover)
+#: po/rc.cpp:663 rc.cpp:663
+#, fuzzy
+msgid "Current album cover"
+msgstr "复制专辑封面为:"
+
+#. i18n: file: gui/interfacesettings.ui:638
 #. i18n: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:560 rc.cpp:560
+#: po/rc.cpp:682 rc.cpp:682
 msgid "External"
 msgstr "外部"
 
-#. i18n: file: gui/interfacesettings.ui:417
-#. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:563 rc.cpp:563
-msgid "Show icon in notification area:"
+#. i18n: file: gui/interfacesettings.ui:644
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayPopup)
+#: po/rc.cpp:685 rc.cpp:685
+#, fuzzy
+msgid "Show popup messages when changing tracks"
+msgstr "更改音轨时在托盘显示信息:"
+
+#. i18n: file: gui/interfacesettings.ui:654
+#. i18n: ectx: property (text), widget (QCheckBox, systemTrayCheckBox)
+#: po/rc.cpp:688 rc.cpp:688
+#, fuzzy
+msgid "Show icon in notification area"
 msgstr "显示托盘图标:"
 
-#. i18n: file: gui/interfacesettings.ui:437
-#. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:566 rc.cpp:566
-msgid "Minimize to notification area when closed:"
+#. i18n: file: gui/interfacesettings.ui:664
+#. i18n: ectx: property (text), widget (QCheckBox, minimiseOnClose)
+#: po/rc.cpp:691 rc.cpp:691
+#, fuzzy
+msgid "Minimize to notification area when closed"
 msgstr "最小化到托盘:"
 
-#. i18n: file: gui/interfacesettings.ui:457
-#. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:569 rc.cpp:569
-msgid "Show popup messages when changing tracks:"
-msgstr "更改音轨时在托盘显示信息:"
+#. i18n: file: gui/interfacesettings.ui:671
+#. i18n: ectx: property (title), widget (QGroupBox, startupState)
+#: po/rc.cpp:694 rc.cpp:694
+msgid "On Start-up"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:677
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateShow)
+#: po/rc.cpp:697 rc.cpp:697
+#, fuzzy
+msgid "Show main window"
+msgstr "显示窗口"
+
+#. i18n: file: gui/interfacesettings.ui:684
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateHide)
+#: po/rc.cpp:700 rc.cpp:700
+msgid "Hide main window"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:691
+#. i18n: ectx: property (text), widget (QRadioButton, startupStateRestore)
+#: po/rc.cpp:703 rc.cpp:703
+msgid "Restore previous state"
+msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:475
+#. i18n: file: gui/interfacesettings.ui:715
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:572 rc.cpp:572
+#: po/rc.cpp:706 rc.cpp:706
 msgid "General"
 msgstr "流派"
 
-#. i18n: file: gui/interfacesettings.ui:486
-#. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:575 rc.cpp:575
-msgid "Group single track albums:"
+#. i18n: file: gui/interfacesettings.ui:726
+#. i18n: ectx: property (text), widget (QCheckBox, groupSingle)
+#: po/rc.cpp:709 rc.cpp:709
+#, fuzzy
+msgid "Group single track albums"
 msgstr "分组单个音轨专辑:"
 
-#. i18n: file: gui/interfacesettings.ui:503
-#. i18n: ectx: property (text), widget (BuddyLabel, useComposerLabel)
-#: po/rc.cpp:578 rc.cpp:578
+#. i18n: file: gui/interfacesettings.ui:733
+#. i18n: ectx: property (text), widget (QCheckBox, useComposer)
+#: po/rc.cpp:712 rc.cpp:712
 #, fuzzy
-msgid "Group albums by composer:"
+msgid "Group albums by composer"
 msgstr "复制专辑封面为:"
 
-#. i18n: file: gui/interfacesettings.ui:520
-#. i18n: ectx: property (text), widget (BuddyLabel, groupMultipleLabel)
-#: po/rc.cpp:581 rc.cpp:581
-msgid "Multiple artist albums:"
-msgstr "多个艺术家专辑:"
+#. i18n: file: gui/interfacesettings.ui:740
+#. i18n: ectx: property (text), widget (QCheckBox, groupMultiple)
+#: po/rc.cpp:715 rc.cpp:715
+#, fuzzy
+msgid "Group multiple artist albums under 'Various Artists'"
+msgstr "'多个艺术家'分组"
 
-#. i18n: file: gui/interfacesettings.ui:533
-#. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:584 rc.cpp:584
-msgid "Show delete action in context menus:"
+#. i18n: file: gui/interfacesettings.ui:747
+#. i18n: ectx: property (text), widget (QCheckBox, fetchCovers)
+#: po/rc.cpp:718 rc.cpp:718
+msgid "Fetch missing covers from Last.fm"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:754
+#. i18n: ectx: property (text), widget (QCheckBox, cacheScaledCovers)
+#: po/rc.cpp:721 rc.cpp:721
+msgid "Cache scaled covers"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:761
+#. i18n: ectx: property (text), widget (QCheckBox, showDeleteAction)
+#: po/rc.cpp:724 rc.cpp:724
+#, fuzzy
+msgid "Show delete action in context menus"
 msgstr "在上下文菜单中显示删除:"
 
-#. i18n: file: gui/interfacesettings.ui:550
-#. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:587 rc.cpp:587
-msgid "Enforce single-click activation of items:"
+#. i18n: file: gui/interfacesettings.ui:768
+#. i18n: ectx: property (text), widget (QCheckBox, forceSingleClick)
+#: po/rc.cpp:727 rc.cpp:727
+#, fuzzy
+msgid "Enforce single-click activation of items"
 msgstr "强制使用单击选择项目:"
 
-#. i18n: file: gui/interfacesettings.ui:591
+#. i18n: file: gui/interfacesettings.ui:775
+#. i18n: ectx: property (text), widget (BuddyLabel, langLabel)
+#: po/rc.cpp:730 rc.cpp:730
+msgid "Language:"
+msgstr ""
+
+#. i18n: file: gui/interfacesettings.ui:806
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:590 rc.cpp:590
+#: po/rc.cpp:733 rc.cpp:733
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
 msgstr ""
 "<i><b>注意:</b> 启用\"强制使用单击激活项目\"后必须重新启动 Cantata。</i>"
 
-#. i18n: file: gui/mainwindow.ui:287
+#. i18n: file: gui/interfacesettings.ui:835
+#. i18n: ectx: property (text), widget (StateLabel, langNoteLabel)
+#: po/rc.cpp:736 rc.cpp:736
+#, fuzzy
+msgid ""
+"<i><b>NOTE:</b> Changing the language setting will require a re-start of "
+"Cantata.</i>"
+msgstr ""
+"<i><b>注意:</b> 启用\"强制使用单击激活项目\"后必须重新启动 Cantata。</i>"
+
+#. i18n: file: gui/mainwindow.ui:298
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:593 rc.cpp:593
+#: po/rc.cpp:739 rc.cpp:739
 msgid "[Dynamic]"
 msgstr "[动态]"
 
-#. i18n: file: gui/playbacksettings.ui:20
+#. i18n: file: gui/playbacksettings.ui:38
+#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
+#: po/rc.cpp:745 rc.cpp:745
+msgid "Fadeout on stop:"
+msgstr "停止时淡出:"
+
+#. i18n: file: gui/playbacksettings.ui:48
+#. i18n: ectx: property (suffix), widget (QSpinBox, stopFadeDuration)
+#: po/rc.cpp:748 rc.cpp:748
+msgid " ms"
+msgstr " 毫秒"
+
+#. i18n: file: gui/playbacksettings.ui:58
+#. i18n: ectx: property (text), widget (QCheckBox, stopOnExit)
+#: po/rc.cpp:754 rc.cpp:754
+msgid "Stop playback on exit"
+msgstr "退出时停止回放"
+
+#. i18n: file: gui/playbacksettings.ui:65
+#. i18n: ectx: property (text), widget (QCheckBox, stopDynamizerOnExit)
+#: po/rc.cpp:757 rc.cpp:757
+msgid "Stop dynamizer on exit"
+msgstr "退出时关闭动态"
+
+#. i18n: file: gui/playbacksettings.ui:72
+#. i18n: ectx: property (text), widget (QCheckBox, inhibitSuspend)
+#: po/rc.cpp:760 rc.cpp:760
+msgid "Inhibit suspend whilst playing"
+msgstr ""
+
+#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:763 rc.cpp:763
+msgid ""
+"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
+"shown allowing you to choose whether to stop playback now, or after the "
+"current track.</i>"
+msgstr ""
+
+#. i18n: file: gui/playbacksettings.ui:108
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:596 rc.cpp:596
+#: po/rc.cpp:766 rc.cpp:766
 msgid "Output"
 msgstr "输出"
 
-#. i18n: file: gui/playbacksettings.ui:41
+#. i18n: file: gui/playbacksettings.ui:129
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:602 rc.cpp:602
-msgid "Crossfading:"
-msgstr "淡入淡出:"
+#: po/rc.cpp:772 rc.cpp:772
+msgid "Crossfade between tracks:"
+msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:51
-#. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:605 rc.cpp:605
-msgid " seconds"
-msgstr " 秒"
+#. i18n: file: gui/playbacksettings.ui:139
+#. i18n: ectx: property (suffix), widget (QSpinBox, crossfading)
+#: po/rc.cpp:775 rc.cpp:775
+#, fuzzy
+msgid " s"
+msgstr " 毫秒"
 
-#. i18n: file: gui/playbacksettings.ui:61
+#. i18n: file: gui/playbacksettings.ui:152
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:608 rc.cpp:608
+#: po/rc.cpp:781 rc.cpp:781
 msgid "Replay gain:"
 msgstr "播放增益:"
 
-#. i18n: file: gui/playbacksettings.ui:95
+#. i18n: file: gui/playbacksettings.ui:195
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:611 rc.cpp:611
+#: po/rc.cpp:784 rc.cpp:784
 #, fuzzy
 msgid "About replay gain"
 msgstr "播放增益:"
 
-#. i18n: file: gui/playbacksettings.ui:104
+#. i18n: file: gui/playbacksettings.ui:204
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:614 rc.cpp:614
-#, fuzzy
-msgid "Devices:"
-msgstr "设备"
-
-#. i18n: file: gui/playbacksettings.ui:141
-#. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:620 rc.cpp:620
-msgid "Fadeout on stop:"
-msgstr "停止时淡出:"
-
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:623 rc.cpp:623
-msgid "Stop playback on exit:"
-msgstr "退出时停止回放:"
-
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:626 rc.cpp:626
-msgid "Stop dynamizer on exit:"
-msgstr "退出时关闭动态:"
-
-#. i18n: file: gui/playbacksettings.ui:184
-#. i18n: ectx: property (text), widget (BuddyLabel, inhibitSuspendLabel)
-#: po/rc.cpp:629 rc.cpp:629
-msgid "Inhibit suspend whilst playing:"
-msgstr ""
-
-#. i18n: file: gui/playbacksettings.ui:217
-#. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:632 rc.cpp:632
-msgid ""
-"<i><b>NOTE:</b> If you press and hold the stop button, then a menu will be "
-"shown allowing you to choose whether to stop playback now, or after the "
-"current track.</i>"
+#: po/rc.cpp:787 rc.cpp:787
+msgid "Use the checkboxes below to control the active outputs."
 msgstr ""
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:635 rc.cpp:635
+#: po/rc.cpp:790 rc.cpp:790
 #, fuzzy
 msgid "Collection:"
 msgstr "连接"
@@ -4840,26 +5324,26 @@ msgstr "连接"
 #. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
 #. i18n: file: gui/serversettings.ui:338
 #. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
-#: po/rc.cpp:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
+#: po/rc.cpp:808 po/rc.cpp:829 rc.cpp:808 rc.cpp:829
 msgid "Cover filename:"
 msgstr "封面名称:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:656 rc.cpp:656
+#: po/rc.cpp:811 rc.cpp:811
 msgid "Dynamizer port:"
 msgstr "动态端口"
 
 #. i18n: file: gui/serversettings.ui:168
 #. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
-#: po/rc.cpp:659 rc.cpp:659
+#: po/rc.cpp:814 rc.cpp:814
 #, fuzzy
 msgid "HTTP stream URL:"
 msgstr "流媒体 %1"
 
 #. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:662 rc.cpp:662
+#: po/rc.cpp:817 rc.cpp:817
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art "
 "(either the value specified above, or <code>cover.jpg / cover.png</code> if "
@@ -4873,7 +5357,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:277
 #. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
-#: po/rc.cpp:668 rc.cpp:668
+#: po/rc.cpp:823 rc.cpp:823
 #, fuzzy
 msgid ""
 "<i><b>NOTE:</b> 'HTTP Stream URL' is only of use if you have MPD configured "
@@ -4884,7 +5368,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:677 rc.cpp:677
+#: po/rc.cpp:832 rc.cpp:832
 msgid ""
 "<i><b>NOTE:</b> If you change the 'Music folder' setting, then you will need "
 "to manually update the music database. This can be performed by pressing the "
@@ -4893,7 +5377,7 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:379
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel_2)
-#: po/rc.cpp:680 rc.cpp:680
+#: po/rc.cpp:835 rc.cpp:835
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -4901,20 +5385,14 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:683 rc.cpp:683
+#: po/rc.cpp:838 rc.cpp:838
 #, fuzzy
 msgid "Network interface:"
 msgstr "地址/网络接口:"
 
-#. i18n: file: http/httpserversettings.ui:38
-#. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:686 rc.cpp:686
-msgid "Current URL:"
-msgstr ""
-
-#. i18n: file: http/httpserversettings.ui:73
+#. i18n: file: http/httpserversettings.ui:57
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:689 rc.cpp:689
+#: po/rc.cpp:841 rc.cpp:841
 msgid ""
 "<i><b>NOTE:</b> MPD usually only plays songs that are stored within its "
 "folders. Cantata contains a minimal HTTP server that can be used to serve "
@@ -4926,33 +5404,31 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:693 rc.cpp:693
+#: po/rc.cpp:845 rc.cpp:845
 msgid "Mode:"
 msgstr ""
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:699 rc.cpp:699
+#: po/rc.cpp:851 rc.cpp:851
 msgid "HTTP Proxy"
 msgstr "HTTP 代理"
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:702 rc.cpp:702
+#: po/rc.cpp:854 rc.cpp:854
 msgid "SOCKS Proxy"
 msgstr "SOCKS 代理"
 
 #. i18n: file: online/onlinesettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:717 rc.cpp:717
-msgid ""
-"The following is a list of online providers, to hide a provider simply un-"
-"check its entry in this list."
+#: po/rc.cpp:869 rc.cpp:869
+msgid "Use the checkboxes below to configure the list of active services."
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:723 rc.cpp:723
+#: po/rc.cpp:875 rc.cpp:875
 msgid ""
 "You can listen for free without an account, but Premium members can listen "
 "to higher quality streams without advertisements. Visit <a href=\"http://www."
@@ -4962,39 +5438,39 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:726 rc.cpp:726
+#: po/rc.cpp:878 rc.cpp:878
 msgid "Premium Account"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:735 rc.cpp:735
+#: po/rc.cpp:887 rc.cpp:887
 #, fuzzy
 msgid "Stream type:"
 msgstr "流媒体:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:738 rc.cpp:738
+#: po/rc.cpp:890 rc.cpp:890
 msgid "Status:"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:109
 #. i18n: ectx: property (text), widget (QPushButton, loginButton)
-#: po/rc.cpp:741 streams/digitallyimportedsettings.cpp:130
-#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
+#: po/rc.cpp:893 streams/digitallyimportedsettings.cpp:131
+#: streams/digitallyimportedsettings.cpp:137 rc.cpp:893
 msgid "Login"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:747 rc.cpp:747
+#: po/rc.cpp:899 rc.cpp:899
 msgid "Session expiry:"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:151
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:750 rc.cpp:750
+#: po/rc.cpp:902 rc.cpp:902
 msgid ""
 "<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
 "RockRadio.com, and Sky.fm</i>"
@@ -5002,7 +5478,7 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:161
 #. i18n: ectx: property (text), widget (QLabel, note2Label)
-#: po/rc.cpp:753 rc.cpp:753
+#: po/rc.cpp:905 rc.cpp:905
 msgid ""
 "<i><b>NOTE:</b> If you enter account details, then a 'DI' status item will "
 "appear under the list of streams. This will indicate if you are logged in or "
@@ -5011,28 +5487,26 @@ msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:12
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:756 rc.cpp:756
-msgid ""
-"The following is a list of the top-level stream categories, to hide a "
-"category simply un-check its entry in this list."
+#: po/rc.cpp:908 rc.cpp:908
+msgid "Use the checkboxes below to configure the list of active providers."
 msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:47
 #. i18n: ectx: property (text), widget (QPushButton, configureButton)
-#: po/rc.cpp:759 rc.cpp:759
+#: po/rc.cpp:911 rc.cpp:911
 #, fuzzy
 msgid "Configure Provider"
 msgstr "设置设备"
 
 #. i18n: file: streams/streamssettings.ui:60
 #. i18n: ectx: property (text), widget (QPushButton, installButton)
-#: po/rc.cpp:762 rc.cpp:762
+#: po/rc.cpp:914 rc.cpp:914
 msgid "Install"
 msgstr ""
 
 #. i18n: file: streams/streamssettings.ui:80
 #. i18n: ectx: property (text), widget (QLabel, note)
-#: po/rc.cpp:768 rc.cpp:768
+#: po/rc.cpp:920 rc.cpp:920
 msgid ""
 "<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
 "removed.</i>"
@@ -5040,194 +5514,188 @@ msgstr ""
 
 #. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:771 rc.cpp:771
+#: po/rc.cpp:923 rc.cpp:923
 msgid "Search:"
 msgstr "搜索:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:65
 #. i18n: ectx: property (title), widget (QGroupBox, actionBox)
-#: po/rc.cpp:774 rc.cpp:774
+#: po/rc.cpp:926 rc.cpp:926
 msgid "Shortcut for Selected Action"
 msgstr "选定动作的快捷键"
 
 #. i18n: file: support/shortcutssettingswidget.ui:71
 #. i18n: ectx: property (text), widget (QRadioButton, useDefault)
-#: po/rc.cpp:777 rc.cpp:777
+#: po/rc.cpp:929 rc.cpp:929
 msgid "Default:"
 msgstr "默认:"
 
 #. i18n: file: support/shortcutssettingswidget.ui:85
 #. i18n: ectx: property (text), widget (QRadioButton, useCustom)
-#: po/rc.cpp:783 rc.cpp:783
+#: po/rc.cpp:935 rc.cpp:935
 msgid "Custom:"
 msgstr "自定义:"
 
-#. i18n: file: tags/tageditor.ui:25
-#. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:786 rc.cpp:786
-msgid "Track:"
-msgstr "音轨:"
-
 #. i18n: file: tags/tageditor.ui:64
 #. i18n: ectx: property (text), widget (StateLabel, albumArtistLabel)
-#: po/rc.cpp:795 rc.cpp:795
+#: po/rc.cpp:947 rc.cpp:947
 msgid "Album artist:"
 msgstr "专辑艺术家:"
 
 #. i18n: file: tags/tageditor.ui:103
 #. i18n: ectx: property (text), widget (StateLabel, trackLabel)
-#: po/rc.cpp:804 rc.cpp:804
+#: po/rc.cpp:956 rc.cpp:956
 msgid "Track number:"
 msgstr "音轨号:"
 
 #. i18n: file: tags/tageditor.ui:116
 #. i18n: ectx: property (text), widget (StateLabel, discLabel)
-#: po/rc.cpp:807 rc.cpp:807
+#: po/rc.cpp:959 rc.cpp:959
 msgid "Disc number:"
 msgstr "碟片序号:"
 
-#. i18n: file: tags/trackorganiser.ui:155
+#. i18n: file: tags/trackorganiser.ui:115
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:834 rc.cpp:834
+#: po/rc.cpp:989 rc.cpp:989
 msgid "Original Name"
 msgstr "原始名称"
 
-#. i18n: file: tags/trackorganiser.ui:160
+#. i18n: file: tags/trackorganiser.ui:120
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:837 rc.cpp:837
+#: po/rc.cpp:992 rc.cpp:992
 msgid "New Name"
 msgstr "新名称"
 
-#: po/rc.cpp:838 rc.cpp:838
+#: po/rc.cpp:996 rc.cpp:996
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "姓名"
 
-#: po/rc.cpp:839 rc.cpp:839
+#: po/rc.cpp:997 rc.cpp:997
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "你的 E-mail"
 
-#: replaygain/rgdialog.cpp:121
+#: replaygain/rgdialog.cpp:116
 #, fuzzy
 msgid "Show All Tracks"
 msgstr "所有音轨"
 
-#: replaygain/rgdialog.cpp:122
+#: replaygain/rgdialog.cpp:117
 #, fuzzy
 msgid "Show Untagged Tracks"
 msgstr "音轨无标签"
 
-#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:124 tags/trackorganiser.cpp:79
 #, fuzzy
 msgid "Remove From List"
 msgstr "确定删除流媒体?"
 
-#: replaygain/rgdialog.cpp:136
+#: replaygain/rgdialog.cpp:131
 msgid "Album Gain"
 msgstr "专辑增益"
 
-#: replaygain/rgdialog.cpp:137
+#: replaygain/rgdialog.cpp:132
 msgid "Track Gain"
 msgstr "音轨增益"
 
-#: replaygain/rgdialog.cpp:138
+#: replaygain/rgdialog.cpp:133
 msgid "Album Peak"
 msgstr "专辑峰值"
 
-#: replaygain/rgdialog.cpp:139
+#: replaygain/rgdialog.cpp:134
 msgid "Track Peak"
 msgstr "音轨峰值"
 
-#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
+#: replaygain/rgdialog.cpp:154 replaygain/rgdialog.cpp:283
 msgid "Scan"
 msgstr "扫描"
 
-#: replaygain/rgdialog.cpp:238
+#: replaygain/rgdialog.cpp:233
 #, fuzzy
 msgid "Update ReplayGain tags in tracks?"
 msgstr "更新文件的增益标签?"
 
-#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
+#: replaygain/rgdialog.cpp:233 replaygain/rgdialog.cpp:234
 #, fuzzy
 msgid "Update Tags"
 msgstr "正在更新 %1"
 
-#: replaygain/rgdialog.cpp:252
+#: replaygain/rgdialog.cpp:247
 #, fuzzy
 msgid "Abort scanning of tracks?"
 msgstr "放弃编辑歌词?"
 
-#: replaygain/rgdialog.cpp:261
+#: replaygain/rgdialog.cpp:256
 #, fuzzy
 msgid "Abort reading of existing tags?"
 msgstr "取消获取标签?"
 
-#: replaygain/rgdialog.cpp:287
+#: replaygain/rgdialog.cpp:282
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:289
+#: replaygain/rgdialog.cpp:284
 #, fuzzy
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr "扫描所有文件还是仅扫描缺少标签的文件?"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "Untagged Tracks"
 msgstr "音轨无标签"
 
-#: replaygain/rgdialog.cpp:290
+#: replaygain/rgdialog.cpp:285
 msgid "All Tracks"
 msgstr "所有音轨"
 
-#: replaygain/rgdialog.cpp:300
+#: replaygain/rgdialog.cpp:295
 #, fuzzy
 msgid "Scanning tracks..."
 msgstr "更新音轨..."
 
-#: replaygain/rgdialog.cpp:367
+#: replaygain/rgdialog.cpp:362
 msgid "Reading existing tags..."
 msgstr "读取标签..."
 
-#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+#: replaygain/rgdialog.cpp:414 tags/tageditor.cpp:798
 #, fuzzy
 msgctxt "filename (Timeout)"
 msgid "%1 (Timeout)"
 msgstr "%1 (估算时间)"
 
-#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:802
 msgctxt "filename (Corrupt tags?)"
 msgid "%1 (Corrupt tags?)"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
+#: replaygain/rgdialog.cpp:432 tags/tageditor.cpp:812
 msgid "Failed to update the tags of the following tracks:"
 msgstr "下列歌曲标签更新失败:"
 
-#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
-#: tags/trackorganiser.cpp:451
+#: replaygain/rgdialog.cpp:473 tags/tageditor.cpp:885
+#: tags/trackorganiser.cpp:483
 msgid "Device is not connected."
 msgstr "设备未连接."
 
-#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
-#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
+#: replaygain/rgdialog.cpp:513 replaygain/rgdialog.cpp:520
+#: replaygain/rgdialog.cpp:599 replaygain/rgdialog.cpp:601
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:520 replaygain/rgdialog.cpp:521
-#: replaygain/rgdialog.cpp:527 replaygain/rgdialog.cpp:528
-#: replaygain/rgdialog.cpp:579 replaygain/rgdialog.cpp:580
-#: replaygain/rgdialog.cpp:581 replaygain/rgdialog.cpp:582
+#: replaygain/rgdialog.cpp:516 replaygain/rgdialog.cpp:517
+#: replaygain/rgdialog.cpp:523 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:575 replaygain/rgdialog.cpp:576
+#: replaygain/rgdialog.cpp:577 replaygain/rgdialog.cpp:578
 msgid "Failed"
 msgstr "失败"
 
-#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
+#: replaygain/rgdialog.cpp:651 tags/trackorganiser.cpp:428
 msgid "Remove the selected tracks from the list?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
+#: replaygain/rgdialog.cpp:652 tags/trackorganiser.cpp:429
 #, fuzzy
 msgid "Remove Tracks"
 msgstr "确定删除流媒体?"
@@ -5249,19 +5717,19 @@ msgstr ""
 msgid "AAC 128k"
 msgstr ""
 
-#: streams/digitallyimportedsettings.cpp:109
+#: streams/digitallyimportedsettings.cpp:110
 msgid "Logged out"
 msgstr ""
 
-#: streams/digitallyimportedsettings.cpp:112
+#: streams/digitallyimportedsettings.cpp:113
 msgid "Logging in..."
 msgstr ""
 
-#: streams/digitallyimportedsettings.cpp:136
+#: streams/digitallyimportedsettings.cpp:137
 msgid "Logout"
 msgstr ""
 
-#: streams/streamdialog.cpp:71
+#: streams/streamdialog.cpp:72
 msgid "URL:"
 msgstr ""
 
@@ -5285,7 +5753,7 @@ msgstr "编辑流媒体"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>错误:</b>协议无效</i>"
 
-#: streams/streamfetcher.cpp:205
+#: streams/streamfetcher.cpp:209
 #, fuzzy
 msgid "Fetching %1"
 msgstr "正在保存 %1"
@@ -5304,94 +5772,94 @@ msgstr "导出流媒体"
 msgid "Add New Stream To Favorites"
 msgstr ""
 
-#: streams/streamspage.cpp:124
+#: streams/streamspage.cpp:125
 #, fuzzy
 msgctxt "Service name"
 msgid "Digitally Imported"
 msgstr "Jamendo 设置"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:243
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
+#: streams/streamspage.cpp:243 streams/streamspage.cpp:245
 msgid "Import Streams"
 msgstr "导入流媒体"
 
-#: streams/streamspage.cpp:245
+#: streams/streamspage.cpp:246
 #, fuzzy
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "Cantata 流媒体 (*.cantata)"
 
-#: streams/streamspage.cpp:253
+#: streams/streamspage.cpp:254
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr "无法导入 <b>%1</b>!<br/>请检查格式是否正确。"
 
-#: streams/streamspage.cpp:265
+#: streams/streamspage.cpp:266
 msgid "*.xml|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
+#: streams/streamspage.cpp:266 streams/streamspage.cpp:268
 msgid "Export Streams"
 msgstr "导出流媒体"
 
-#: streams/streamspage.cpp:267
+#: streams/streamspage.cpp:268
 msgid "XML Streams (*.xml)"
 msgstr ""
 
-#: streams/streamspage.cpp:279
+#: streams/streamspage.cpp:280
 msgid "Failed to create <b>%1</b>!"
 msgstr "<b>%1</b> 创建失败!"
 
-#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
+#: streams/streamspage.cpp:297 streams/streamspage.cpp:493
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "流媒体已经存在! <br/><b>%1</b>"
 
-#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
+#: streams/streamspage.cpp:299 streams/streamspage.cpp:495
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "已经有名为 <b>%1</b> 的流媒体!"
 
-#: streams/streamspage.cpp:318
+#: streams/streamspage.cpp:319
 msgid "Bookmark added"
 msgstr ""
 
-#: streams/streamspage.cpp:320
+#: streams/streamspage.cpp:321
 msgid "Already bookmarked"
 msgstr ""
 
-#: streams/streamspage.cpp:366
+#: streams/streamspage.cpp:367
 msgid "Added to favorites"
 msgstr ""
 
-#: streams/streamspage.cpp:368
+#: streams/streamspage.cpp:369
 #, fuzzy
 msgid "Already in favorites"
 msgstr "已经存在"
 
-#: streams/streamspage.cpp:393
+#: streams/streamspage.cpp:394
 msgid "Reload <b>%1</b> streams?"
 msgstr ""
 
-#: streams/streamspage.cpp:411
+#: streams/streamspage.cpp:412
 #, fuzzy
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr "确定要移除 <b>%1</b> ?"
 
-#: streams/streamspage.cpp:417
+#: streams/streamspage.cpp:418
 #, fuzzy
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr "确定要移除 <b>%1</b> ?"
 
-#: streams/streamspage.cpp:445
+#: streams/streamspage.cpp:446
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "确定移除选择的流媒体 %1 ?"
 
-#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
+#: streams/streamspage.cpp:450 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "确定要移除 <b>%1</b> ?"
 
-#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+#: streams/streamspage.cpp:561 streams/streamspage.cpp:577
 #, fuzzy
 msgid "Search %1:"
 msgstr "搜索:"
@@ -5439,149 +5907,100 @@ msgstr "下载流媒体列表失败"
 msgid "Failed to remove streams folder!"
 msgstr "无法删除前一个配置 - %1"
 
-#: support/dialog.cpp:89
+#: support/dialog.cpp:73
 msgid "&OK"
 msgstr ""
 
-#: support/dialog.cpp:90
+#: support/dialog.cpp:74
 #, fuzzy
 msgid "&Cancel"
 msgstr "取消"
 
-#: support/dialog.cpp:91
+#: support/dialog.cpp:75
 msgid "&Yes"
 msgstr ""
 
-#: support/dialog.cpp:92
+#: support/dialog.cpp:76
 msgid "&No"
 msgstr ""
 
-#: support/dialog.cpp:93
+#: support/dialog.cpp:77
 #, fuzzy
 msgid "&Discard"
 msgstr "碟片"
 
-#: support/dialog.cpp:94
+#: support/dialog.cpp:78
 #, fuzzy
 msgid "&Save"
 msgstr "保存"
 
-#: support/dialog.cpp:95
+#: support/dialog.cpp:79
 msgid "&Apply"
 msgstr ""
 
-#: support/dialog.cpp:96
+#: support/dialog.cpp:80
 #, fuzzy
 msgid "&Close"
 msgstr "关闭"
 
-#: support/dialog.cpp:98
+#: support/dialog.cpp:82
 #, fuzzy
 msgid "&Overwrite"
 msgstr "覆盖歌曲:"
 
-#: support/dialog.cpp:99
+#: support/dialog.cpp:83
 msgid "&Reset"
 msgstr ""
 
-#: support/dialog.cpp:100
+#: support/dialog.cpp:84
 msgid "&Continue"
 msgstr ""
 
-#: support/dialog.cpp:101
+#: support/dialog.cpp:85
 #, fuzzy
 msgid "&Delete"
 msgstr "删除全部"
 
-#: support/dialog.cpp:102
+#: support/dialog.cpp:86
 #, fuzzy
 msgid "&Stop"
 msgstr "停止"
 
-#: support/dialog.cpp:103
+#: support/dialog.cpp:87
 #, fuzzy
 msgid "&Remove"
 msgstr "删除"
 
-#: support/dialog.cpp:104
+#: support/dialog.cpp:88
 #, fuzzy
 msgid "&Previous"
 msgstr "上一个"
 
-#: support/dialog.cpp:105
+#: support/dialog.cpp:89
 #, fuzzy
 msgid "&Next"
 msgstr "下一个"
 
-#: support/fancytabwidget.cpp:957
-msgid "Icons Only"
-msgstr "仅图标"
-
-#: support/fancytabwidget.cpp:958
-msgid "Style"
-msgstr "视图"
-
-#: support/fancytabwidget.cpp:959
-msgid "Large Sidebar"
-msgstr "大侧边栏"
-
-#: support/fancytabwidget.cpp:960
-msgid "Small Sidebar"
-msgstr "小侧边栏"
-
-#: support/fancytabwidget.cpp:961
-msgid "Top Bar"
-msgstr "顶栏"
-
-#: support/fancytabwidget.cpp:962
-msgid "Bottom Bar"
-msgstr "底部栏"
-
-#: support/fancytabwidget.cpp:963
-msgid "Tabs On Side"
-msgstr "标签在左侧"
-
-#: support/fancytabwidget.cpp:964
-msgid "Tabs On Top"
-msgstr "标签在顶部"
-
-#: support/fancytabwidget.cpp:965
-msgid "Tabs On Bottom"
-msgstr "标签在底部"
-
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Password"
 msgstr "密码"
 
-#: support/inputdialog.h:47
+#: support/inputdialog.h:51
 msgid "Please enter password:"
 msgstr "请输入密码:"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:123
+#: support/messagebox.cpp:50 support/messagebox.cpp:124
 msgid "Warning"
 msgstr "警告"
 
-#: support/messagebox.cpp:50 support/messagebox.cpp:118
+#: support/messagebox.cpp:50 support/messagebox.cpp:119
 msgid "Question"
 msgstr "问题"
 
-#: support/messagebox.cpp:107 support/messagebox.cpp:113
-#: support/messagebox.h:62
-msgid "Error"
-msgstr "错误"
-
 #: support/messagebox.h:65
 msgid "Information"
 msgstr "信息"
 
-#: support/onoffbutton.cpp:47
-msgid "ON"
-msgstr "开"
-
-#: support/onoffbutton.cpp:48
-msgid "OFF"
-msgstr "关"
-
 #: support/pathrequester.cpp:50
 msgid "Select Folder"
 msgstr "选择文件夹"
@@ -5623,102 +6042,102 @@ msgid "1 day %2"
 msgid_plural "%1 days %2"
 msgstr[0] "%1 天 %2"
 
-#: tags/tageditor.cpp:134
+#: tags/tageditor.cpp:147
 msgid "Tags"
 msgstr "标签"
 
-#: tags/tageditor.cpp:147
+#: tags/tageditor.cpp:160
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr ""
 
-#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
+#: tags/tageditor.cpp:261 tags/tageditor.cpp:592
 msgid "All tracks"
 msgstr "所有音轨"
 
-#: tags/tageditor.cpp:295
+#: tags/tageditor.cpp:323
 msgid "(Various)"
 msgstr "(多个)"
 
-#: tags/tageditor.cpp:336
+#: tags/tageditor.cpp:368
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr "应用\"多个艺术家\" 环境到 <b>所有</b> 音轨?"
 
-#: tags/tageditor.cpp:378
+#: tags/tageditor.cpp:410
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr "确定恢复 \"多个艺术家\" 环境到 <b>所有</b>音轨?"
 
-#: tags/tageditor.cpp:428
+#: tags/tageditor.cpp:460
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
 msgstr ""
 "获取\"专辑艺人\"标签并应用到\"艺术家(如果为空)\" 环境到 <b>所有</b> 音轨?"
 
-#: tags/tageditor.cpp:429
+#: tags/tageditor.cpp:461
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr "获取\"专辑艺人\"标签并应用到\"艺术家(如果为空)\" ?"
 
-#: tags/tageditor.cpp:430
+#: tags/tageditor.cpp:462
 #, fuzzy
 msgid "Album Artist from Artist"
 msgstr "专辑艺术家"
 
-#: tags/tageditor.cpp:463
+#: tags/tageditor.cpp:495
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
 msgstr "<b>所有</b>音轨的'标题', '艺术家', '专辑艺术家', '专辑' 的首字母大写?"
 
-#: tags/tageditor.cpp:496
+#: tags/tageditor.cpp:528
 msgid "Adjust the value of each track number by:"
 msgstr "调整每个音轨号按:"
 
-#: tags/tageditor.cpp:554
+#: tags/tageditor.cpp:586
 msgid "All tracks [modified]"
 msgstr "所有音轨 [已修改]"
 
-#: tags/tageditor.cpp:556
+#: tags/tageditor.cpp:588
 msgid "%1 [modified]"
 msgstr "%1 [已修改]"
 
-#: tags/tageditor.cpp:783
+#: tags/tageditor.cpp:827
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr ""
 
-#: tags/tageditor.cpp:784
+#: tags/tageditor.cpp:828
 #, fuzzy
 msgid "Rename Files"
 msgstr "重命名文件?"
 
-#: tags/trackorganiser.cpp:150
+#: tags/trackorganiser.cpp:164
 #, fuzzy
 msgid "Abort renaming of files?"
 msgstr "取消重命名?"
 
-#: tags/trackorganiser.cpp:263
+#: tags/trackorganiser.cpp:279
 #, fuzzy
 msgid "Source file does not exist!<br/>%1"
 msgstr "歌曲不存在!<hr/>%1"
 
-#: tags/trackorganiser.cpp:282
+#: tags/trackorganiser.cpp:298
 msgid "Destination file already exists!<br/>%1"
 msgstr "目标文件已存在!<br/>%1"
 
-#: tags/trackorganiser.cpp:304
+#: tags/trackorganiser.cpp:320
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "文件夹 <br/>%1 创建失败!"
 
-#: tags/trackorganiser.cpp:325
+#: tags/trackorganiser.cpp:341
 msgid "Failed to rename %1 to %2"
 msgstr "无法把 %1 重命名为 %2"
 
-#: widgets/coverwidget.cpp:267
+#: widgets/coverwidget.cpp:280
 #, fuzzy
 msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
 msgstr "<tr><td align=\"right\">文件:</td><td>%1</td></tr>"
 
-#: widgets/coverwidget.cpp:269
+#: widgets/coverwidget.cpp:282
 msgid ""
 "<tr><td align=\"right\"><b>Artist:</b></td><td>%1</td></tr><tr><td align="
 "\"right\"><b>Album:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Year:"
@@ -5728,41 +6147,45 @@ msgstr ""
 "\"right\"><b>专辑:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>年:</"
 "b></td><td>%3</td></tr>"
 
-#: widgets/genrecombo.cpp:54
+#: widgets/genrecombo.cpp:44
+msgid "Filter On Genre"
+msgstr ""
+
+#: widgets/genrecombo.cpp:66
 msgid "All Genres"
 msgstr "所有流派"
 
-#: widgets/groupedview.cpp:267
+#: widgets/groupedview.cpp:265
 #, fuzzy
 msgctxt "album (albumYear)"
 msgid "%1 (%2)"
 msgstr "%1 (%2)"
 
-#: widgets/groupedview.cpp:269
+#: widgets/groupedview.cpp:267
 #, fuzzy
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2"
 
-#: widgets/itemview.cpp:480
+#: widgets/itemview.cpp:561
 #, fuzzy
 msgid "Go Back"
 msgstr "后退"
 
-#: widgets/itemview.cpp:485
+#: widgets/itemview.cpp:566
 msgid "Go Home"
 msgstr ""
 
-#: widgets/menubutton.cpp:36
+#: widgets/menubutton.cpp:39
 msgid "Menu"
 msgstr ""
 
-#: widgets/searchwidget.cpp:62
+#: widgets/searchwidget.cpp:63
 #, fuzzy
 msgid "Search..."
 msgstr "搜索 %1 ..."
 
-#: widgets/searchwidget.cpp:66
+#: widgets/searchwidget.cpp:67
 msgid "Close Search Bar"
 msgstr ""
 
@@ -5775,42 +6198,38 @@ msgstr "连接到 %1"
 msgid "<b>NOT</b> logged into %1"
 msgstr ""
 
-#: widgets/songdialog.cpp:48
+#: widgets/songdialog.cpp:49
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
 "\" setting, and MPD's \"music_directory\" setting.</p>"
 msgstr ""
 
-#: widgets/songdialog.cpp:51
+#: widgets/songdialog.cpp:52
 msgid ""
 "<p>Cannot access song files!<br/><br/>Please check that the device is still "
 "attached.</p>"
 msgstr ""
 
-#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:115 widgets/volumeslider.cpp:230
+#: widgets/volumeslider.cpp:237
 msgid "Mute"
 msgstr "静音"
 
-#: widgets/volumeslider.cpp:199
+#: widgets/volumeslider.cpp:198
 #, fuzzy
 msgid "Muted"
 msgstr "静音"
 
-#: widgets/volumeslider.cpp:238
+#: widgets/volumeslider.cpp:237
 msgid "Unmute"
 msgstr ""
 
-#: widgets/volumeslider.cpp:276
-msgid "Volume Disabled"
-msgstr "静音"
-
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 #, fuzzy
 msgid "Volume %1% (Muted)"
 msgstr "音量 %1%"
 
-#: widgets/volumeslider.cpp:287
+#: widgets/volumeslider.cpp:284
 msgid "Volume %1%"
 msgstr "音量 %1%"
 
@@ -5914,6 +6333,119 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Episodes"
 msgstr "%1 项"
 
+#~ msgid "Transcoding failed.<br/><br/<hr/>%1"
+#~ msgstr "转码失败.<br/><br/<hr/>%1"
+
+#~ msgid "Failed to download track.<br/><br/<hr/>%1"
+#~ msgstr "无法下载音轨 <br/><br/<hr/>%1"
+
+#~ msgid "<b>Error</b><br/>"
+#~ msgstr "<b>错误</b><br/>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Artist:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Track:</td><td>%3</"
+#~ "td></tr>"
+#~ msgstr ""
+#~ "<table><tr><td align=\"right\">艺术家:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">专辑:</td><td>%2</td></tr><tr><td align=\"right\">音轨:</td><td>"
+#~ "%3</td></tr></table>"
+
+#~ msgid ""
+#~ "<tr><td align=\"right\">Source file:</td><td>%1</td></tr><tr><td align="
+#~ "\"right\">Destination file:</td><td>%2</td></tr>"
+#~ msgstr ""
+#~ "<tr><td align=\"right\">源文件:</td><td>%1</td></tr><tr><td align=\"right"
+#~ "\">目标文件:</td><td>%2</td></tr>"
+
+#~ msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
+#~ msgstr "<tr><td align=\"right\">文件:</td><td>%1</td></tr>"
+
+#~ msgid ""
+#~ "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
+#~ "i></tr>"
+#~ msgstr ""
+#~ "<tr><i><td align=\"right\"><i>剩余时间:</i></td><td><i>%5</i></td></i></"
+#~ "tr>"
+
+#~ msgctxt ""
+#~ "Google\n"
+#~ "width x height (file size)"
+#~ msgid ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+#~ msgstr ""
+#~ "Google\n"
+#~ "%1 x %2 (%3)"
+
+#~ msgid "Grouped by 'Album Artist'"
+#~ msgstr "'专辑艺术家'分组"
+
+#, fuzzy
+#~ msgid "Search Play Queue"
+#~ msgstr "搜索播放队列..."
+
+#~ msgid "Do not fadeout"
+#~ msgstr "不淡出"
+
+#~ msgid "Inactive"
+#~ msgstr "非交互"
+
+#~ msgctxt "Track Number (#)"
+#~ msgid "#"
+#~ msgstr "#"
+
+#, fuzzy
+#~ msgid "Search For Podcasts"
+#~ msgstr "搜索歌词"
+
+#~ msgid "Automatically lookup"
+#~ msgstr "自动查找"
+
+#, fuzzy
+#~ msgid "Use current album cover as background:"
+#~ msgstr "用封面作为歌词背景:"
+
+#~ msgid "Multiple artist albums:"
+#~ msgstr "多个艺术家专辑:"
+
+#~ msgid "Crossfading:"
+#~ msgstr "淡入淡出:"
+
+#~ msgid " seconds"
+#~ msgstr " 秒"
+
+#, fuzzy
+#~ msgid "Devices:"
+#~ msgstr "设备"
+
+#~ msgid "Icons Only"
+#~ msgstr "仅图标"
+
+#~ msgid "Style"
+#~ msgstr "视图"
+
+#~ msgid "Small Sidebar"
+#~ msgstr "小侧边栏"
+
+#~ msgid "Tabs On Side"
+#~ msgstr "标签在左侧"
+
+#~ msgid "Tabs On Top"
+#~ msgstr "标签在顶部"
+
+#~ msgid "Tabs On Bottom"
+#~ msgstr "标签在底部"
+
+#~ msgid "ON"
+#~ msgstr "开"
+
+#~ msgid "OFF"
+#~ msgstr "关"
+
+#~ msgid "Volume Disabled"
+#~ msgstr "静音"
+
 #~ msgid ""
 #~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
 #~ msgstr "下载音轨失败 - 重定向计数过多.<br/><br/<hr/>%1"
@@ -5944,9 +6476,6 @@ msgstr "%1 项"
 #~ msgid "Are you sure you wish to forget '%1'?"
 #~ msgstr "确定要清除历史 '%1'?"
 
-#~ msgid "Source: %1"
-#~ msgstr "源: %1"
-
 #~ msgid "Stop Immediately"
 #~ msgstr "立即停止"
 
@@ -5976,9 +6505,6 @@ msgstr "%1 项"
 #~ "已经有名为 '%1' 的设置!\n"
 #~ "覆盖吗?"
 
-#~ msgid "Set Cover"
-#~ msgstr "设定封面"
-
 #~ msgctxt ""
 #~ "<title> by <artist>\n"
 #~ "Failed\n"
@@ -6001,9 +6527,6 @@ msgstr "%1 项"
 #~ msgid "Failed to reconnect to %1"
 #~ msgstr "无法连接 %1"
 
-#~ msgid "Loaded"
-#~ msgstr "已加载"
-
 #~ msgid "Add Online Service"
 #~ msgstr "添加在线服务"
 
@@ -6160,15 +6683,6 @@ msgstr "%1 项"
 #~ msgid "%1, by %2"
 #~ msgstr "%2 - %1"
 
-#~ msgid ""
-#~ "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art. "
-#~ "If you also have write permissions to this folder (and it's sub-folders), "
-#~ "then Cantata will save any downloaded covers into the respective album "
-#~ "folder.</i>"
-#~ msgstr ""
-#~ "<i><b>注意:</b> '音乐文件夹' 将被用来查找专辑封面。如果有文件夹及子文件的"
-#~ "写入权限,Cantata 将自动下载专辑封面到专辑文件夹</i>"
-
 #~ msgid "(00:00)"
 #~ msgstr "(00:00)"
 
@@ -6181,9 +6695,6 @@ msgstr "%1 项"
 #~ msgid "Uptime:"
 #~ msgstr "更新时间:"
 
-#~ msgid "Time playing:"
-#~ msgstr "播放时间:"
-
 #~ msgid "Database"
 #~ msgstr "数据"
 
diff --git a/replaygain/CMakeLists.txt b/replaygain/CMakeLists.txt
index 2f65dab..a1b41ce 100644
--- a/replaygain/CMakeLists.txt
+++ b/replaygain/CMakeLists.txt
@@ -89,5 +89,8 @@ if (FFMPEG_FOUND OR MPG123_FOUND)
         target_link_libraries(cantata-replaygain ${SPEEXDSP_LIBRARIES})
     endif (SPEEXDSP_FOUND)
     target_link_libraries(cantata-replaygain ${QTCORELIBS})
+    if (UNIX AND NOT APPLE)
+        target_link_libraries(cantata-replaygain -lpthread)
+    endif (UNIX AND NOT APPLE)
 endif (FFMPEG_FOUND OR MPG123_FOUND)
 
diff --git a/replaygain/albumscanner.cpp b/replaygain/albumscanner.cpp
index 51d0d4e..7154143 100644
--- a/replaygain/albumscanner.cpp
+++ b/replaygain/albumscanner.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/replaygain/albumscanner.h b/replaygain/albumscanner.h
index f84b126..51105aa 100644
--- a/replaygain/albumscanner.h
+++ b/replaygain/albumscanner.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -36,7 +36,7 @@ class AlbumScanner : public Job
 
 public:
     struct Values {
-        Values() : ok(false) { }
+        Values() : gain(0.0), peak(0.0), ok(false) { }
         double gain;
         double peak;
         bool ok;
diff --git a/replaygain/ffmpeginput.cpp b/replaygain/ffmpeginput.cpp
index 55c84a3..7aa5e50 100644
--- a/replaygain/ffmpeginput.cpp
+++ b/replaygain/ffmpeginput.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This class is a C++/Qt version of input_ffmpeg.c from libebur128
@@ -292,7 +292,7 @@ size_t FfmpegInput::readFrames()
         return 0;
     }
 
-    size_t bufferPosition = 0, numberRead;
+    size_t bufferPosition=0, numberRead=0;
 
     while (handle->currentBytes < BUFFER_SIZE) {
         numberRead = readOnePacket();
diff --git a/replaygain/ffmpeginput.h b/replaygain/ffmpeginput.h
index 0c11ed1..fa830a8 100644
--- a/replaygain/ffmpeginput.h
+++ b/replaygain/ffmpeginput.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This class is a C++/Qt version of input_ffmpeg.c from libebur128
diff --git a/replaygain/input.h b/replaygain/input.h
index fd37a58..22d4cad 100644
--- a/replaygain/input.h
+++ b/replaygain/input.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This class is a C++/Qt version of input_mpg123.c from libebur128
diff --git a/replaygain/jobcontroller.cpp b/replaygain/jobcontroller.cpp
index 6d5f6b1..93bb95b 100644
--- a/replaygain/jobcontroller.cpp
+++ b/replaygain/jobcontroller.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/replaygain/jobcontroller.h b/replaygain/jobcontroller.h
index d2ec77e..67f5c37 100644
--- a/replaygain/jobcontroller.h
+++ b/replaygain/jobcontroller.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/replaygain/main.cpp b/replaygain/main.cpp
index b3826a8..97ae23b 100644
--- a/replaygain/main.cpp
+++ b/replaygain/main.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/replaygain/mpg123input.cpp b/replaygain/mpg123input.cpp
index 55bad18..3a614c9 100644
--- a/replaygain/mpg123input.cpp
+++ b/replaygain/mpg123input.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This class is a C++/Qt version of input_ffmpeg.c from libebur128
diff --git a/replaygain/mpg123input.h b/replaygain/mpg123input.h
index 66128be..ac04c02 100644
--- a/replaygain/mpg123input.h
+++ b/replaygain/mpg123input.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /* This class is a C++/Qt version of input_mpg123.c from libebur128
diff --git a/replaygain/replaygain.cpp b/replaygain/replaygain.cpp
index a58968e..303c5e6 100644
--- a/replaygain/replaygain.cpp
+++ b/replaygain/replaygain.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/replaygain/replaygain.h b/replaygain/replaygain.h
index 1ebf447..5f79b9c 100644
--- a/replaygain/replaygain.h
+++ b/replaygain/replaygain.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/replaygain/rgdialog.cpp b/replaygain/rgdialog.cpp
index b229a1e..08fae7a 100644
--- a/replaygain/rgdialog.cpp
+++ b/replaygain/rgdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -24,8 +24,8 @@
 #include "rgdialog.h"
 #ifdef ENABLE_DEVICES_SUPPORT
 #include "device.h"
-#endif
 #include "devicesmodel.h"
+#endif
 #include "settings.h"
 #include "tags.h"
 #include "tagreader.h"
@@ -71,11 +71,6 @@ enum Columns
 
 static int iCount=0;
 
-static inline QString createAlbumName(const Song &s)
-{
-    return s.albumArtist()+QLatin1String(" - ")+s.album;
-}
-
 int RgDialog::instanceCount()
 {
     return iCount;
@@ -334,7 +329,7 @@ void RgDialog::createScanner(const QList<int> &indexes)
 {
     QMap<int, QString> fileMap;
     foreach (int i, indexes) {
-        fileMap[i]=base+origSongs.at(i).file;
+        fileMap[i]=base+origSongs.at(i).filePath();
     }
 
     AlbumScanner *s=new AlbumScanner(fileMap);
@@ -409,17 +404,18 @@ bool RgDialog::saveTags()
     QMap<int, Tags::ReplayGain>::ConstIterator end=tagsToSave.constEnd();
 
     for (; it!=end; ++it) {
-        switch (Tags::updateReplaygain(base+origSongs.at(it.key()).file, it.value())) {
+        QString filePath=origSongs.at(it.key()).filePath();
+        switch (Tags::updateReplaygain(base+filePath, it.value())) {
         case Tags::Update_Failed:
-            failed.append(origSongs.at(it.key()).file);
+            failed.append(filePath);
             break;
         #ifdef ENABLE_EXTERNAL_TAGS
         case Tags::Update_Timedout:
-            failed.append(i18nc("filename (Timeout)", "%1 (Timeout)", origSongs.at(it.key()).file));
+            failed.append(i18nc("filename (Timeout)", "%1 (Timeout)", filePath));
             someTimedout=true;
             break;
         case Tags::Update_BadFile:
-            failed.append(i18nc("filename (Corrupt tags?)", "%1 (Corrupt tags?)", origSongs.at(it.key()).file));
+            failed.append(i18nc("filename (Corrupt tags?)", "%1 (Corrupt tags?)", filePath));
             break;
         #endif
         default:
diff --git a/replaygain/rgdialog.h b/replaygain/rgdialog.h
index 9bce912..5499763 100644
--- a/replaygain/rgdialog.h
+++ b/replaygain/rgdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/replaygain/tagreader.cpp b/replaygain/tagreader.cpp
index 6ea8ed9..86f0066 100644
--- a/replaygain/tagreader.cpp
+++ b/replaygain/tagreader.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/replaygain/tagreader.h b/replaygain/tagreader.h
index d9b9059..434be55 100644
--- a/replaygain/tagreader.h
+++ b/replaygain/tagreader.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/replaygain/trackscanner.cpp b/replaygain/trackscanner.cpp
index b955652..17879fd 100644
--- a/replaygain/trackscanner.cpp
+++ b/replaygain/trackscanner.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -74,7 +74,7 @@ TrackScanner::Data TrackScanner::global(const QList<TrackScanner *> &scanners)
 }
 
 #ifdef EBUR128_USE_SPEEX_RESAMPLER
-static int constEbur128Mode=EBUR128_MODE_M|EBUR128_MODE_I|EBUR128_MODE_TRUE_PEAK);
+static int constEbur128Mode=EBUR128_MODE_M|EBUR128_MODE_I|EBUR128_MODE_TRUE_PEAK;
 #else
 static int constEbur128Mode=EBUR128_MODE_M|EBUR128_MODE_I|EBUR128_MODE_SAMPLE_PEAK;
 #endif
@@ -193,7 +193,7 @@ void TrackScanner::run()
 //         if (result) abort();
 //     }
 
-    if ((state->mode & EBUR128_MODE_SAMPLE_PEAK) == EBUR128_MODE_SAMPLE_PEAK) {
+    if (EBUR128_MODE_SAMPLE_PEAK==(state->mode & EBUR128_MODE_SAMPLE_PEAK)) {
         for (unsigned i = 0; i < state->channels; ++i) {
             double sp;
             ebur128_sample_peak(state, i, &sp);
@@ -203,7 +203,7 @@ void TrackScanner::run()
         }
     }
     #ifdef EBUR128_USE_SPEEX_RESAMPLER
-    if ((state->mode & EBUR128_MODE_TRUE_PEAK) == EBUR128_MODE_TRUE_PEAK) {
+    if (EBUR128_MODE_TRUE_PEAK==(state->mode & EBUR128_MODE_TRUE_PEAK)) {
         for (unsigned i = 0; i < state->channels; ++i) {
             double tp;
             ebur128_true_peak(state, i, &tp);
diff --git a/replaygain/trackscanner.h b/replaygain/trackscanner.h
index 6ceda50..f1837b7 100644
--- a/replaygain/trackscanner.h
+++ b/replaygain/trackscanner.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/streams/digitallyimportedsettings.cpp b/streams/digitallyimportedsettings.cpp
index 0300e29..f5fa752 100644
--- a/streams/digitallyimportedsettings.cpp
+++ b/streams/digitallyimportedsettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -45,9 +45,10 @@ DigitallyImportedSettings::DigitallyImportedSettings(QWidget *parent)
     connect(loginButton, SIGNAL(clicked()), this, SLOT(login()));
     connect(DigitallyImported::self(), SIGNAL(loginStatus(bool,QString)), SLOT(loginStatus(bool,QString)));
 
-    adjustSize();
     int h=fontMetrics().height();
-    resize(h*35, height());
+    user->setMinimumWidth(h*20);
+    adjustSize();
+    setMinimumSize(size());
 }
 
 void DigitallyImportedSettings::show()
diff --git a/streams/digitallyimportedsettings.h b/streams/digitallyimportedsettings.h
index 517f5d4..79999da 100644
--- a/streams/digitallyimportedsettings.h
+++ b/streams/digitallyimportedsettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/streams/icons/favourites.svg b/streams/icons/favourites.svg
index 02fd481..6d76829 100644
--- a/streams/icons/favourites.svg
+++ b/streams/icons/favourites.svg
@@ -1,13 +1,4 @@
 <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" viewBox="0 0 128 128" xmlns:dc="http://purl.org/dc/elements/1.1/">
-<metadata>
-<rdf:RDF>
-<cc:Work rdf:about="">
-<dc:format>image/svg+xml</dc:format>
-<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
-<dc:title/>
-</cc:Work>
-</rdf:RDF>
-</metadata>
 <defs>
 <filter id="filter45478">
 <feGaussianBlur stdDeviation="1.031"/>
diff --git a/streams/icons/rockradio.svg b/streams/icons/rockradio.svg
index fd9ce7a..efd9840 100644
--- a/streams/icons/rockradio.svg
+++ b/streams/icons/rockradio.svg
@@ -1,13 +1,4 @@
 <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" viewBox="0 0 640 640" xmlns:dc="http://purl.org/dc/elements/1.1/">
-<metadata>
-<rdf:RDF>
-<cc:Work rdf:about="">
-<dc:format>image/svg+xml</dc:format>
-<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
-<dc:title/>
-</cc:Work>
-</rdf:RDF>
-</metadata>
 <g transform="matrix(1.0325 0 0 1.0468 -.02626 -30.113)" fill-rule="evenodd">
 <path stroke="#000" stroke-width="1.3043" d="m304.3 281.82c-14.273 0.8446-28.966 2.6033-36.38-11.482-13.389-40.37 16.79-48.675 20.745-72.394 3.3726-20.226-14.914-31.115-28.906-26.857-54.845 16.692-67.967 83.345-96.78 130.48 0.001 0.0238-8.4437 13.733-45.469 25.223-51.845 15.97-90.151 43.017-99.978 57.525s-35.601 70.088 10.585 132.43c49.177 66.378 108.61 122.9 144.26 125.43 40.028 2.8385 78.52-16.219 110.25-104 11.275-44.736 39.751-61.626 70.575-77.324 25.822-13.15 62.081-27.913 43.644-73.313-0.5145-1.2669-12.146-12.981-33.023 0.3924-23.25 14.893-44.822 8.8268-54.466-17.48l-5.0651-88.632z"/>
 <path stroke="#000" stroke-width="1.2962" d="m387.63 400.23c-23.138-1.7917-45.609 32.925-76.431-0.9114-21.891-35.183-24.892-70.762-42.169-100.83-4.1406-7.2054-14.626-7.0216-18.106 1.4554-14.86 20.8-24.391 46.564-50.082 57.275-15.579 10.948-35.348 13.246-51.042 23.18-32.759 20.735-26.404 36.308-26.768 48.53 0.161 6.3311 5.4795 13.699 11.181 21.143 26.619 30.912 64.156 55.221 79.845 92.744 6.177 20.305 0.9298 53.03 9.8008 60.696 5.6871 4.9148 20.246-5.8265 28.232-20.632 14.418-26.732 23.142-55.195 37.722-87.641 7.7751-17.302 9.8348-25.685 46.136-39.45 11.588-2.5727 26.358-10.012 38.28-22.133 22.788-23.169 18.103-33.068 13.401-33.432z" fill="#fff"/>
diff --git a/streams/icons/shoutcast.svg b/streams/icons/shoutcast.svg
index 8b59039..0737232 100644
--- a/streams/icons/shoutcast.svg
+++ b/streams/icons/shoutcast.svg
@@ -1,13 +1,4 @@
 <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" viewBox="0 0 256 256" xmlns:dc="http://purl.org/dc/elements/1.1/">
-<metadata>
-<rdf:RDF>
-<cc:Work rdf:about="">
-<dc:format>image/svg+xml</dc:format>
-<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
-<dc:title/>
-</cc:Work>
-</rdf:RDF>
-</metadata>
 <g fill="#f8b600" transform="matrix(6.6232 0 0 5.1914 15.767 55.668)" fill-rule="evenodd">
 <path d="m0 38.255 28.984-18.506-0.0106-5.2205-3.8994-1.3654 9.198-9.2948v-3.8684l-27.72 15.861v5.2659h5.2973l-11.843 11.966-0.0066 5.1759v-0.0134z"/>
 </g>
diff --git a/streams/streamdialog.cpp b/streams/streamdialog.cpp
index 1f411b8..d25b8fb 100644
--- a/streams/streamdialog.cpp
+++ b/streams/streamdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -33,7 +33,8 @@
 #include "icons.h"
 #include "mpdconnection.h"
 #include "buddylabel.h"
-
+#include "config.h"
+    
 class NameValidator : public QValidator
 {
     public:
@@ -55,14 +56,12 @@ StreamDialog::StreamDialog(QWidget *parent, bool addToPlayQueue)
     QFormLayout *layout = new QFormLayout(wid);
 
     layout->setMargin(0);
+    urlEntry = new LineEdit(wid);
     if (addToPlayQueue) {
-        urlEntry = new LineEdit(wid);
         saveCombo=new QComboBox(wid);
-        nameEntry = new LineEdit(wid);
-    } else {
-        nameEntry = new LineEdit(wid);
-        urlEntry = new LineEdit(wid);
     }
+    nameEntry = new LineEdit(wid);
+
     nameEntry->setValidator(new NameValidator(this));
     statusText = new QLabel(this);
 
@@ -71,24 +70,19 @@ StreamDialog::StreamDialog(QWidget *parent, bool addToPlayQueue)
     BuddyLabel *urlLabel=new BuddyLabel(i18n("URL:"), wid, urlEntry);
 
     int row=0;
-
+    layout->setWidget(row, QFormLayout::LabelRole, urlLabel);
+    layout->setWidget(row++, QFormLayout::FieldRole, urlEntry);
     if (addToPlayQueue) {
         saveCombo->addItem(i18n("Just add to play queue, do not save"));
         saveCombo->addItem(i18n("Add to play queue, and save to favorites"));
         saveCombo->setCurrentIndex(0);
         saveCombo->setEnabled(StreamsModel::self()->isFavoritesWritable());
-        layout->setWidget(row, QFormLayout::LabelRole, urlLabel);
-        layout->setWidget(row++, QFormLayout::FieldRole, urlEntry);
         layout->setWidget(row++, QFormLayout::FieldRole, saveCombo);
         connect(saveCombo, SIGNAL(activated(int)), SLOT(saveComboChanged()));
         setWidgetVisiblity();
     }
     layout->setWidget(row, QFormLayout::LabelRole, nameLabel);
     layout->setWidget(row++, QFormLayout::FieldRole, nameEntry);
-    if (!addToPlayQueue) {
-        layout->setWidget(row, QFormLayout::LabelRole, urlLabel);
-        layout->setWidget(row++, QFormLayout::FieldRole, urlEntry);
-    }
 
     layout->setWidget(row++, QFormLayout::SpanningRole, statusText);
     setCaption(i18n("Add Stream"));
@@ -97,11 +91,7 @@ StreamDialog::StreamDialog(QWidget *parent, bool addToPlayQueue)
     enableButton(Ok, false);
     connect(nameEntry, SIGNAL(textChanged(const QString &)), SLOT(changed()));
     connect(urlEntry, SIGNAL(textChanged(const QString &)), SLOT(changed()));
-    if (addToPlayQueue) {
-        urlEntry->setFocus();
-    } else {
-        nameEntry->setFocus();
-    }
+    urlEntry->setFocus();
     resize(400, 100);
 }
 
diff --git a/streams/streamdialog.h b/streams/streamdialog.h
index aa52f7d..f921b28 100644
--- a/streams/streamdialog.h
+++ b/streams/streamdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/streams/streamfetcher.cpp b/streams/streamfetcher.cpp
index a1a9c94..b17ac1c 100644
--- a/streams/streamfetcher.cpp
+++ b/streams/streamfetcher.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -163,6 +163,10 @@ static QString parse(const QByteArray &data)
 StreamFetcher::StreamFetcher(QObject *p)
     : QObject(p)
     , job(0)
+    , row(0)
+    , replacePlayQueue(true)
+    , prio(0)
+    , redirects(0)
 {
 }
 
@@ -234,27 +238,26 @@ void StreamFetcher::cancel()
     row=0;
     data.clear();
     current=QString();
-    if (job) {
-        disconnect(job, SIGNAL(readyRead()), this, SLOT(dataReady()));
-        disconnect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
-        job->abort();
-        job->deleteLater();
-    }
-    job=0;
+    cancelJob();
     emit status(QString());
 }
 
 void StreamFetcher::dataReady()
 {
+    NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
+    if (reply!=job) {
+        return;
+    }
+
     data+=job->readAll();
 
     if (data.count()>constMaxData) {
         NetworkJob *thisJob=job;
-        disconnect(thisJob, SIGNAL(readyRead()), this, SLOT(dataReady()));
-        disconnect(thisJob, SIGNAL(finished()), this, SLOT(jobFinished()));
         jobFinished(thisJob);
-        thisJob->abort();
-        thisJob->deleteLater();
+        // If jobFinished did not redirect, then we need to ensure job is cancelled.
+        if (thisJob==job) {
+            cancelJob();
+        }
     }
 }
 
@@ -281,6 +284,7 @@ void StreamFetcher::jobFinished(NetworkJob *reply)
                 current=u;
                 DBUG << "semi-redirect" << current;
                 data.clear();
+                cancelJob();
                 job=NetworkAccessManager::self()->get(u, constTimeout);
                 connect(job, SIGNAL(readyRead()), this, SLOT(dataReady()));
                 connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
@@ -300,3 +304,13 @@ void StreamFetcher::jobFinished(NetworkJob *reply)
     }
     reply->deleteLater();
 }
+
+void StreamFetcher::cancelJob()
+{
+    if (job) {
+        disconnect(job, SIGNAL(readyRead()), this, SLOT(dataReady()));
+        disconnect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+        job->cancelAndDelete();
+        job=0;
+    }
+}
diff --git a/streams/streamfetcher.h b/streams/streamfetcher.h
index b2737dc..1e4995b 100644
--- a/streams/streamfetcher.h
+++ b/streams/streamfetcher.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -59,6 +59,7 @@ private Q_SLOTS:
 
 private:
     void jobFinished(NetworkJob *reply);
+    void cancelJob();
 
 private:
     NetworkJob *job;
diff --git a/streams/streamspage.cpp b/streams/streamspage.cpp
index d024257..2f182de 100644
--- a/streams/streamspage.cpp
+++ b/streams/streamspage.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -113,6 +113,7 @@ StreamsPage::StreamsPage(QWidget *p)
     streamsProxy.setSourceModel(StreamsModel::self());
     view->setModel(&streamsProxy);
     view->setDeleteAction(StdActions::self()->removeAction);
+    view->setSearchResetLevel(1);
 
     searchView->setUniformRowHeights(true);
     searchView->addAction(StdActions::self()->replacePlayQueueAction);
@@ -165,8 +166,8 @@ void StreamsPage::refresh()
 {
     if (enabled) {
         checkWritable();
-        view->setLevel(0);
-        searchView->setLevel(0);
+        view->goToTop();
+        searchView->goToTop();
         StreamsModel::self()->reloadFavourites();
         exportAction->setEnabled(StreamsModel::self()->rowCount()>0);
         view->expand(proxy->mapFromSource(StreamsModel::self()->favouritesIndex()), true);
@@ -178,8 +179,10 @@ void StreamsPage::save()
     StreamsModel::self()->saveFavourites(true);
 }
 
-void StreamsPage::addSelectionToPlaylist(bool replace, quint8 priorty)
+void StreamsPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty, bool randomAlbums)
 {
+    Q_UNUSED(name)
+    Q_UNUSED(randomAlbums)
     addItemsToPlayQueue(itemView()->selectedIndexes(), replace, priorty);
 }
 
diff --git a/streams/streamspage.h b/streams/streamspage.h
index 9cf0823..98b6d3d 100644
--- a/streams/streamspage.h
+++ b/streams/streamspage.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -28,12 +28,13 @@
 #include "streamsproxymodel.h"
 #include "streamsearchmodel.h"
 #include "streamsmodel.h"
+#include "page.h"
 
 class Action;
 class QAction;
 class QNetworkReply;
 
-class StreamsPage : public QWidget, public Ui::StreamsPage
+class StreamsPage : public QWidget, public Ui::StreamsPage, public Page
 {
     Q_OBJECT
 
@@ -44,7 +45,7 @@ public:
     void setEnabled(bool e);
     bool isEnabled() const { return enabled; }
     void save();
-    void addSelectionToPlaylist(bool replace, quint8 priorty=0);
+    void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0, bool randomAlbums=false);
     void setView(int v) { view->setMode((ItemView::Mode)v); searchView->setMode((ItemView::Mode)v); }
     void focusSearch() { view->focusSearch(); searchView->focusSearch(); }
     void goBack() { itemView()->backActivated(); }
diff --git a/streams/streamssettings.cpp b/streams/streamssettings.cpp
index aeafce6..e1177c9 100644
--- a/streams/streamssettings.cpp
+++ b/streams/streamssettings.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/streams/streamssettings.h b/streams/streamssettings.h
index 5d59a9c..5137b9b 100644
--- a/streams/streamssettings.h
+++ b/streams/streamssettings.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/streams/streamssettings.ui b/streams/streamssettings.ui
index 4206197..e745c29 100644
--- a/streams/streamssettings.ui
+++ b/streams/streamssettings.ui
@@ -9,7 +9,7 @@
    <item row="0" column="0" colspan="4">
     <widget class="QLabel" name="label">
      <property name="text">
-      <string>The following is a list of the top-level stream categories, to hide a category simply un-check its entry in this list.</string>
+      <string>Use the checkboxes below to configure the list of active providers.</string>
      </property>
      <property name="wordWrap">
       <bool>true</bool>
diff --git a/streams/tar.cpp b/streams/tar.cpp
index e826ca4..88e0a65 100644
--- a/streams/tar.cpp
+++ b/streams/tar.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -27,6 +27,7 @@
 Tar::Tar(const QString &fileName)
     : file(fileName)
     , compressor(0)
+    , dev(0)
 {
 }
 
@@ -63,7 +64,7 @@ static const qint64 constHeaderLen=512;
 
 static qint64 roundUp(qint64 sz)
 {
-    return ((sz/constHeaderLen)*constHeaderLen)+(sz%constHeaderLen ? constHeaderLen : 0);
+    return ((sz/constHeaderLen)*constHeaderLen)+((sz%constHeaderLen) ? constHeaderLen : 0);
 }
 
 struct TarHeader
@@ -78,9 +79,7 @@ static unsigned int octStrToInt(char *ch, unsigned int size)
 {
     unsigned int val = 0;
     while (size > 0){
-        if (ch) {
-            val = (val * 8) + (*ch - '0');
-        }
+        val = (val * 8) + (*ch - '0');
         ch++;
         size--;
     }
diff --git a/streams/tar.h b/streams/tar.h
index f59be3b..d6ce9bf 100644
--- a/streams/tar.h
+++ b/streams/tar.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/CMakeLists.txt b/support/CMakeLists.txt
index 89c7268..051f232 100644
--- a/support/CMakeLists.txt
+++ b/support/CMakeLists.txt
@@ -1,45 +1,49 @@
 set(SUPPORT_SRCS action.cpp actioncollection.cpp fancytabwidget.cpp messagewidget.cpp icon.cpp buddylabel.cpp
     lineedit.cpp gtkstyle.cpp utils.cpp spinner.cpp messagebox.cpp inputdialog.cpp thread.cpp squeezedtextlabel.cpp)
 
-set(SUPPORT_MOC_HDRS action.h actioncollection.h fancytabwidget.h messagewidget.h inputdialog.h thread.h)
+set(SUPPORT_MOC_HDRS action.h actioncollection.h fancytabwidget.h messagewidget.h inputdialog.h thread.h pagewidget.h)
 
 if (NOT WIN32)
-    set(SUPPORT_SRCS ${SUPPORT_SRCS} onoffbutton.cpp spinbox.cpp windowmanager.cpp gtkproxystyle.cpp combobox.cpp shortcuthandler.cpp)
-    set(SUPPORT_MOC_HDRS ${SUPPORT_MOC_HDRS} spinbox.h windowmanager.h gtkproxystyle.h shortcuthandler.h)
-    if (ENABLE_OVERLAYSCROLLBARS)
-        add_definitions(-DENABLE_OVERLAYSCROLLBARS)
-        set(SUPPORT_SRCS ${SUPPORT_SRCS} osthumb.cpp)
-        set(SUPPORT_MOC_HDRS ${SUPPORT_MOC_HDRS} osthumb.h)
-    endif (ENABLE_OVERLAYSCROLLBARS)
+    set(SUPPORT_SRCS ${SUPPORT_SRCS} windowmanager.cpp gtkproxystyle.cpp combobox.cpp shortcuthandler.cpp)
+    set(SUPPORT_MOC_HDRS ${SUPPORT_MOC_HDRS} windowmanager.h gtkproxystyle.h shortcuthandler.h)
     add_subdirectory(themes)
 endif (NOT WIN32)
 
-if (ENABLE_KDE_SUPPORT )
+if (ENABLE_KDE_SUPPORT)
+    include_directories(${KDE4_INCLUDES})
     # macro_ensure_version("4.7.0" ${KDE_VERSION} KDE_VERSION_47)
     # if (NOT KDE_VERSION_47)
-        set(SUPPORT_SRCS ${SUPPORT_SRCS} kmessagewidget.cpp )
-        set(SUPPORT_MOC_HDRS ${SUPPORT_MOC_HDRS} kmessagewidget.h )
+        set(SUPPORT_SRCS ${SUPPORT_SRCS} kmessagewidget.cpp)
+        set(SUPPORT_MOC_HDRS ${SUPPORT_MOC_HDRS} kmessagewidget.h)
     # endif (NOT KDE_VERSION_47)
-    kde4_add_ui_files(SUPPORT_UI_HDRS ${SUPPORT_UIS} )
+    kde4_add_ui_files(SUPPORT_UI_HDRS ${SUPPORT_UIS})
     set(SUPPORT_SRCS ${SUPPORT_SRCS} dialog.cpp)
 else (ENABLE_KDE_SUPPORT)
     set(SUPPORT_SRCS ${SUPPORT_SRCS} pathrequester.cpp kmessagewidget.cpp dialog.cpp pagewidget.cpp shortcutsmodel.cpp
         shortcutssettingswidget.cpp keysequencewidget.cpp acceleratormanager.cpp proxystyle.cpp urllabel.cpp)
-    set(SUPPORT_MOC_HDRS ${SUPPORT_MOC_HDRS} pathrequester.h lineedit.h kmessagewidget.h urllabel.h
+    set(SUPPORT_MOC_HDRS ${SUPPORT_MOC_HDRS} pathrequester.h kmessagewidget.h urllabel.h
          dialog.h shortcutsmodel.h shortcutssettingswidget.h keysequencewidget.h spinner.h acceleratormanager_private.h)
-    set(SUPPORT_UIS shortcutssettingswidget.ui )
+    set(SUPPORT_UIS shortcutssettingswidget.ui)
     if (ENABLE_QT5)
-        qt5_wrap_ui(SUPPORT_UI_HDRS ${SUPPORT_UIS} )
+        if (Qt5Gui_VERSION_MAJOR LESS 5 OR Qt5Gui_VERSION_MINOR LESS 2)
+            set(SUPPORT_MOC_HDRS ${SUPPORT_MOC_HDRS} lineedit.h)
+        endif (Qt5Gui_VERSION_MAJOR LESS 5 OR Qt5Gui_VERSION_MINOR LESS 2)
+        qt5_wrap_ui(SUPPORT_UI_HDRS ${SUPPORT_UIS})
     else (ENABLE_QT5)
-        qt4_wrap_ui(SUPPORT_UI_HDRS ${SUPPORT_UIS} )
+        set(SUPPORT_MOC_HDRS ${SUPPORT_MOC_HDRS} lineedit.h)
+        qt4_wrap_ui(SUPPORT_UI_HDRS ${SUPPORT_UIS})
     endif (ENABLE_QT5)
 endif  (ENABLE_KDE_SUPPORT)
 
 if (ENABLE_QT5)
-    qt5_wrap_cpp(SUPPORT_MOC_SRCS ${SUPPORT_MOC_HDRS} )
+    qt5_wrap_cpp(SUPPORT_MOC_SRCS ${SUPPORT_MOC_HDRS})
 else (ENABLE_QT5)
-    qt4_wrap_cpp(SUPPORT_MOC_SRCS ${SUPPORT_MOC_HDRS} )
+    qt4_wrap_cpp(SUPPORT_MOC_SRCS ${SUPPORT_MOC_HDRS})
 endif (ENABLE_QT5)
 
-include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${QTINCLUDES} )
-add_library(support STATIC ${SUPPORT_MOC_SRCS} ${SUPPORT_SRCS} ${SUPPORT_UI_HDRS} )
+include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${QTINCLUDES})
+add_library(support STATIC ${SUPPORT_MOC_SRCS} ${SUPPORT_SRCS} ${SUPPORT_UI_HDRS})
+
+if (X11_FOUND)
+    target_link_libraries(support ${X11_LIBRARIES})
+endif (X11_FOUND)
diff --git a/support/buddylabel.cpp b/support/buddylabel.cpp
index 4836fa6..4ee946a 100644
--- a/support/buddylabel.cpp
+++ b/support/buddylabel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -22,7 +22,6 @@
  */
 
 #include "buddylabel.h"
-#include "spinbox.h"
 #ifndef ENABLE_KDE_SUPPORT
 #include "pathrequester.h"
 #endif
@@ -68,13 +67,6 @@ void BuddyLabel::mouseReleaseEvent(QMouseEvent *)
             return;
         }
         #endif
-        #ifndef Q_WS_WIN
-        SpinBox *sb=qobject_cast<SpinBox*>(buddy());
-        if (sb) {
-            sb->setFocus();
-            return;
-        }
-        #endif
 
         buddy()->setFocus();
 
@@ -95,3 +87,4 @@ void BuddyLabel::mouseReleaseEvent(QMouseEvent *)
         }
     }
 }
+
diff --git a/support/buddylabel.h b/support/buddylabel.h
index 87a5fd9..407ffa3 100644
--- a/support/buddylabel.h
+++ b/support/buddylabel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/capacitybar.h b/support/capacitybar.h
index c6afcb0..3bad067 100644
--- a/support/capacitybar.h
+++ b/support/capacitybar.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/combobox.cpp b/support/combobox.cpp
index 7e8eff0..201302c 100644
--- a/support/combobox.cpp
+++ b/support/combobox.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -102,7 +102,7 @@ void ComboBox::showPopup()
         // Hide scrollers - these look ugly...
         foreach (QObject *c, view()->parentWidget()->children()) {
             if (0==qstrcmp("QComboBoxPrivateScroller", c->metaObject()->className())) {
-                ((QWidget *)c)->setMaximumHeight(0);
+                static_cast<QWidget *>(c)->setMaximumHeight(0);
             }
         }
         #endif
diff --git a/support/combobox.h b/support/combobox.h
index 33d9a51..bcbd0ec 100644
--- a/support/combobox.h
+++ b/support/combobox.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -44,8 +44,6 @@ public:
     virtual ~ComboBox() { }
 
     void setEditable(bool editable);
-
-private:
     void showPopup();
     void hidePopup();
 
diff --git a/support/dialog.cpp b/support/dialog.cpp
index 76d6e76..b710718 100644
--- a/support/dialog.cpp
+++ b/support/dialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -23,22 +23,6 @@
 
 #include "dialog.h"
 
-#ifdef ENABLE_OVERLAYSCROLLBARS
-int Dialog::exec()
-{
-    QWidget *win=parentWidget() ? parentWidget()->window() : 0;
-    bool wasGl=win ? win->testAttribute(Qt::WA_GroupLeader) : false;
-    if (win && !wasGl) {
-        win->setAttribute(Qt::WA_GroupLeader, true);
-    }
-    int rv=QDialog::exec();
-    if (win && !wasGl) {
-        win->setAttribute(Qt::WA_GroupLeader, false);
-    }
-    return rv;
-}
-#endif
-
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KGlobal>
 #include <KDE/KConfig>
diff --git a/support/dialog.h b/support/dialog.h
index b0e182d..fe108e6 100644
--- a/support/dialog.h
+++ b/support/dialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -32,9 +32,6 @@
 struct Dialog : public KDialog {
     Dialog(QWidget *parent, const QString &name=QString(), const QSize &defSize=QSize());
     virtual ~Dialog();
-    #ifdef ENABLE_OVERLAYSCROLLBARS
-    int exec();
-    #endif
 
     const QSize & configuredSize() const { return cfgSize; }
     void resize(int w, int h) { resize(QSize(w, h)); }
@@ -151,10 +148,6 @@ public:
     virtual void slotButtonClicked(int button);
     QWidget * mainWidget() { return mw; }
 
-    #ifdef ENABLE_OVERLAYSCROLLBARS
-    int exec();
-    #endif
-
     const QSize & configuredSize() const { return cfgSize; }
     void resize(int w, int h) { resize(QSize(w, h)); }
     void resize(const QSize &sz);
diff --git a/support/fancytabwidget.cpp b/support/fancytabwidget.cpp
index 50f132e..d59d734 100644
--- a/support/fancytabwidget.cpp
+++ b/support/fancytabwidget.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  */
 
 /**************************************************************************
@@ -40,7 +40,6 @@
 #include "action.h"
 #include "utils.h"
 #include <QHBoxLayout>
-#include <QMenu>
 #include <QMouseEvent>
 #include <QPainter>
 #include <QSplitter>
@@ -53,6 +52,7 @@
 #include <QAnimationGroup>
 #include <QPropertyAnimation>
 #include <QSignalMapper>
+#include <QMenu>
 
 static inline int sidebarSpacing(bool withText)
 {
@@ -94,6 +94,11 @@ void FancyTabWidget::setup()
     }
 }
 
+int FancyTabWidget::iconSize(bool large)
+{
+    return large ? largeIconSize : smallIconSize;
+}
+
 #if 0
 static QPainterPath createPath(const QRect &rect, double radius)
 {
@@ -134,9 +139,26 @@ static void drawIcon(const QIcon &icon, const QRect &r, QPainter *p, const QSize
     p->drawPixmap(r.x()+(r.width()-px.width())/2.0, r.y()+(r.height()-px.height())/2.0, px.width(), px.height(), px);
 }
 
-void FancyTabProxyStyle::drawControl(
-    ControlElement element, const QStyleOption* option,
-    QPainter* p, const QWidget* widget) const {
+void FancyTabProxyStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *p, const QWidget *widget) const
+{
+    if (PE_FrameTabBarBase!=element) {
+        QProxyStyle::drawPrimitive(element, option, p, widget);
+    }
+}
+
+int FancyTabProxyStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const
+{
+    if (SH_TabBar_Alignment==hint && widget && qobject_cast<const QTabBar *>(widget)) {
+        QTabBar::Shape shape=static_cast<const QTabBar *>(widget)->shape();
+        if (QTabBar::RoundedNorth==shape || QTabBar::RoundedSouth==shape) {
+            return (int)Qt::AlignCenter;
+        }
+    }
+    return QProxyStyle::styleHint(hint, option, widget, returnData);
+}
+
+void FancyTabProxyStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *p, const QWidget *widget) const
+{
 
   const QStyleOptionTabV3* v_opt = qstyleoption_cast<const QStyleOptionTabV3*>(option);
 
@@ -592,17 +614,16 @@ void FancyTabBar::setCurrentIndex(int index) {
 //////
 // FancyTabWidget
 //////
-
 FancyTabWidget::FancyTabWidget(QWidget* parent, bool allowContext, bool drawBorder)
   : QWidget(parent),
-    mode_(Mode_None),
+    style_(0),
     tab_bar_(NULL),
     stack_(new QStackedWidget(this)),
     side_widget_(new QWidget),
     side_layout_(new QVBoxLayout),
     top_layout_(new QVBoxLayout),
 //     use_background_(false),
-    menu_(NULL),
+    menu_(0),
     proxy_style_(new FancyTabProxyStyle),
     allowContext_(allowContext),
     drawBorder_(drawBorder)
@@ -624,6 +645,7 @@ FancyTabWidget::FancyTabWidget(QWidget* parent, bool allowContext, bool drawBord
   main_layout->addWidget(side_widget_);
   main_layout->addLayout(top_layout_);
   setLayout(main_layout);
+  setStyle(Side|Large);
 }
 
 void FancyTabWidget::AddTab(QWidget* tab, const QIcon& icon, const QString& label, const QString &tt, bool enabled) {
@@ -632,36 +654,36 @@ void FancyTabWidget::AddTab(QWidget* tab, const QIcon& icon, const QString& labe
   setMinimumWidth(128);
 }
 
-void FancyTabWidget::InsertTab(QWidget* tab, const QIcon& icon, const QString& label, const QString &tt, bool enabled) {
-  stack_->insertWidget(0, tab);
-  items_.prepend(Item(icon, label, tt, enabled));
-  setMinimumWidth(128);
-  Recreate();
-}
-
-void FancyTabWidget::RemoveTab(QWidget *tab)
-{
-  int idx=stack_->indexOf(tab);
-  if (idx>-1 && idx<items_.count()) {
-    stack_->removeWidget(tab);
-    items_.takeAt(idx);
-    Recreate();
-  }
-}
-
-int FancyTabWidget::IndexOf(QWidget *tab)
-{
-  return stack_->indexOf(tab);
-}
-
-void FancyTabWidget::AddSpacer(int size) {
-  items_ << Item(size);
-}
-
-void FancyTabWidget::SetBackgroundPixmap(const QPixmap& pixmap) {
-  background_pixmap_ = pixmap;
-  update();
-}
+//void FancyTabWidget::InsertTab(QWidget* tab, const QIcon& icon, const QString& label, const QString &tt, bool enabled) {
+//  stack_->insertWidget(0, tab);
+//  items_.prepend(Item(icon, label, tt, enabled));
+//  setMinimumWidth(128);
+//  Recreate();
+//}
+
+//void FancyTabWidget::RemoveTab(QWidget *tab)
+//{
+//  int idx=stack_->indexOf(tab);
+//  if (idx>-1 && idx<items_.count()) {
+//    stack_->removeWidget(tab);
+//    items_.takeAt(idx);
+//    Recreate();
+//  }
+//}
+
+//int FancyTabWidget::IndexOf(QWidget *tab)
+//{
+//  return stack_->indexOf(tab);
+//}
+
+//void FancyTabWidget::AddSpacer(int size) {
+//  items_ << Item(size);
+//}
+
+//void FancyTabWidget::SetBackgroundPixmap(const QPixmap& pixmap) {
+//  background_pixmap_ = pixmap;
+//  update();
+//}
 
 static void drawFadedLine(QPainter *p, const QRect &r, const QColor &col)
 {
@@ -777,12 +799,55 @@ void FancyTabWidget::ShowWidget(int index) {
   emit CurrentChanged(idx);
 }
 
-void FancyTabWidget::AddBottomWidget(QWidget* widget) {
-  top_layout_->addWidget(widget);
+//void FancyTabWidget::AddBottomWidget(QWidget* widget) {
+//  top_layout_->addWidget(widget);
+//}
+
+void FancyTabWidget::contextMenuEvent(QContextMenuEvent* e) {
+  if (!allowContext_) {
+      return;
+  }
+
+  // Check we are over tab space...
+  if (Tab==(style_&Style_Mask)) {
+      if (QApplication::widgetAt(e->globalPos())!=tab_bar_) {
+          return;
+      }
+  }
+  else {
+      switch (style_&Position_Mask) {
+      case Bot:
+          if (e->pos().y()<=(side_widget_->pos().y()+(side_widget_->height()-tab_bar_->height()))) {
+              return;
+          }
+          break;
+      case Top:
+          if (e->pos().y()>(side_widget_->pos().y()+tab_bar_->height())) {
+              return;
+          }
+          break;
+      default:
+          if (Qt::RightToLeft==QApplication::layoutDirection()) {
+              if (e->pos().x()<=side_widget_->pos().x()) {
+                  return;
+              }
+          } else if (e->pos().x()>=side_widget_->rect().right()) {
+              return;
+          }
+      }
+  }
+
+  if (!menu_) {
+    menu_ = new QMenu(this);
+    QAction *act=new QAction(i18n("Configure..."), this);
+    connect(act, SIGNAL(triggered()), SIGNAL(configRequested()));
+    menu_->addAction(act);
+  }
+  menu_->popup(e->globalPos());
 }
 
-void FancyTabWidget::SetMode(Mode mode) {
-  if(mode==mode_) {
+void FancyTabWidget::setStyle(int s) {
+  if(s==style_ && tab_bar_) {
       return;
   }
   // Remove previous tab bar
@@ -790,35 +855,28 @@ void FancyTabWidget::SetMode(Mode mode) {
   tab_bar_ = NULL;
 
 //   use_background_ = false;
-
   // Create new tab bar
-  switch (mode) {
-    case Mode_None:
-    default:
-//       qDebug() << "Unknown fancy tab mode" << mode;
-      // fallthrough
-
-    case Mode_TopBar:
-    case Mode_IconOnlyTopBar:
-    case Mode_BottomBar:
-    case Mode_IconOnlyBottomBar:
-    case Mode_IconOnlySmallSidebar:
-    case Mode_IconOnlyLargeSidebar:
-    case Mode_LargeSidebar: {
-      FancyTabBar* bar = new FancyTabBar(this, drawBorder_, Mode_LargeSidebar==mode || Mode_BottomBar==mode || Mode_TopBar==mode,
-                                         Mode_IconOnlySmallSidebar==mode ? smallIconSize : largeIconSize,
-                                         Mode_BottomBar==mode || Mode_IconOnlyBottomBar==mode
-                                            ? FancyTabBar::Bot
-                                            : Mode_TopBar==mode || Mode_IconOnlyTopBar==mode
-                                                ? FancyTabBar::Top
-                                                : FancyTabBar::Side);
-      if (Mode_BottomBar==mode || Mode_IconOnlyBottomBar==mode) {
-        top_layout_->insertWidget(1, bar);
-      } else if (Mode_TopBar==mode || Mode_IconOnlyTopBar==mode) {
-          top_layout_->insertWidget(0, bar);
-      } else {
-        side_layout_->insertWidget(0, bar);
+  if (Tab==(s&Style_Mask) || (Small==(s&Style_Mask) && !(s&IconOnly))) {
+      switch (s&Position_Mask) {
+      default:
+      case Side:
+          MakeTabBar(Qt::RightToLeft==QApplication::layoutDirection() ? QTabBar::RoundedEast : QTabBar::RoundedWest, !(s&IconOnly), true, Small==(s&Style_Mask));
+          break;
+      case Top:
+          MakeTabBar(QTabBar::RoundedNorth, !(s&IconOnly), true, Small==(s&Style_Mask)); break;
+      case Bot:
+          MakeTabBar(QTabBar::RoundedSouth, !(s&IconOnly), true, Small==(s&Style_Mask)); break;
+      }
+  } else {
+      FancyTabBar* bar = new FancyTabBar(this, drawBorder_, !(s&IconOnly), Small==(s&Style_Mask) ? smallIconSize : largeIconSize,
+                                         Side==(s&Position_Mask) ? FancyTabBar::Side : (Top==(s&Position_Mask) ? FancyTabBar::Top : FancyTabBar::Bot));
+      switch (s&Position_Mask) {
+      default:
+      case Side: side_layout_->insertWidget(0, bar); break;
+      case Bot:  top_layout_->insertWidget(1, bar); break;
+      case Top:  top_layout_->insertWidget(0, bar); break;
       }
+
       tab_bar_ = bar;
 
       int index=0;
@@ -838,51 +896,11 @@ void FancyTabWidget::SetMode(Mode mode) {
 
       bar->setCurrentIndex(IndexToTab(stack_->currentIndex()));
       connect(bar, SIGNAL(currentChanged(int)), SLOT(ShowWidget(int)));
-
-//       use_background_ = true;
-
-      break;
-    }
-
-//    case Mode_Tabs:
-//      MakeTabBar(QTabBar::RoundedNorth, true, false, false);
-//      break;
-
-    case Mode_IconOnlyTopTabs:
-      MakeTabBar(QTabBar::RoundedNorth, false, true, false);
-      break;
-
-    case Mode_TopTabs:
-      MakeTabBar(QTabBar::RoundedNorth, true, true, false);
-      break;
-
-    case Mode_IconOnlyBotTabs:
-      MakeTabBar(QTabBar::RoundedSouth, false, true, false);
-      break;
-
-    case Mode_BotTabs:
-      MakeTabBar(QTabBar::RoundedSouth, true, true, false);
-      break;
-
-    case Mode_SmallSidebar:
-      MakeTabBar(QTabBar::RoundedWest, true, true, true);
-//       use_background_ = true;
-      break;
-
-//    case Mode_PlainSidebar:
-    case Mode_SideTabs:
-      MakeTabBar(Qt::RightToLeft==QApplication::layoutDirection() ? QTabBar::RoundedEast : QTabBar::RoundedWest, true, true, false);
-      break;
-
-    case Mode_IconOnlySideTabs:
-      MakeTabBar(Qt::RightToLeft==QApplication::layoutDirection() ? QTabBar::RoundedEast : QTabBar::RoundedWest, false, true, false);
-      break;
   }
-
   tab_bar_->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
 
-  mode_ = mode;
-  emit ModeChanged(mode);
+  style_ = s;
+  emit styleChanged(s);
   update();
 }
 
@@ -894,155 +912,6 @@ void FancyTabWidget::ToggleTab(int tab, bool show) {
     }
 }
 
-void FancyTabWidget::ToggleTab() {
-    QAction *act=qobject_cast<QAction *>(sender());
-
-    if (act) {
-        ToggleTab(act->data().toInt(), act->isChecked());
-    }
-}
-
-void FancyTabWidget::contextMenuEvent(QContextMenuEvent* e) {
-  if (!allowContext_) {
-      return;
-  }
-
-  // Check we are over tab space...
-  if (Mode_BottomBar==mode_ || Mode_IconOnlyBottomBar==mode_) {
-      if (e->pos().y()<=(side_widget_->pos().y()+(side_widget_->height()-tab_bar_->height()))) {
-        return;
-      }
-  } else if (Mode_TopBar==mode_ || Mode_IconOnlyTopBar==mode_) {
-      if (e->pos().y()>(side_widget_->pos().y()+tab_bar_->height())) {
-        return;
-      }
-  } else if (Mode_IconOnlyTopTabs!=mode_ && Mode_TopTabs!=mode_ && Mode_IconOnlyBotTabs!=mode_ && Mode_BotTabs!=mode_){
-      if (Qt::RightToLeft==QApplication::layoutDirection()) {
-          if (e->pos().x()<=side_widget_->pos().x()) {
-            return;
-          }
-      } else if (e->pos().x()>=side_widget_->rect().right()) {
-          return;
-      }
-  } else if (QApplication::widgetAt(e->globalPos())!=tab_bar_) {
-      return;
-  }
-  if (!menu_) {
-    menu_ = new QMenu(this);
-
-    int idx=0;
-    foreach (const Item& item, items_) {
-        if (Item::Type_Tab==item.type_) {
-            QAction* action = menu_->addAction(item.tab_icon_, item.tab_label_);
-            action->setCheckable(true);
-            action->setChecked(item.enabled_);
-            action->setData(idx);
-            Action::initIcon(action);
-            connect(action, SIGNAL(triggered()), this, SLOT(ToggleTab()));
-        }
-        idx++;
-    }
-    menu_->addSeparator();
-
-    QActionGroup* group = new QActionGroup(this);
-    QMenu *modeMenu=new QMenu(this);
-    QAction *modeAct;
-    QAction *iconOnlyAct;
-    iconOnlyAct=new QAction(i18n("Icons Only"), this);
-    modeAct=new QAction(i18n("Style"), this);
-    AddMenuItem(group, i18n("Large Sidebar"), Mode_LargeSidebar, Mode_IconOnlyLargeSidebar);
-    AddMenuItem(group, i18n("Small Sidebar"), Mode_SmallSidebar, Mode_IconOnlySmallSidebar);
-    AddMenuItem(group, i18n("Top Bar"), Mode_TopBar, Mode_IconOnlyTopBar);
-    AddMenuItem(group, i18n("Bottom Bar"), Mode_BottomBar, Mode_IconOnlyBottomBar);
-    AddMenuItem(group, i18n("Tabs On Side"), Mode_SideTabs, Mode_IconOnlySideTabs);
-    AddMenuItem(group, i18n("Tabs On Top"), Mode_TopTabs, Mode_IconOnlyTopTabs);
-    AddMenuItem(group, i18n("Tabs On Bottom"), Mode_BotTabs, Mode_IconOnlyBotTabs);
-    modeMenu->addActions(group->actions());
-    iconOnlyAct->setCheckable(true);
-    iconOnlyAct->setChecked(Mode_IconOnlyLargeSidebar==mode_ || Mode_IconOnlySmallSidebar==mode_ ||
-                            Mode_IconOnlySideTabs==mode_ || Mode_IconOnlyTopTabs==mode_ ||
-                            Mode_IconOnlyBotTabs==mode_ || Mode_IconOnlyTopBar==mode_ ||
-                            Mode_IconOnlyBottomBar==mode_);
-    iconOnlyAct->setData(0);
-    connect(iconOnlyAct, SIGNAL(triggered()), this, SLOT(SetMode()));
-    modeMenu->addSeparator();
-    modeMenu->addAction(iconOnlyAct);
-    foreach (QAction *a, otherStyleActions) {
-      modeMenu->addAction(a);
-    }
-    modeAct->setMenu(modeMenu);
-    modeAct->setData(-1);
-    menu_->addAction(modeAct);
-    foreach (QAction *a, otherActions) {
-      menu_->addAction(a);
-    }
-  }
-
-  foreach (QAction *act, menu_->actions()) {
-      if (act->data().toInt()==stack_->currentIndex()) {
-          act->setEnabled(false);
-      } else {
-          act->setEnabled(true);
-      }
-  }
-  menu_->popup(e->globalPos());
-}
-
-void FancyTabWidget::AddMenuItem(QActionGroup* group, const QString& text, Mode mode, Mode iconMode) {
-  QAction* action = group->addAction(text);
-  action->setCheckable(true);
-  action->setData(mode);
-  connect(action, SIGNAL(triggered()), this, SLOT(SetMode()));
-
-  if (mode == mode_ || iconMode==mode_) {
-    action->setChecked(true);
-  }
-}
-
-void FancyTabWidget::SetMode()
-{
-    QAction *act=qobject_cast<QAction *>(sender());
-
-    if (act) {
-        int data=act->data().toInt();
-
-        if (0==data) {
-            switch (mode_) {
-            case Mode_LargeSidebar:         SetMode(Mode_IconOnlyLargeSidebar); break;
-            case Mode_SmallSidebar:         SetMode(Mode_IconOnlySmallSidebar); break;
-            case Mode_SideTabs:             SetMode(Mode_IconOnlySideTabs); break;
-            case Mode_TopTabs:              SetMode(Mode_IconOnlyTopTabs); break;
-            case Mode_IconOnlyTopTabs:      SetMode(Mode_TopTabs); break;
-            case Mode_BotTabs:              SetMode(Mode_IconOnlyBotTabs); break;
-            case Mode_IconOnlyBotTabs:      SetMode(Mode_BotTabs); break;
-            case Mode_IconOnlyLargeSidebar: SetMode(Mode_LargeSidebar); break;
-            case Mode_IconOnlySmallSidebar: SetMode(Mode_SmallSidebar); break;
-            case Mode_IconOnlySideTabs:     SetMode(Mode_SideTabs); break;
-            case Mode_BottomBar:            SetMode(Mode_IconOnlyBottomBar); break;
-            case Mode_IconOnlyBottomBar:    SetMode(Mode_BottomBar); break;
-            case Mode_TopBar:               SetMode(Mode_IconOnlyTopBar); break;
-            case Mode_IconOnlyTopBar:       SetMode(Mode_TopBar); break;
-            default: break;
-            }
-        } else {
-            bool iconOnly=Mode_IconOnlyLargeSidebar==mode_ || Mode_IconOnlySmallSidebar==mode_ ||
-                          Mode_IconOnlySideTabs==mode_ || Mode_IconOnlyTopTabs==mode_ ||
-                          Mode_IconOnlyBotTabs==mode_ || Mode_IconOnlyBottomBar==mode_ ||
-                          Mode_IconOnlyTopBar==mode_;
-            switch (data) {
-            case Mode_LargeSidebar: SetMode(iconOnly ? Mode_IconOnlyLargeSidebar : Mode_LargeSidebar); break;
-            case Mode_SmallSidebar: SetMode(iconOnly ? Mode_IconOnlySmallSidebar : Mode_SmallSidebar); break;
-            case Mode_SideTabs:     SetMode(iconOnly ? Mode_IconOnlySideTabs : Mode_SideTabs); break;
-            case Mode_TopTabs:      SetMode(iconOnly ? Mode_IconOnlyTopTabs : Mode_TopTabs); break;
-            case Mode_BotTabs:      SetMode(iconOnly ? Mode_IconOnlyBotTabs : Mode_BotTabs); break;
-            case Mode_BottomBar:    SetMode(iconOnly ? Mode_IconOnlyBottomBar : Mode_BottomBar); break;
-            case Mode_TopBar:       SetMode(iconOnly ? Mode_IconOnlyTopBar : Mode_TopBar); break;
-            default: break;
-            }
-        }
-    }
-}
-
 void FancyTabWidget::MakeTabBar(QTabBar::Shape shape, bool text, bool icons, bool fancy) {
   QTabBar* bar = new QTabBar(this);
   bar->setShape(shape);
@@ -1112,18 +981,14 @@ int FancyTabWidget::TabToIndex(int tab) const
 
 void FancyTabWidget::SetIcon(int index, const QIcon &icon)
 {
-    if (index>0 && index<items_.count()) {
+    if (index>-1 && index<items_.count()) {
         items_[index].tab_icon_=icon;
     }
-    if (menu_) {
-        menu_->deleteLater();
-        menu_=0;
-    }
 }
 
 void FancyTabWidget::SetToolTip(int index, const QString &tt)
 {
-    if (index>0 && index<items_.count()) {
+    if (index>-1 && index<items_.count()) {
         Item &item=items_[index];
         item.tab_tooltip_=tt.isEmpty() ? item.tab_label_ : tt;
 
@@ -1139,9 +1004,42 @@ void FancyTabWidget::SetToolTip(int index, const QString &tt)
 
 void FancyTabWidget::Recreate()
 {
-    Mode m=mode_;
-    mode_=Mode_None;
-    SetMode(m);
+    int s=style_;
+    style_=0;
+    setStyle(s);
+}
+
+void FancyTabWidget::setHiddenPages(const QStringList &hidden)
+{
+    QSet<QString> h=hidden.toSet();
+    if (h==hiddenPages().toSet()) {
+        return;
+    }
+    bool needToRecreate=false;
+    bool needToSetCurrent=false;
+    for (int i=0; i<count(); ++i) {
+        QWidget *w=widget(i);
+        if (w && items_[i].enabled_==hidden.contains(w->metaObject()->className())) {
+            items_[i].enabled_=!items_[i].enabled_;
+            emit TabToggled(i);
+            needToRecreate=true;
+            if (i==current_index()) {
+                needToSetCurrent=true;
+            }
+        }
+    }
+    if (needToRecreate) {
+        Recreate();
+    }
+    if (needToSetCurrent) {
+        for (int i=0; i<count(); ++i) {
+            QWidget *w=widget(i);
+            if (w && items_[i].enabled_) {
+                SetCurrentIndex(i);
+                break;
+            }
+        }
+    }
 }
 
 QStringList FancyTabWidget::hiddenPages() const
diff --git a/support/fancytabwidget.h b/support/fancytabwidget.h
index 1c0576c..08ddb13 100644
--- a/support/fancytabwidget.h
+++ b/support/fancytabwidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /**************************************************************************
@@ -47,7 +47,6 @@
 
 //#include <boost/scoped_ptr.hpp>
 
-class QActionGroup;
 class QMenu;
 class QPainter;
 class QSignalMapper;
@@ -62,8 +61,9 @@ class FancyTabProxyStyle : public QProxyStyle {
     Q_OBJECT
 
 public:
-    void drawControl(ControlElement element, const QStyleOption* option,
-                     QPainter* painter, const QWidget* widget) const;
+    void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *p, const QWidget *widget) const;
+    void drawControl(ControlElement element, const QStyleOption *option, QPainter *p, const QWidget *widget) const;
+    int styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const;
     void polish(QWidget* widget);
     void polish(QApplication* app);
     void polish(QPalette& palette);
@@ -137,10 +137,10 @@ public:
     int iconSize() const { return m_iconSize; }
     QSize tabSizeHint() const;
 
-signals:
+Q_SIGNALS:
     void currentChanged(int);
 
-public slots:
+public Q_SLOTS:
     void emitCurrentIndex();
 
 private:
@@ -160,32 +160,25 @@ class FancyTabWidget : public QWidget {
 
 public:
     static void setup();
+    static int iconSize(bool large=true);
 
     FancyTabWidget(QWidget *parent, bool allowContext=true, bool drawBorder=false);
 
-    // Values are persisted - only add to the end
-    enum Mode {
-        Mode_None = 0,
-
-        Mode_LargeSidebar = 1,
-        Mode_SmallSidebar = 2,
-        //Mode_Tabs = 3,
-        //Mode_IconOnlyTabs = 4,
-        //Mode_PlainSidebar = 5,
-        Mode_SideTabs = 3,
-        Mode_TopTabs = 4,
-        Mode_IconOnlyTopTabs = 5,
-        Mode_BotTabs = 6,
-        Mode_IconOnlyBotTabs = 7,
-        Mode_IconOnlyLargeSidebar = 8,
-        Mode_IconOnlySmallSidebar = 9,
-        Mode_IconOnlySideTabs = 10,
-
-        Mode_BottomBar = 11,
-        Mode_IconOnlyBottomBar = 12,
-
-        Mode_TopBar = 13,
-        Mode_IconOnlyTopBar = 14
+    enum Style {
+        Side     = 0x0001,
+        Top      = 0x0002,
+        Bot      = 0x0003,
+
+        Large    = 0x0010,
+        Small    = 0x0020,
+        Tab      = 0x0030,
+
+        IconOnly = 0x0100,
+
+        Position_Mask = 0x000F,
+        Style_Mask    = 0x00F0,
+        Options_Mask  = 0x0100,
+        All_Mask      = Position_Mask|Style_Mask|Options_Mask
     };
 
     struct Item {
@@ -208,61 +201,55 @@ public:
     };
 
     void AddTab(QWidget *tab, const QIcon &icon, const QString &label, const QString &tt=QString(), bool enabled=true);
-    void InsertTab(QWidget *tab, const QIcon &icon, const QString &label, const QString &tt=QString(), bool enabled=true);
-    void RemoveTab(QWidget *tab);
-    int IndexOf(QWidget *tab);
-    void AddSpacer(int size = 40);
-    void SetBackgroundPixmap(const QPixmap& pixmap);
-    void AddBottomWidget(QWidget* widget);
+//    void InsertTab(QWidget *tab, const QIcon &icon, const QString &label, const QString &tt=QString(), bool enabled=true);
+//    void RemoveTab(QWidget *tab);
+//    int IndexOf(QWidget *tab);
+//    void AddSpacer(int size = 40);
+//    void SetBackgroundPixmap(const QPixmap& pixmap);
+//    void AddBottomWidget(QWidget* widget);
     int current_index() const;
     QWidget * currentWidget() const;
     bool isEnabled(int index) const { return index>=0 && index<items_.count() ? items_[index].enabled_ : false; }
     QWidget * widget(int index) const;
     int count() const;
     int visibleCount() const;
-    Mode mode() const { return mode_; }
-    void addMenuAction(QAction *a) { removeMenuAction(a); otherActions.append(a); }
-    void removeMenuAction(QAction *a) { otherActions.removeAll(a); }
+    int style() const { return style_; }
     QSize tabSize() const;
-    void addStyleAction(QAction *a) { removeMenuAction(a); otherStyleActions.append(a); }
-    void removeStyleAction(QAction *a) { otherStyleActions.removeAll(a); }
     void SetIcon(int index, const QIcon &icon);
     void SetToolTip(int index, const QString &tt);
     void Recreate();
+    void setHiddenPages(const QStringList &hidden);
     QStringList hiddenPages() const;
 
-public slots:
+public Q_SLOTS:
     void SetCurrentIndex(int index);
-    void SetMode(Mode mode);
-    void SetMode(int mode) { SetMode(Mode(mode)); }
+    void setStyle(int s);
     void ToggleTab(int tab, bool show);
 
-signals:
+Q_SIGNALS:
     void CurrentChanged(int index);
-    void ModeChanged(FancyTabWidget::Mode mode);
+    void styleChanged(int style);
     void TabToggled(int index);
+    void configRequested();
 
 protected:
     void paintEvent(QPaintEvent *event);
-    void contextMenuEvent(QContextMenuEvent* e);
 
-private slots:
-    void SetMode();
+private Q_SLOTS:
     void ShowWidget(int index);
-    void ToggleTab();
 
 private:
+    void contextMenuEvent(QContextMenuEvent* e);
     void MakeTabBar(QTabBar::Shape shape, bool text, bool icons, bool fancy);
-    void AddMenuItem(QActionGroup* group,  const QString& text, Mode mode, Mode iconMode);
     int TabToIndex(int tab) const;
     int IndexToTab(int index) const { return index>=0 && index<items_.count() ? items_[index].index_ : 0; }
 
-    Mode mode_;
+    int style_;
     QList<Item> items_;
 
     QWidget* tab_bar_;
     QStackedWidget* stack_;
-    QPixmap background_pixmap_;
+//    QPixmap background_pixmap_;
     QWidget* side_widget_;
     QVBoxLayout* side_layout_;
     QVBoxLayout* top_layout_;
@@ -275,9 +262,6 @@ private:
     QScopedPointer<FancyTabProxyStyle> proxy_style_;
     bool allowContext_;
     bool drawBorder_;
-
-    QList<QAction *> otherActions;
-    QList<QAction *> otherStyleActions;
 };
 
 } // namespace Internal
diff --git a/support/gtkproxystyle.cpp b/support/gtkproxystyle.cpp
index 8ffff83..2bfd78e 100644
--- a/support/gtkproxystyle.cpp
+++ b/support/gtkproxystyle.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -24,68 +24,75 @@
 #include "gtkproxystyle.h"
 #include "gtkstyle.h"
 #include "shortcuthandler.h"
-#ifdef ENABLE_OVERLAYSCROLLBARS
-#include "osthumb.h"
-#endif
 #ifndef ENABLE_KDE_SUPPORT
 #include "acceleratormanager.h"
 #endif
 #include <QComboBox>
-#include <QToolBar>
-#include <QAbstractScrollArea>
-#include <QAbstractItemView>
-#include <QTreeView>
-#include <QHeaderView>
+#include <QSpinBox>
 #include <QScrollBar>
+#include <QAbstractScrollArea>
 #include <QMenu>
+#include <QToolBar>
 #include <QApplication>
-#include <QHoverEvent>
 #include <QPainter>
-#include <QDesktopWidget>
-#include <QLibrary>
 
 static const char * constOnCombo="on-combo";
 #ifndef ENABLE_KDE_SUPPORT
 static const char * constAccelProp="catata-accel";
 #endif
+static const double constSpinButtonRatio=1.25;
 
-//static bool revertQGtkStyleOverlayMod()
-//{
-//    // TODO: This is not working. ubuntu_gtk_set_use_overlay_scrollbar is found, and called.
-//    // But, Gtk filechooser STILL has non-overlay scrollbars!!!
-//    typedef void (*SetUseOsFn) (int);
-//    // enforce the "0" suffix, so we'll open libgtk-x11-2.0.so.0
-//    QLibrary libgtk(QLatin1String("gtk-x11-2.0"), 0, 0);
-//    SetUseOsFn setUseOsFn = (SetUseOsFn)libgtk.resolve("ubuntu_gtk_set_use_overlay_scrollbar");
+static bool isOnCombo(const QWidget *w)
+{
+    return w && (qobject_cast<const QComboBox *>(w) || isOnCombo(w->parentWidget()));
+}
 
-//    if (setUseOsFn) {
-//        setUseOsFn(!0);
-//        qputenv("LIBOVERLAY_SCROLLBAR", "override-blacklist");
-//        return true;
-//    }
-//    return false;
-//}
+static QPainterPath buildPath(const QRectF &r, double radius)
+{
+    QPainterPath path;
+    double diameter(radius*2);
 
+    path.moveTo(r.x()+r.width(), r.y()+r.height()-radius);
+    path.arcTo(r.x()+r.width()-diameter, r.y(), diameter, diameter, 0, 90);
+    path.arcTo(r.x(), r.y(), diameter, diameter, 90, 90);
+    path.arcTo(r.x(), r.y()+r.height()-diameter, diameter, diameter, 180, 90);
+    path.arcTo(r.x()+r.width()-diameter, r.y()+r.height()-diameter, diameter, diameter, 270, 90);
+    return path;
+}
 
-static bool isOnCombo(const QWidget *w)
+static void drawSpinButton(QPainter *painter, const QRect &r, const QColor &col, bool isPlus)
 {
-    return w && (qobject_cast<const QComboBox *>(w) || isOnCombo(w->parentWidget()));
+    int length=r.height()*0.5;
+    int lineWidth=length<24 ? 2 : 4;
+    if (length<(lineWidth*2)) {
+        length=lineWidth*2;
+    } else if (length%2) {
+        length++;
+    } 
+
+    painter->save();
+    painter->setRenderHint(QPainter::Antialiasing, false);
+    painter->fillRect(r.x()+((r.width()-length)/2), r.y()+((r.height()-lineWidth)/2), length, lineWidth, col);
+    if (isPlus) {
+        painter->fillRect(r.x()+((r.width()-lineWidth)/2), r.y()+((r.height()-length)/2), lineWidth, length, col);
+    }
+    painter->restore();
 }
 
-GtkProxyStyle::GtkProxyStyle(ScrollbarType sb)
+static inline void addEventFilter(QObject *object, QObject *filter)
+{
+    object->removeEventFilter(filter);
+    object->installEventFilter(filter);
+}
+
+GtkProxyStyle::GtkProxyStyle(ScrollbarType sb, bool styleSpin, const QMap<QString, QString> &c)
     : QProxyStyle()
-    #ifdef ENABLE_OVERLAYSCROLLBARS
-    , sbarThumb(0)
-    , sbarWidth(-1)
-    , sbarAreaWidth(-1)
-    , sbarOffset(0xffffffff)
-    , sbarLastPos(-1)
-    , sbarThumbTarget(0)
-    #endif
+    , css(c)
 {
     shortcutHander=new ShortcutHandler(this);
 
     sbarType=sb;
+    touchStyleSpin=styleSpin;
 
     if (SB_Standard!=sbarType) {
         QByteArray env=qgetenv("LIBOVERLAY_SCROLLBAR");
@@ -98,28 +105,11 @@ GtkProxyStyle::GtkProxyStyle(ScrollbarType sb)
     if (SB_Standard!=sbarType) {
         int fh=QApplication::fontMetrics().height();
         sbarPlainViewWidth=fh/1.75;
-
-        #ifdef ENABLE_OVERLAYSCROLLBARS
-        if (SB_Overlay==sbarType && Qt::LeftToRight==QApplication::layoutDirection()) { //  && revertQGtkStyleOverlayMod()) {
-            sbarWidth=qMax(fh/5, 3);
-            sbarAreaWidth=sbarWidth*6;
-            sbarThumb=new OsThumb();
-            sbarThumb->setVisible(false);
-            connect(sbarThumb, SIGNAL(thumbDragged(QPoint)), SLOT(sbarThumbMoved(QPoint)));
-            connect(sbarThumb, SIGNAL(pageUp()), SLOT(sbarPageUp()));
-            connect(sbarThumb, SIGNAL(pageDown()), SLOT(sbarPageDown()));
-            connect(sbarThumb, SIGNAL(hiding()), SLOT(sbarThumbHiding()));
-            connect(sbarThumb, SIGNAL(showing()),SLOT(sbarThumbShowing()));
-        }
-        #endif
     }
 }
 
 GtkProxyStyle::~GtkProxyStyle()
 {
-    #ifdef ENABLE_OVERLAYSCROLLBARS
-    destroySliderThumb();
-    #endif
 }
 
 QSize GtkProxyStyle::sizeFromContents(ContentsType type, const QStyleOption *option,  const QSize &size, const QWidget *widget) const
@@ -137,6 +127,38 @@ QSize GtkProxyStyle::sizeFromContents(ContentsType type, const QStyleOption *opt
                 sz = QSize(extent, sliderMin);
             }
         }
+    } else if (touchStyleSpin && CT_SpinBox==type) {
+        if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
+            if (QAbstractSpinBox::NoButtons!=spinBox->buttonSymbols) {
+                #if QT_VERSION < 0x050200
+                sz += QSize(0, 1);
+                #endif
+                #if QT_VERSION >= 0x050000
+                // Qt5 does not seem to be taking special value, or suffix, into account when calculatng width...
+                if (widget && qobject_cast<const QSpinBox *>(widget)) {
+                    const QSpinBox *spin=static_cast<const QSpinBox *>(widget);
+                    QString special=spin->specialValueText();
+                    int minWidth=0;
+                    if (!special.isEmpty()) {
+                        minWidth=option->fontMetrics.width(special+QLatin1String(" "));
+                    }
+
+                    QString suffix=spin->suffix()+QLatin1String(" ");
+                    minWidth=qMax(option->fontMetrics.width(QString::number(spin->minimum())+suffix), minWidth);
+                    minWidth=qMax(option->fontMetrics.width(QString::number(spin->maximum())+suffix), minWidth);
+
+                    if (minWidth>0) {
+                        int frameWidth=baseStyle()->pixelMetric(QStyle::PM_DefaultFrameWidth, option, 0);
+                        int buttonWidth=(sz.height()-(frameWidth*2))*constSpinButtonRatio;
+                        minWidth=((minWidth+(buttonWidth+frameWidth)*2)*1.05)+0.5;
+                        if (sz.width()<minWidth) {
+                            sz.setWidth(minWidth);
+                        }
+                    }
+                }
+                #endif
+            }
+        }
     }
     return sz;
 }
@@ -162,11 +184,7 @@ int GtkProxyStyle::styleHint(StyleHint hint, const QStyleOption *option, const Q
 int GtkProxyStyle::pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const
 {
     if (SB_Standard!=sbarType && PM_ScrollBarExtent==metric) {
-        #ifdef ENABLE_OVERLAYSCROLLBARS
-        return !sbarThumb || usePlainScrollbars(widget) ? sbarPlainViewWidth : sbarWidth;
-        #else
         return sbarPlainViewWidth;
-        #endif
     }
     return baseStyle()->pixelMetric(metric, option, widget);
 }
@@ -219,11 +237,7 @@ QRect GtkProxyStyle::subControlRect(ComplexControl control, const QStyleOptionCo
                 }
                 break;
             case SC_ScrollBarGroove:
-                if (horizontal) {
-                    ret=QRect(0, 0, sb->rect.width(), sb->rect.height());
-                } else {
-                    ret=QRect(0, 0, sb->rect.width(), sb->rect.height());
-                }
+                ret=QRect(0, 0, sb->rect.width(), sb->rect.height());
                 break;
             case SC_ScrollBarSlider:
                 if (horizontal) {
@@ -238,31 +252,36 @@ QRect GtkProxyStyle::subControlRect(ComplexControl control, const QStyleOptionCo
             }
             return visualRect(sb->direction/*Qt::LeftToRight*/, sb->rect, ret);
         }
+    } else if (touchStyleSpin && CC_SpinBox==control) {
+        if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
+            if (QAbstractSpinBox::NoButtons!=spinBox->buttonSymbols) {
+                int border=2;
+                int internalHeight=spinBox->rect.height()-(border*2);
+                int internalWidth=internalHeight*constSpinButtonRatio;
+                switch (subControl) {
+                case SC_SpinBoxUp:
+                    return Qt::LeftToRight==spinBox->direction
+                                ? QRect(spinBox->rect.width()-(internalWidth+border), border, internalWidth, internalHeight)
+                                : QRect(border, border, internalWidth, internalHeight);
+                case SC_SpinBoxDown:
+                    return Qt::LeftToRight==spinBox->direction
+                                ? QRect(spinBox->rect.width()-((internalWidth*2)+border), border, internalWidth, internalHeight)
+                                : QRect(internalWidth+border, border, internalWidth, internalHeight);
+                case SC_SpinBoxEditField:
+                    return Qt::LeftToRight==spinBox->direction
+                            ? QRect(border, border, spinBox->rect.width()-((internalWidth*2)+border), internalHeight)
+                            : QRect(((internalWidth*2)+border), border, spinBox->rect.width()-((internalWidth*2)+border), internalHeight);
+                case SC_SpinBoxFrame:
+                    return spinBox->rect;
+                default:
+                    break;
+                }
+            }
+        }
     }
     return baseStyle()->subControlRect(control, option, subControl, widget);
 }
 
-static QPainterPath buildPath(const QRectF &r, double radius)
-{
-    QPainterPath path;
-    double diameter(radius*2);
-
-    path.moveTo(r.x()+r.width(), r.y()+r.height()-radius);
-    path.arcTo(r.x()+r.width()-diameter, r.y(), diameter, diameter, 0, 90);
-    path.arcTo(r.x(), r.y(), diameter, diameter, 90, 90);
-    path.arcTo(r.x(), r.y()+r.height()-diameter, diameter, diameter, 180, 90);
-    path.arcTo(r.x()+r.width()-diameter, r.y()+r.height()-diameter, diameter, diameter, 270, 90);
-    return path;
-}
-
-const QAbstractItemView * view(const QWidget *w) {
-    if (!w) {
-        return 0;
-    }
-    const QAbstractItemView *v=qobject_cast<const QAbstractItemView *>(w);
-    return v ? v : view(w->parentWidget());
-}
-
 void GtkProxyStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
 {
     if (SB_Standard!=sbarType && CC_ScrollBar==control) {
@@ -270,143 +289,127 @@ void GtkProxyStyle::drawComplexControl(ComplexControl control, const QStyleOptio
             QRect r=option->rect;
             QRect slider=subControlRect(control, option, SC_ScrollBarSlider, widget);
             painter->save();
-            #ifdef ENABLE_OVERLAYSCROLLBARS
-            bool usePlain=!sbarThumb || usePlainScrollbars(widget);
-            #else
-            bool usePlain=true;
-            #endif
-
-            if (usePlain) {
-                #if 0
-                QLinearGradient grad(r.topLeft(), Qt::Horizontal==sb->orientation ? r.bottomLeft() : r.topRight());
-                QColor col=option->palette.base().color();
-                grad.setColorAt(0, col.darker(110));
-                grad.setColorAt(1, col.darker(102));
-                painter->fillRect(r, grad);
-                #else
-                if (widget && widget->property(constOnCombo).toBool()) {
-                    painter->fillRect(r, option->palette.background());
-                } else if (!widget || widget->testAttribute(Qt::WA_OpaquePaintEvent)) {
+            if (widget && widget->property(constOnCombo).toBool()) {
+                painter->fillRect(r, QApplication::palette().color(QPalette::Background)); // option->palette.background());
+            } else if (!widget || widget->testAttribute(Qt::WA_OpaquePaintEvent)) {
+                if (option->palette.base().color()==Qt::transparent) {
+                    painter->fillRect(r, QApplication::palette().color(QPalette::Base));
+                } else {
                     painter->fillRect(r, option->palette.base());
                 }
-                #endif
-            }
-            #ifdef ENABLE_OVERLAYSCROLLBARS
-            else {
-                painter->fillRect(r, usePlain ? option->palette.base() : option->palette.background());
-                const QAbstractItemView *v=view(widget);
-                if (v && qobject_cast<const QTreeView *>(v) && ((const QTreeView *)v)->header()&& ((const QTreeView *)v)->header()->isVisible()) {
-                    QStyleOptionHeader ho;
-                    ho.rect=QRect(r.x()+r.width()-(sbarWidth), r.y(), sbarWidth, ((const QTreeView *)v)->header()->height());
-                    ho.state=option->state;
-                    ho.palette=option->palette;
-                    painter->save();
-                    drawControl(CE_Header, &ho, painter, ((const QTreeView *)v)->header());
-                    painter->restore();
-                }
             }
-            #endif
+
             if (slider.isValid()) {
-                if (usePlain) {
-                    bool inactive=!(sb->activeSubControls&SC_ScrollBarSlider && (option->state&State_MouseOver || option->state&State_Sunken));
-                    int adjust=inactive ? 3 : 1;
-                    painter->setRenderHint(QPainter::Antialiasing, true);
-                    if (Qt::Horizontal==sb->orientation) {
-                        slider.adjust(1, adjust, -1, -adjust);
-                    } else {
-                        slider.adjust(adjust, 1, -adjust, -1);
-                    }
-                    int dimension=(Qt::Horizontal==sb->orientation ? slider.height() : slider.width());
-                    QPainterPath path=buildPath(QRectF(slider.x()+0.5, slider.y()+0.5, slider.width()-1, slider.height()-1),
-                                                dimension>6 ? (dimension/4.0) : (dimension/8.0));
-                    QColor col(option->palette.highlight().color());
-                    if (!(option->state&State_Active)) {
-                        col=col.darker(115);
-                    }
-                    painter->fillPath(path, col);
-                    painter->setPen(col);
-                    painter->drawPath(path);
+                bool inactive=!(sb->activeSubControls&SC_ScrollBarSlider && (option->state&State_MouseOver || option->state&State_Sunken));
+                int adjust=inactive ? 3 : 1;
+                painter->setRenderHint(QPainter::Antialiasing, true);
+                if (Qt::Horizontal==sb->orientation) {
+                    slider.adjust(1, adjust, -1, -adjust);
+                } else {
+                    slider.adjust(adjust, 1, -adjust, -1);
                 }
-                #ifdef ENABLE_OVERLAYSCROLLBARS
-                else {
-                    QRect toThumb;
-                    QPalette::ColorGroup cg=option->palette.currentColorGroup();
-                    if (sbarThumb && sbarThumbTarget && sbarThumbTarget==widget && sbarThumb->isVisible()) {
-                        QPoint p=sbarThumbTarget->mapFromGlobal(sbarThumb->pos())+QPoint(1, 1);
-                        if (Qt::Horizontal==sb->orientation) {
-                            if (p.x()<slider.x()) {
-                                toThumb=QRect(p.x(), slider.y(), slider.x()-p.x(), slider.width());
-                            } else if (p.x()>(slider.x()+slider.width())) {
-                                toThumb=QRect(slider.x()+slider.width(), slider.x(), p.x()-(slider.y()+slider.width()), slider.width());
-                            }
-                        } else {
-                            if (p.y()<slider.y()) {
-                                toThumb=QRect(slider.x(), p.y(), slider.width(), slider.y()-p.y());
-                            } else if (p.y()>(slider.y()+slider.height())) {
-                                toThumb=QRect(slider.x(), slider.y()+slider.height(), slider.width(), p.y()-(slider.y()+slider.height()));
-                            }
-                        }
-                        cg=QPalette::Active;
-                    }
-                    if (toThumb.isValid()) {
-                        QColor col(option->palette.color(cg, QPalette::Text));
-                        col.setAlphaF(0.35);
-                        painter->fillRect(toThumb, col);
-                    }
-                    painter->fillRect(slider, option->palette.color(cg, QPalette::Highlight));
+                int dimension=(Qt::Horizontal==sb->orientation ? slider.height() : slider.width());
+                QPainterPath path=buildPath(QRectF(slider.x()+0.5, slider.y()+0.5, slider.width()-1, slider.height()-1),
+                                            dimension>6 ? (dimension/4.0) : (dimension/8.0));
+                QColor col(option->palette.highlight().color());
+                if (!(option->state&State_Active)) {
+                    col=col.darker(115);
                 }
-                #endif
+                painter->fillPath(path, col);
+                painter->setPen(col);
+                painter->drawPath(path);
             }
 
             painter->restore();
             return;
         }
-    }
-    baseStyle()->drawComplexControl(control, option, painter, widget);
-}
+    } else if (touchStyleSpin && CC_SpinBox==control) {
+        if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
+            if (QAbstractSpinBox::NoButtons!=spinBox->buttonSymbols) {
+                // Use PE_FrameLineEdit to draw border, as QGtkStyle corrupts focus settings
+                // if its asked to draw a QSpinBox with no buttons that has focus.
+                QStyleOptionFrameV2 opt;
+                opt.state=spinBox->state;
+                opt.state|=State_Sunken;
+                opt.rect=spinBox->rect;
+                opt.palette=spinBox->palette;
+                opt.lineWidth=baseStyle()->pixelMetric(QStyle::PM_DefaultFrameWidth, option, 0);
+                opt.midLineWidth=0;
+                opt.fontMetrics=spinBox->fontMetrics;
+                opt.direction=spinBox->direction;
+                opt.type=QStyleOption::SO_Default;
+                opt.version=1;
+                baseStyle()->drawPrimitive(PE_FrameLineEdit, &opt, painter, 0);
+
+                QRect plusRect=subControlRect(CC_SpinBox, spinBox, SC_SpinBoxUp, widget);
+                QRect minusRect=subControlRect(CC_SpinBox, spinBox, SC_SpinBoxDown, widget);
+                QColor separatorColor(spinBox->palette.foreground().color());
+                separatorColor.setAlphaF(0.15);
+                painter->setPen(separatorColor);
+                if (Qt::LeftToRight==spinBox->direction) {
+                    painter->drawLine(plusRect.topLeft(), plusRect.bottomLeft());
+                    painter->drawLine(minusRect.topLeft(), minusRect.bottomLeft());
+                } else {
+                    painter->drawLine(plusRect.topRight(), plusRect.bottomRight());
+                    painter->drawLine(minusRect.topRight(), minusRect.bottomRight());
+                }
 
-#ifdef ENABLE_OVERLAYSCROLLBARS
-static inline void addEventFilter(QObject *object, QObject *filter)
-{
-    object->removeEventFilter(filter);
-    object->installEventFilter(filter);
-}
+                if (option->state&State_Sunken) {
+                    QRect fillRect;
 
-void GtkProxyStyle::destroySliderThumb()
-{
-    if (sbarThumb) {
-        sbarThumb->setVisible(false);
-        sbarThumb->deleteLater();
-        sbarThumb=0;
+                    if (spinBox->activeSubControls&SC_SpinBoxUp) {
+                        fillRect=plusRect;
+                    } else if (spinBox->activeSubControls&SC_SpinBoxDown) {
+                        fillRect=minusRect;
+                    }
+                    if (!fillRect.isEmpty()) {
+                        QColor col=spinBox->palette.highlight().color();
+                        col.setAlphaF(0.1);
+                        painter->fillRect(fillRect.adjusted(1, 1, -1, -1), col);
+                    }
+                }
+
+                drawSpinButton(painter, plusRect,
+                               spinBox->palette.color(spinBox->state&State_Enabled && (spinBox->stepEnabled&QAbstractSpinBox::StepUpEnabled)
+                                ? QPalette::Current : QPalette::Disabled, QPalette::Text), true);
+                drawSpinButton(painter, minusRect,
+                               spinBox->palette.color(spinBox->state&State_Enabled && (spinBox->stepEnabled&QAbstractSpinBox::StepDownEnabled)
+                                ? QPalette::Current : QPalette::Disabled, QPalette::Text), false);
+                return;
+            }
+        }
     }
+    baseStyle()->drawComplexControl(control, option, painter, widget);
 }
-#endif
 
-inline void addEventFilter(QObject *object, QObject *filter)
+void GtkProxyStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
 {
-    object->removeEventFilter(filter);
-    object->installEventFilter(filter);
+    if (PE_PanelScrollAreaCorner==element && SB_Thin==sbarType && option) {
+        painter->fillRect(option->rect, option->palette.brush(QPalette::Base));
+    } else {
+        baseStyle()->drawPrimitive(element, option, painter, widget);
+    }
 }
 
 void GtkProxyStyle::polish(QWidget *widget)
 {
-    #ifdef ENABLE_OVERLAYSCROLLBARS
-    if (SB_Overlay==sbarType && sbarThumb && widget && qobject_cast<QAbstractScrollArea *>(widget) && qstrcmp(widget->metaObject()->className(), "QComboBoxListView")) {
-        addEventFilter(widget, this);
-        widget->setAttribute(Qt::WA_Hover, true);
-    } else if (SB_Standard!=sbarType && usePlainScrollbars(widget)) {
-        widget->setAttribute(Qt::WA_Hover, true);
-    }
-    #else
-
-//    TODO: Why was this here?? Should it not have just been for QScrollBars???
-//    if (SB_Standard!=sbarType) {
-//        widget->setAttribute(Qt::WA_Hover, true);
-//    }
-    if (SB_Standard!=sbarType && qobject_cast<QScrollBar *>(widget) && isOnCombo(widget)) {
-        widget->setProperty(constOnCombo, true);
+    if (SB_Standard!=sbarType) {
+        if (qobject_cast<QScrollBar *>(widget)) {
+            if (isOnCombo(widget)) {
+                widget->setProperty(constOnCombo, true);
+            }
+        } else if (qobject_cast<QAbstractScrollArea *>(widget) && widget->inherits("QComboBoxListView")) {
+            QAbstractScrollArea *sa=static_cast<QAbstractScrollArea *>(widget);
+            QWidget *sb=sa->horizontalScrollBar();
+            if (sb) {
+                sb->setProperty(constOnCombo, true);
+            }
+            sb=sa->verticalScrollBar();
+            if (sb) {
+                sb->setProperty(constOnCombo, true);
+            }
+        }
     }
-    #endif
 
     #ifndef ENABLE_KDE_SUPPORT
     if (widget && qobject_cast<QMenu *>(widget) && !widget->property(constAccelProp).isValid()) {
@@ -414,6 +417,20 @@ void GtkProxyStyle::polish(QWidget *widget)
         widget->setProperty(constAccelProp, true);
     }
     #endif
+
+    // Apply CSS only to particular widgets. With Qt5.2 if we apply CSS to whole application, then QStyleSheetStyle does
+    // NOT call sizeFromContents for spinboxes :-(
+    if (widget->styleSheet().isEmpty()) {
+        QMap<QString, QString>::ConstIterator it=css.end();
+        if (qobject_cast<QToolBar *>(widget)) {
+            it=css.find(QLatin1String(widget->metaObject()->className())+QLatin1Char('#')+widget->objectName());
+        } else if (qobject_cast<QMenu *>(widget)) {
+            it=css.find(QLatin1String(widget->metaObject()->className()));
+        }
+        if (css.end()!=it) {
+            widget->setStyleSheet(it.value());
+        }
+    }
     baseStyle()->polish(widget);
 }
 
@@ -430,16 +447,6 @@ void GtkProxyStyle::polish(QApplication *app)
 
 void GtkProxyStyle::unpolish(QWidget *widget)
 {
-    #ifdef ENABLE_OVERLAYSCROLLBARS
-    if (SB_Overlay==sbarType && sbarThumb && widget) {
-        if (qobject_cast<QAbstractScrollArea *>(widget) && qstrcmp(widget->metaObject()->className(), "QComboBoxListView")) {
-            widget->removeEventFilter(this);
-        }
-        if (sbarThumb && sbarThumbTarget==widget) {
-            sbarThumb->hide();
-        }
-    }
-    #endif
     baseStyle()->unpolish(widget);
 }
 
@@ -448,218 +455,3 @@ void GtkProxyStyle::unpolish(QApplication *app)
     app->removeEventFilter(shortcutHander);
     baseStyle()->unpolish(app);
 }
-
-#ifdef ENABLE_OVERLAYSCROLLBARS
-bool GtkProxyStyle::eventFilter(QObject *object, QEvent *event)
-{
-    if (SB_Overlay==sbarType) {
-        switch (event->type()) {
-        case QEvent::HoverMove:
-            if (object && qobject_cast<QAbstractScrollArea *>(object)) {
-                QHoverEvent *he=(QHoverEvent *)event;
-                QAbstractScrollArea *a=(QAbstractScrollArea *)object;
-                QScrollBar *bar=0;
-                if (a->horizontalScrollBar() && a->horizontalScrollBar()->isVisible() && he->pos().y()>(a->height()-sbarAreaWidth)) {
-                    bar=a->horizontalScrollBar();
-                }
-
-                if (a->verticalScrollBar() && a->verticalScrollBar()->isVisible() && he->pos().x()>(a->width()-sbarAreaWidth)) {
-                    bar=a->verticalScrollBar();
-                }
-
-                if (bar) {
-                    if (sbarThumbTarget!=bar) {
-                        if (sbarThumbTarget) {
-                            disconnect(bar, SIGNAL(destroyed(QObject *)), this, SLOT(objectDestroyed(QObject *)));
-                        }
-                        sbarThumbTarget=bar;
-                        connect(bar, SIGNAL(destroyed(QObject *)), this, SLOT(objectDestroyed(QObject *)));
-                    }
-
-                    if (!sbarThumb->isVisible() || bar->orientation()!=sbarThumb->orientation()) {
-                        sbarThumb->setOrientation(bar->orientation());
-                        QPoint global=a->mapToGlobal(QPoint(Qt::Vertical==bar->orientation() ? a->width()-sbarWidth-1 : 0, Qt::Vertical==bar->orientation() ? 0 : a->height()-sbarWidth-1));
-                        int toXPos=global.x();
-                        int toYPos=global.y();
-
-                        if (Qt::Vertical==bar->orientation()) {
-                            int thumbSize = sbarThumb->height();
-                            toYPos = a->mapToGlobal(he->pos()).y() - sbarThumb->height() / 2;
-                            int minYPos = global.y();
-                            int maxYPos = global.y() + a->height() - thumbSize;
-
-                            sbarThumb->setMaximum(maxYPos);
-                            sbarThumb->setMinimum(minYPos);
-
-                            if (toYPos < minYPos) {
-                                toYPos = minYPos;
-                            }
-                            if (toYPos > maxYPos) {
-                                toYPos = maxYPos;
-                            }
-                            if (QApplication::desktop() && toXPos+sbarThumb->width()>QApplication::desktop()->width()) {
-                                toXPos=global.x()-(sbarThumb->width()-sbarWidth);
-                            }
-                        } else {
-                            int thumbSize = sbarThumb->height();
-                            toXPos = a->mapToGlobal(he->pos()).x() - sbarThumb->width() / 2;
-                            int minXPos = global.x();
-                            int maxXPos = global.x() + a->width() - thumbSize;
-
-                            sbarThumb->setMaximum(maxXPos);
-                            sbarThumb->setMinimum(minXPos);
-
-                            if (toXPos < minXPos) {
-                                toXPos = minXPos;
-                            }
-                            if (toXPos > maxXPos) {
-                                toXPos = maxXPos;
-                            }
-
-                            if (QApplication::desktop() && toYPos+sbarThumb->height()>QApplication::desktop()->height()) {
-                                toYPos=global.y()-(sbarThumb->height()-sbarWidth);
-                            }
-                        }
-                        sbarThumb->move(toXPos, toYPos);
-                        sbarThumb->show();
-                        sbarUpdateOffset();
-                    }
-                } else {
-                    sbarThumb->hide();
-                }
-            }
-            break;
-        case QEvent::Resize:
-        case QEvent::Move:
-            if (sbarThumb && sbarThumb->isVisible() && object && qobject_cast<QAbstractScrollArea *>(object)) {
-                sbarThumb->hide();
-            }
-            break;
-        case QEvent::WindowDeactivate:
-            if (sbarThumb && sbarThumb->isVisible()) {
-                sbarThumb->hide();
-            }
-        default:
-            break;
-        }
-    }
-
-    return baseStyle()->eventFilter(object, event);
-}
-
-void GtkProxyStyle::objectDestroyed(QObject *obj)
-{
-    if (obj==sbarThumbTarget) {
-        disconnect(sbarThumbTarget, SIGNAL(destroyed(QObject *)), this, SLOT(objectDestroyed(QObject *)));
-        sbarThumbTarget=0;
-    }
-}
-
-void GtkProxyStyle::sbarThumbMoved(const QPoint &point)
-{
-    if (sbarThumbTarget) {
-        bool v=Qt::Vertical==sbarThumbTarget->orientation();
-        if (-1!=sbarLastPos && sbarLastPos==(v ? point.y() : point.x())) {
-            return;
-        }
-        QPoint global=point-sbarThumbTarget->mapToGlobal(QPoint(0, 0))-QPoint(1, 1);
-        int value=sbarThumbTarget->value();
-        QRect sliderThumbRect=sbarGetSliderRect();
-        QRect osThumbRect=QRect(sbarThumb->x(), sbarThumb->y(), sbarThumb->width(), sbarThumb->height());
-        int adjust=osThumbRect.contains(sliderThumbRect) ? 0 : sbarOffset;
-
-        if (v) {
-            sbarThumbTarget->setValue(sliderValueFromPosition(sbarThumbTarget->minimum(), sbarThumbTarget->maximum(), global.y() -adjust,
-                                                              sbarThumbTarget->height() - sbarThumb->height()));
-            sbarLastPos=point.y();
-        } else {
-            sbarThumbTarget->setValue(sliderValueFromPosition(sbarThumbTarget->minimum(), sbarThumbTarget->maximum(), global.x() -adjust,
-                                                              sbarThumbTarget->width() - sbarThumb->width()));
-            sbarLastPos=point.x();
-        }
-        if (value==sbarThumbTarget->value()) {
-            sbarThumbTarget->update();
-        }
-    }
-}
-
-void GtkProxyStyle::sbarPageUp()
-{
-    if (sbarThumbTarget) {
-        sbarThumbTarget->setValue(sbarThumbTarget->value() - sbarThumbTarget->pageStep());
-
-        if (sbarThumbTarget->value() < sbarThumbTarget->minimum()) {
-            sbarThumbTarget->setValue(sbarThumbTarget->minimum());
-        }
-        sbarUpdateOffset();
-    }
-}
-
-void GtkProxyStyle::sbarPageDown()
-{
-    if (sbarThumbTarget) {
-        sbarThumbTarget->setValue(sbarThumbTarget->value() + sbarThumbTarget->pageStep());
-
-        if (sbarThumbTarget->value() > sbarThumbTarget->maximum()) {
-            sbarThumbTarget->setValue(sbarThumbTarget->maximum());
-        }
-        sbarUpdateOffset();
-    }
-}
-
-void GtkProxyStyle::sbarThumbHiding()
-{
-    if (sbarThumbTarget) {
-        sbarThumbTarget->update();
-    }
-    sbarLastPos=-1;
-}
-
-void GtkProxyStyle::sbarThumbShowing()
-{
-    if (sbarThumbTarget) {
-        sbarThumbTarget->update();
-    }
-}
-
-QRect GtkProxyStyle::sbarGetSliderRect() const
-{
-    QStyleOptionSlider opt;
-    opt.initFrom(sbarThumbTarget);
-    opt.subControls = QStyle::SC_None;
-    opt.activeSubControls = QStyle::SC_None;
-    opt.orientation = sbarThumbTarget->orientation();
-    opt.minimum = sbarThumbTarget->minimum();
-    opt.maximum = sbarThumbTarget->maximum();
-    opt.sliderPosition = sbarThumbTarget->sliderPosition();
-    opt.sliderValue = sbarThumbTarget->value();
-    opt.singleStep = sbarThumbTarget->singleStep();
-    opt.pageStep = sbarThumbTarget->pageStep();
-    opt.upsideDown = sbarThumbTarget->invertedAppearance();
-    if (Qt::Horizontal==sbarThumbTarget->orientation()) {
-        opt.state |= QStyle::State_Horizontal;
-    }
-
-    QRect slider=subControlRect(CC_ScrollBar, &opt, SC_ScrollBarSlider, sbarThumbTarget);
-    QPoint gpos=sbarThumbTarget->mapToGlobal(slider.topLeft())-QPoint(1, 1);
-    return QRect(gpos.x(), gpos.y(), slider.width(), slider.height());
-}
-
-void GtkProxyStyle::sbarUpdateOffset()
-{
-    QRect sr=sbarGetSliderRect();
-
-    if (Qt::Vertical==sbarThumbTarget->orientation()) {
-        sbarOffset=sbarThumb->pos().y()-sr.y();
-    } else {
-        sbarOffset=sbarThumb->pos().x()-sr.x();
-    }
-}
-
-bool GtkProxyStyle::usePlainScrollbars(const QWidget *widget) const
-{
-    return SB_Thin==sbarType || !widget || 0==qstrcmp(widget->metaObject()->className(), "QWebView") ||
-           (widget && widget->parentWidget() && widget->parentWidget()->parentWidget() &&
-            0==qstrcmp(widget->parentWidget()->parentWidget()->metaObject()->className(), "QComboBoxListView"));
-}
-#endif
diff --git a/support/gtkproxystyle.h b/support/gtkproxystyle.h
index 7d30d5c..ca06cd9 100644
--- a/support/gtkproxystyle.h
+++ b/support/gtkproxystyle.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -25,12 +25,9 @@
 #define GTKPROXYSTYLE_H
 
 #include <QProxyStyle>
+#include <QMap>
 #include "config.h"
 
-#ifdef ENABLE_OVERLAYSCROLLBARS
-class QScrollBar;
-class OsThumb;
-#endif
 class ShortcutHandler;
 
 class GtkProxyStyle : public QProxyStyle
@@ -41,22 +38,16 @@ public:
     enum ScrollbarType {
         SB_Standard,
         SB_Thin
-        #ifdef ENABLE_OVERLAYSCROLLBARS
-        , SB_Overlay
-        #endif
     };
 
-    GtkProxyStyle(ScrollbarType sb);
+    GtkProxyStyle(ScrollbarType sb, bool styleSpin, const QMap<QString, QString> &c);
     ~GtkProxyStyle();
     QSize sizeFromContents(ContentsType type, const QStyleOption *option,  const QSize &size, const QWidget *widget) const;
     int styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const;
     int pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const;
     QRect subControlRect(ComplexControl control, const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const;
     void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const;
-    #ifdef ENABLE_OVERLAYSCROLLBARS
-    bool eventFilter(QObject *object, QEvent *event);
-    void destroySliderThumb();
-    #endif
+    void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const;
 
     void polish(QWidget *widget);
     void polish(QPalette &pal);
@@ -64,35 +55,12 @@ public:
     void unpolish(QWidget *widget);
     void unpolish(QApplication *app);
 
-#ifdef ENABLE_OVERLAYSCROLLBARS
-private Q_SLOTS:
-    void objectDestroyed(QObject *);
-    void sbarThumbMoved(const QPoint &point);
-    void sbarPageUp();
-    void sbarPageDown();
-    void sbarThumbHiding();
-    void sbarThumbShowing();
-
-private:
-    QRect sbarGetSliderRect() const;
-    void sbarUpdateOffset();
-    bool usePlainScrollbars(const QWidget *widget) const;
-#endif
-
 private:
     ShortcutHandler *shortcutHander;
-
     ScrollbarType sbarType;
     int sbarPlainViewWidth;
-
-    #ifdef ENABLE_OVERLAYSCROLLBARS
-    OsThumb *sbarThumb;
-    int sbarWidth;
-    int sbarAreaWidth;
-    int sbarOffset;
-    int sbarLastPos;
-    QScrollBar *sbarThumbTarget;
-    #endif
+    bool touchStyleSpin;
+    QMap<QString, QString> css;
 };
 
 #endif
diff --git a/support/gtkstyle.cpp b/support/gtkstyle.cpp
index 7a703a5..17fd934 100644
--- a/support/gtkstyle.cpp
+++ b/support/gtkstyle.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -43,7 +43,6 @@
 #endif
 
 static bool usingGtkStyle=false;
-static bool useFullGtkStyle=false;
 
 static inline void setup()
 {
@@ -52,7 +51,6 @@ static inline void setup()
     if (!init) {
         init=true;
         usingGtkStyle=QApplication::style()->inherits("QGtkStyle");
-        useFullGtkStyle=usingGtkStyle && qgetenv("KDE_FULL_SESSION").isEmpty();
     }
     #endif
 }
@@ -63,12 +61,6 @@ bool GtkStyle::isActive()
     return usingGtkStyle;
 }
 
-bool GtkStyle::mimicWidgets()
-{
-    setup();
-    return useFullGtkStyle;
-}
-
 void GtkStyle::drawSelection(const QStyleOptionViewItemV4 &opt, QPainter *painter, double opacity)
 {
     static const int constMaxDimension=32;
@@ -239,7 +231,7 @@ static GtkProxyStyle *gtkProxyStyle=0;
 static ProxyStyle *plainProxyStyle=0;
 #endif
 static bool symbolicIcons=false;
-static bool lightIcons=false;
+static QColor symbolicIconColor(0, 0, 0);
 
 void GtkStyle::applyTheme(QWidget *widget)
 {
@@ -255,36 +247,48 @@ void GtkStyle::applyTheme(QWidget *widget)
     if (widget && isActive()) {
         QString theme=GtkStyle::themeName().toLower();
         GtkProxyStyle::ScrollbarType sbType=GtkProxyStyle::SB_Standard;
+        bool touchStyleSpin=false;
+        QMap<QString, QString> css;
+        WindowManager *wm=0;
         if (!theme.isEmpty()) {
             QFile cssFile(QLatin1String(INSTALL_PREFIX"/share/")+QCoreApplication::applicationName()+QLatin1String("/themes/")+theme+QLatin1String(".css"));
-            if (cssFile.open(QFile::ReadOnly)) {
-                QString css=QLatin1String(cssFile.readAll());
-                QString header=css.left(100);
-                qApp->setStyleSheet(css);
-                if (header.contains("drag:toolbar")) {
-                    WindowManager *wm=new WindowManager(widget);
-                    wm->initialize(WindowManager::WM_DRAG_MENU_AND_TOOLBAR);
-                    wm->registerWidgetAndChildren(widget);
-                }
-                #ifdef ENABLE_OVERLAYSCROLLBARS
-                if (header.contains("scrollbar:overlay")) {
-                    sbType=GtkProxyStyle::SB_Overlay;
-                } else if (header.contains("scrollbar:thin")) {
-                    sbType=GtkProxyStyle::SB_Thin;
-                }
-                #else
-                if (header.contains("scrollbar:overlay") || header.contains("scrollbar:thin")) {
-                    sbType=GtkProxyStyle::SB_Thin;
+            if (cssFile.open(QFile::ReadOnly|QFile::Text)) {
+                const QString symKey=QLatin1String("symbolic-icons:#");
+
+                while (!cssFile.atEnd()) {
+                    QString line = cssFile.readLine().trimmed();
+                    if (line.isEmpty()) {
+                        continue;
+                    }
+                    if (line.startsWith(QLatin1String("/*"))) {
+                        if (!wm && line.contains("drag:toolbar")) {
+                            wm=new WindowManager(widget);
+                            wm->initialize(WindowManager::WM_DRAG_MENU_AND_TOOLBAR);
+                            wm->registerWidgetAndChildren(widget);
+                        }
+                        if (line.contains("scrollbar:overlay") || line.contains("scrollbar:thin")) {
+                            sbType=GtkProxyStyle::SB_Thin;
+                        }
+                        touchStyleSpin=line.contains("spinbox:touch");
+                        int pos=line.indexOf(symKey);
+                        if (pos>0 && pos+6<line.length()) {
+                            symbolicIcons=true;
+                            symbolicIconColor=QColor(line.mid(pos+symKey.length()-1, 7));
+                        }
+                    } else {
+                        int space=line.indexOf(' ');
+                        if (space>2) {
+                            QString key=line.left(space);
+                            css.insert(line.left(space), line);
+                        }
+                    }
                 }
-                #endif
-                symbolicIcons=header.contains("symbolic-icons:true");
-                lightIcons=header.contains("light-icons:true");
-                QCoreApplication::setAttribute(Qt::AA_DontShowIconsInMenus);
             }
         }
         if (!gtkProxyStyle) {
-            gtkProxyStyle=new GtkProxyStyle(sbType);
+            gtkProxyStyle=new GtkProxyStyle(sbType, touchStyleSpin, css);
             qApp->setStyle(gtkProxyStyle);
+            QCoreApplication::setAttribute(Qt::AA_DontShowIconsInMenus);
         }
     }
 
@@ -297,21 +301,12 @@ void GtkStyle::applyTheme(QWidget *widget)
     #endif
 }
 
-void GtkStyle::cleanup()
-{
-    #if !defined Q_OS_WIN && !defined QT_NO_STYLE_GTK && defined ENABLE_OVERLAYSCROLLBARS
-    if (gtkProxyStyle) {
-        gtkProxyStyle->destroySliderThumb();
-    }
-    #endif
-}
-
 bool GtkStyle::useSymbolicIcons()
 {
     return symbolicIcons;
 }
 
-bool GtkStyle::useLightIcons()
+QColor GtkStyle::symbolicColor()
 {
-    return lightIcons;
+    return symbolicIconColor;
 }
diff --git a/support/gtkstyle.h b/support/gtkstyle.h
index ed0a621..b5f2f19 100644
--- a/support/gtkstyle.h
+++ b/support/gtkstyle.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -33,16 +33,14 @@ class QWidget;
 namespace GtkStyle
 {
     extern bool isActive();
-    extern bool mimicWidgets();
     extern void drawSelection(const QStyleOptionViewItemV4 &opt, QPainter *painter, double opacity);
     extern QString themeName();
     extern QString iconTheme();
     extern void setThemeName(const QString &n);
     extern void setIconTheme(const QString &n);
     extern void applyTheme(QWidget *widget);
-    extern void cleanup();
     extern bool useSymbolicIcons();
-    extern bool useLightIcons();
+    extern QColor symbolicColor();
 }
 
 #endif
diff --git a/support/icon.cpp b/support/icon.cpp
index 993a615..83b5fe1 100644
--- a/support/icon.cpp
+++ b/support/icon.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/icon.h b/support/icon.h
index 659e4f5..a3b66d5 100644
--- a/support/icon.h
+++ b/support/icon.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/inputdialog.cpp b/support/inputdialog.cpp
index 2c9c2be..3e16c2e 100644
--- a/support/inputdialog.cpp
+++ b/support/inputdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -23,12 +23,12 @@
 
 #include "inputdialog.h"
 #include "gtkstyle.h"
-#include "spinbox.h"
 #include "lineedit.h"
 #include "dialog.h"
 #include "utils.h"
 #include <QLabel>
 #include <QBoxLayout>
+#include <QSpinBox>
 
 InputDialog::InputDialog(const QString &caption, const QString &label, const QString &value, QLineEdit::EchoMode echo, QWidget *parent)
     : Dialog(parent)
@@ -58,7 +58,7 @@ void InputDialog::init(bool intInput, const QString &caption, const QString &lab
     QBoxLayout *layout=new QBoxLayout(QBoxLayout::TopToBottom, wid);
 
     if (intInput) {
-        spin=new SpinBox(wid);
+        spin=new QSpinBox(wid);
         spin->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
         setMinimumWidth(Utils::isHighDpi() ? 600 : 300);
     } else {
@@ -67,7 +67,7 @@ void InputDialog::init(bool intInput, const QString &caption, const QString &lab
         setMinimumWidth(Utils::isHighDpi() ? 700 : 350);
     }
     layout->addWidget(new QLabel(label, wid));
-    layout->addWidget(intInput ? (QWidget *)spin : (QWidget *)edit);
+    layout->addWidget(intInput ? static_cast<QWidget *>(spin) : static_cast<QWidget *>(edit));
     layout->setMargin(0);
 
     setCaption(caption);
diff --git a/support/inputdialog.h b/support/inputdialog.h
index 0b597db..e7a98f8 100644
--- a/support/inputdialog.h
+++ b/support/inputdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -28,7 +28,7 @@
 #include "localize.h"
 #include "dialog.h"
 
-class SpinBox;
+class QSpinBox;
 class LineEdit;
 
 class InputDialog : public Dialog
@@ -58,7 +58,7 @@ private Q_SLOTS:
     void enableOkButton();
 
 private:
-    SpinBox *spin;
+    QSpinBox *spin;
     LineEdit *edit;
 };
 
diff --git a/support/kmessagewidget.cpp b/support/kmessagewidget.cpp
index c433624..b7f1e61 100644
--- a/support/kmessagewidget.cpp
+++ b/support/kmessagewidget.cpp
@@ -214,6 +214,19 @@ int KMsgWidgetPrivate::bestContentHeight() const
     return height;
 }
 
+#ifdef ENABLE_KDE_SUPPORT
+void KMsgWidgetPrivate::updateAnimationDuration()
+{
+    if (!(KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects)) {
+        if (1!=timeLine->duration()) {
+            timeLine->setDuration(1);
+        }
+    } else if (500!=timeLine->duration()) {
+        timeLine->setDuration(500);
+    }
+}
+#endif
+
 //---------------------------------------------------------------------
 // KMsgWidget
 //---------------------------------------------------------------------
@@ -434,10 +447,11 @@ void KMsgWidget::removeAction(QAction* action)
 void KMsgWidget::animatedShow()
 {
     #ifdef ENABLE_KDE_SUPPORT
-    if (!(KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects)) {
-        show();
-        return;
-    }
+    //if (!(KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects)) {
+    //    show();
+    //    return;
+    //}
+    d->updateAnimationDuration();
     #endif
 
     if (isVisible()) {
@@ -460,10 +474,11 @@ void KMsgWidget::animatedShow()
 void KMsgWidget::animatedHide()
 {
     #ifdef ENABLE_KDE_SUPPORT
-    if (!(KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects)) {
-        hide();
-        return;
-    }
+    //if (!(KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects)) {
+    //    hide();
+    //    return;
+    //}
+    d->updateAnimationDuration();
     #endif
 
     if (!isVisible()) {
diff --git a/support/kmessagewidget.h b/support/kmessagewidget.h
index 3696dd5..b72fad6 100644
--- a/support/kmessagewidget.h
+++ b/support/kmessagewidget.h
@@ -196,6 +196,9 @@ public:
     void slotTimeLineChanged(qreal);
     void slotTimeLineFinished();
     int bestContentHeight() const;
+    #ifdef ENABLE_KDE_SUPPORT
+    void updateAnimationDuration();
+    #endif
 };
 
 #endif /* KMESSAGEWIDGET_H */
diff --git a/support/lineedit.cpp b/support/lineedit.cpp
index 7f84ca5..c597ad5 100644
--- a/support/lineedit.cpp
+++ b/support/lineedit.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -41,7 +41,7 @@ void LineEdit::setReadOnly(bool e)
     }
 }
 
-#ifndef ENABLE_KDE_SUPPORT
+#if !defined ENABLE_KDE_SUPPORT && QT_VERSION < 0x050200
 
 /****************************************************************************
 **
@@ -57,7 +57,7 @@ void LineEdit::setReadOnly(bool e)
 #include <QToolButton>
 #include <QStyle>
 #include <QComboBox>
-#include <QDebug>
+
 LineEdit::LineEdit(QWidget *parent)
     : QLineEdit(parent)
 {
@@ -81,14 +81,14 @@ LineEdit::LineEdit(QWidget *parent)
                        QLatin1String(": %1px; ")+QLatin1String(onCombo ? "background: transparent " : "")+QChar('}');
     setStyleSheet(styleSheet.arg(clearButton->sizeHint().width() + frameWidth + 1));
 
-    if (!onCombo) {
+    if (!onCombo && (!parent || !parent->property("cantata-delegate").isValid())) {
         QSize msz = minimumSizeHint();
         setMinimumSize(qMax(msz.width(), clearButton->sizeHint().height() + frameWidth * 2 + 2),
                        qMax(msz.height(), clearButton->sizeHint().height() + frameWidth * 2 + 2));
     }
 }
 
-void LineEdit::resizeEvent(QResizeEvent *)
+void LineEdit::resizeEvent(QResizeEvent *e)
 {
     QSize sz = clearButton->sizeHint();
     int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
@@ -97,9 +97,10 @@ void LineEdit::resizeEvent(QResizeEvent *)
     } else {
         clearButton->move(rect().right() - frameWidth - sz.width(), (rect().bottom() + 1 - sz.height()) / 2);
     }
+    QLineEdit::resizeEvent(e);
 }
 
-void LineEdit::updateCloseButton(const QString& text)
+void LineEdit::updateCloseButton(const QString &text)
 {
     clearButton->setVisible(!isReadOnly() && !text.isEmpty());
 }
diff --git a/support/lineedit.h b/support/lineedit.h
index f997c7f..dde2d2a 100644
--- a/support/lineedit.h
+++ b/support/lineedit.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -33,6 +33,8 @@
 #ifndef LINEEDIT_H
 #define LINEEDIT_H
 
+#include <QLineEdit>
+
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KLineEdit>
 class LineEdit : public KLineEdit
@@ -43,11 +45,19 @@ public:
     void setReadOnly(bool e);
 };
 
+#elif QT_VERSION >= 0x050200
+
+class LineEdit : public QLineEdit
+{
+public:
+    LineEdit(QWidget *parent = 0) : QLineEdit(parent) { setClearButtonEnabled(true); }
+    virtual ~LineEdit() { }
+    void setReadOnly(bool e);
+};
+
 #else
-#include <QLineEdit>
 
 class QToolButton;
-
 class LineEdit : public QLineEdit
 {
     Q_OBJECT
@@ -55,11 +65,10 @@ class LineEdit : public QLineEdit
 public:
     LineEdit(QWidget *parent = 0);
     virtual ~LineEdit() { }
-
     void setReadOnly(bool e);
 
 protected:
-    void resizeEvent(QResizeEvent *);
+    void resizeEvent(QResizeEvent *e);
 
 private Q_SLOTS:
     void updateCloseButton(const QString &text);
@@ -71,4 +80,3 @@ private:
 #endif
 
 #endif // LIENEDIT_H
-
diff --git a/support/localize.h b/support/localize.h
index 52cc0d3..a27851f 100644
--- a/support/localize.h
+++ b/support/localize.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/messagebox.cpp b/support/messagebox.cpp
index 0f7b797..87d5f58 100644
--- a/support/messagebox.cpp
+++ b/support/messagebox.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/messagebox.h b/support/messagebox.h
index bed287e..504b3b5 100644
--- a/support/messagebox.h
+++ b/support/messagebox.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/messagewidget.cpp b/support/messagewidget.cpp
index d710dce..3126189 100644
--- a/support/messagewidget.cpp
+++ b/support/messagewidget.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/messagewidget.h b/support/messagewidget.h
index 6ac4c82..14090ae 100644
--- a/support/messagewidget.h
+++ b/support/messagewidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/onoffbutton.cpp b/support/onoffbutton.cpp
deleted file mode 100644
index 8dc08a7..0000000
--- a/support/onoffbutton.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Cantata
- *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
- *
- * ----
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifndef Q_OS_WIN
-
-#include "onoffbutton.h"
-#include "localize.h"
-#include "gtkstyle.h"
-#include <QFontMetrics>
-#include <QPainter>
-#include <QPainterPath>
-#include <QLinearGradient>
-
-static QString onText;
-static QString offText;
-static QSize fixedSize;
-static const int constBorderSize=4;
-
-OnOffButton::OnOffButton(QWidget *p)
-    : QCheckBox(p)
-{
-    if (GtkStyle::mimicWidgets()) {
-        QFont f(font());
-        f.setPointSize(f.pointSize()*0.9);
-        setFont(f);
-        if (onText.isEmpty()) {
-            onText=i18n("ON");
-            offText=i18n("OFF");
-            QFontMetrics fm(f);
-            int onWidth=fm.width(onText);
-            int offWidth=fm.width(offText);
-            int fontHeight=fm.height();
-            fixedSize=QSize((qMax(onWidth, offWidth)+(constBorderSize*4))*2, fontHeight+(2.5*constBorderSize));
-        }
-        setCheckable(true);
-        setFixedSize(fixedSize);
-    }
-}
-
-QSize OnOffButton::sizeHint() const
-{
-    return GtkStyle::mimicWidgets() ? fixedSize : QCheckBox::sizeHint();
-}
-
-bool OnOffButton::hitButton(const QPoint &pos) const
-{
-    return GtkStyle::mimicWidgets() ? true : QCheckBox::hitButton(pos);
-}
-
-static QPainterPath buildPath(const QRectF &r, double radius)
-{
-    QPainterPath path;
-    double diameter(radius*2);
-
-    path.moveTo(r.x()+r.width(), r.y()+r.height()-radius);
-    path.arcTo(r.x()+r.width()-diameter, r.y(), diameter, diameter, 0, 90);
-    path.arcTo(r.x(), r.y(), diameter, diameter, 90, 90);
-    path.arcTo(r.x(), r.y()+r.height()-diameter, diameter, diameter, 180, 90);
-    path.arcTo(r.x()+r.width()-diameter, r.y()+r.height()-diameter, diameter, diameter, 270, 90);
-    return path;
-}
-
-void OnOffButton::paintEvent(QPaintEvent *e)
-{
-    if (!GtkStyle::mimicWidgets()) {
-        QCheckBox::paintEvent(e);
-        return;
-    }
-
-    QPainter p(this);
-    p.setRenderHint(QPainter::Antialiasing);
-    const QPalette &pal=palette();
-    bool isOn=isChecked();
-    bool isActive=isEnabled() && QPalette::Active==pal.currentColorGroup();
-    QRect orig=rect();
-    QRectF r(orig.x()+1.5, orig.y()+1.5, orig.width()-3, orig.height()-3); //.adjusted(1.5, 1.5, -2, -2);
-    QRectF borderRect=r.adjusted(1, 1, -1, -1);
-    //QRect borderInnder=borderRect.adjusted(1, 1, -1, -1);
-    QRectF onRect=QRectF(borderRect.x(), borderRect.y(), borderRect.width()/2, borderRect.height());
-    QRectF offRect=QRectF(borderRect.x()+(borderRect.width()/2), borderRect.y(), borderRect.width()/2, borderRect.height());
-    QPainterPath border=buildPath(borderRect, 3.0);
-    //QPainterPath inner=buildPath(borderInnder, 2.0);
-    QPainterPath slider=buildPath(isOn ? offRect.adjusted(-0.5, 0, 0, 0) : onRect.adjusted(0, 0, 0.5, 0), 3.0);
-    QPainterPath sliderInner=buildPath((isOn ? offRect : onRect).adjusted(1, 1, -1, -1), 2.0);
-    QLinearGradient grad(borderRect.topLeft(), borderRect.bottomLeft());
-    bool active=isOn && isActive;
-    QColor bgndCol=active ? pal.highlight().color() : pal.button().color();
-    grad.setColorAt(0, active ? bgndCol.darker(110) : bgndCol.darker(120));
-    grad.setColorAt(1, active ? bgndCol.darker(102) : bgndCol.darker(108));
-    p.fillPath(border, grad);
-    QColor borderCol(bgndCol.darker(145));
-    p.setPen(borderCol);
-    p.drawPath(border);
-    //p.setPen(pal.light().color());
-    //p.drawText((isOn ? onRect : offRect).adjusted(1, 1, 1, 1), isOn ? onText : offText, QTextOption(Qt::AlignHCenter|Qt::AlignVCenter));
-    QColor textcol(isOn && isActive ? pal.highlightedText().color() : pal.text().color());
-    if (!isOn && textcol.red()<64 && textcol.green()<64 && textcol.blue()<64) {
-        QColor col=Qt::white;
-        col.setAlphaF(0.4);
-	    p.setPen(col);
-    	p.drawText(offRect.adjusted(0, 1, 0, 1), offText, QTextOption(Qt::AlignHCenter|Qt::AlignVCenter));
-    } else if (isOn && (isActive ? (textcol.red()>196 && textcol.green()>196 && textcol.blue()>196)
-                                 : (textcol.red()<64 && textcol.green()<64 && textcol.blue()<64))) {
-        QColor col=isActive ? bgndCol.darker(110) : Qt::white;
-        col.setAlphaF(isActive ? 0.9 : 0.4);
-	    p.setPen(col);
-    	p.drawText(isActive ? onRect.adjusted(0, -1, 0, -1) : onRect.adjusted(0, 1, 0, 1), onText, QTextOption(Qt::AlignHCenter|Qt::AlignVCenter));
-    }
-    p.setPen(textcol);
-    p.drawText(isOn ? onRect : offRect, isOn ? onText : offText, QTextOption(Qt::AlignHCenter|Qt::AlignVCenter));
-
-    grad.setColorAt(0, pal.button().color().lighter(105));
-    grad.setColorAt(0.5, pal.button().color().lighter(102));
-    grad.setColorAt(1, pal.button().color().darker(108));
-    p.fillPath(slider, grad);
-    QColor sliderCol(pal.button().color().lighter(170));
-    sliderCol.setAlphaF(0.4);
-    p.setPen(sliderCol);
-    p.drawPath(sliderInner);
-    p.setPen(borderCol);
-    p.drawPath(slider);
-
-    if (hasFocus()) {
-        p.setPen(pal.highlight().color());
-        p.drawPath(buildPath(QRectF(orig.x()+0.5, orig.y()+0.5, orig.width()-1, orig.height()-1), 4.0));
-    }
-}
-
-#endif
diff --git a/support/onoffbutton.h b/support/onoffbutton.h
deleted file mode 100644
index 7657df6..0000000
--- a/support/onoffbutton.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Cantata
- *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
- *
- * ----
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifndef ONOFF_BUTTON_H
-#define ONOFF_BUTTON_H
-
-#include <QCheckBox>
-
-#ifdef Q_OS_WIN
-typedef QCheckBox OnOffButton;
-#else
-class OnOffButton : public QCheckBox
-{
-public:
-    OnOffButton(QWidget *p);
-    virtual ~OnOffButton() { }
-
-    QSize sizeHint() const;
-    bool hitButton(const QPoint &pos) const;
-
-protected:
-    void paintEvent(QPaintEvent *e);
-};
-#endif
-
-#endif
-
diff --git a/support/osthumb.cpp b/support/osthumb.cpp
deleted file mode 100644
index bef5b94..0000000
--- a/support/osthumb.cpp
+++ /dev/null
@@ -1,464 +0,0 @@
-#include "osthumb.h"
-
-#include <QTimer>
-#include <QPainter>
-#include <QApplication>
-#include <QFontMetrics>
-#include <QMouseEvent>
-
-static int thumbWidth=20;
-static int thumbHeight=72;
-//#define THUMB_WIDTH          20
-//#define THUMB_HEIGHT         72
-#define THUMB_WIDTH thumbWidth
-#define THUMB_HEIGHT thumbHeight
-#define OUTLINE_THICKNESS     2
-#define ANIMATION_TIMEOUT    10
-#define HIDE_TIMEOUT        100
-#define ANIMATION_ALPHA_INC  15
-
-///*
-// *  Variables used only for implementing methods.
-// */
-//QTimer *animationTimer; // The timer used to set the timeout for updating the alpha of the thumb
-//                        // (used for fade in/out animation).
-//QTimer *hideTimer;
-//int alpha; // Current alpha of the thumb.
-//int yPos;  // The position the thumb is to be moved (when aligned vertically).
-//int xPos;  // Same as above (when aligned horizontally).
-//bool mouseButtonPressed; // Holds the state of the left mouse button.
-//bool wasDragged; // The widget has been dragged (neded to separate click on page up/down and drag action).
-
-class OsThumbPrivate
-{
-    Q_DECLARE_PUBLIC(OsThumb)
-
-public:
-    OsThumbPrivate(OsThumb *q);
-    bool hidden;
-    Qt::Orientation orientation;
-    int minimum;
-    int maximum;
-    OsThumb *q_ptr;
-    void checkForLeave(QMouseEvent *event);
-
-    /*
-     *  Variables used only for implementing methods.
-     */
-    QTimer *animationTimer; // The timer used to set the timeout for updating the alpha of the thumb
-                            // (used for fade in/out animation).
-    QTimer *hideTimer;
-    int alpha; // Current alpha of the thumb.
-    int yPos;  // The position the thumb is to be moved (when aligned vertically).
-    int xPos;  // Same as above (when aligned horizontally).
-    bool mouseButtonPressed; // Holds the state of the left mouse button.
-    bool wasDragged; // The widget has been dragged (neded to separate click on page up/down and drag action).
-};
-
-OsThumbPrivate::OsThumbPrivate(OsThumb *q) : q_ptr(q)
-{
-    /*
-     *  Initialize variables used only in implementation.
-     */
-    alpha = 0;
-    animationTimer = new QTimer(q);
-    hideTimer = new QTimer(q);
-    hideTimer->setSingleShot(true);
-    wasDragged = false;
-}
-
-void OsThumbPrivate::checkForLeave(QMouseEvent *event)
-{
-    Q_Q(OsThumb);
-
-    if (mouseButtonPressed) {
-        return;
-    }
-    if (orientation == Qt::Vertical) {
-        if ((event->globalX() >= q->geometry().x() + q->width()) ||
-            (event->globalY() < q->geometry().y()) ||
-            (event->globalY() >= q->geometry().y() + q->height())
-           )
-            hideTimer->start(HIDE_TIMEOUT);
-    } else {
-        if ((event->globalY() >= q->geometry().y() + q->height()) ||
-            (event->globalX() < q->geometry().x()) ||
-            (event->globalX() >= q->geometry().x() + q->width())
-           )
-            hideTimer->start(HIDE_TIMEOUT);
-    }
-}
-
-OsThumb::OsThumb(Qt::Orientation o, QWidget *parent) :
-    QWidget(parent), d_ptr(new OsThumbPrivate(this))
-{
-    int fh=QApplication::fontMetrics().height();
-    thumbWidth=qMax(20, fh);
-    thumbWidth=(((int)(thumbWidth/2))*2)+(thumbWidth%2 ? 2 : 0);
-    thumbHeight=thumbWidth*3.5;
-
-    /*
-     *  Set up orientation.
-     */
-    setOrientation(o);
-    if (o == Qt::Vertical)
-        setFixedSize(THUMB_WIDTH, THUMB_HEIGHT);
-    else
-        setFixedSize(THUMB_HEIGHT, THUMB_WIDTH);
-
-    /*
-     *  Set some window properties. The thumb needs to be a separate window with no border, no background
-     *  and it needs to bypass the window manager in order to have a custom behaviour.
-     *  (Thank you Andrea for the idea)
-     */
-    setWindowFlags(Qt::X11BypassWindowManagerHint);
-    setAttribute(Qt::WA_TranslucentBackground);
-
-    /*
-     *  Initialize class properties.
-     */
-    setHidden(false);
-    setMouseTracking(true);
-
-//    /*
-//     *  Initialize variables used only in implementation.
-//     */
-//    alpha = 0;
-//    animationTimer = new QTimer(this);
-//    hideTimer = new QTimer(this);
-//    hideTimer->setSingleShot(true);
-//    wasDragged = false;
-
-    /*
-     *  Connect the animationTimer to the update() method so that the paintEvent() is triggered and the thumb is
-     *  redrawn with a new alpha. The timer stops when alpha reaches 255 (fade in) or 0 (fade out). Also connect
-     *  the hideTimer so that when the mouse pointer leaves the thumb it hides after 200 ms if there is no other
-     *  action performed on the thumb.
-     */
-    QObject::connect(d_ptr->animationTimer, SIGNAL(timeout()), this, SLOT(update()));
-    QObject::connect(d_ptr->hideTimer, SIGNAL(timeout()), this, SLOT(hide()));
-}
-
-void OsThumb::paintEvent(QPaintEvent *event)
-{
-    Q_UNUSED(event)
-    Q_D(OsThumb);
-    /*
-         *  Initialize the painter and set up the colors that are going to be used for drawing the thumb's
-         *  elements.
-         */
-        QPainter painter(this);
-        QPalette palette;
-        QColor thumbStartColor = QColor::fromRgb(0xf2f1f0);
-        QColor thumbStopColor = QColor::fromRgb(0xd2dedc);
-        QColor outlineColor = palette.color(QPalette::Highlight);
-        QColor arrowColor(Qt::black);
-        QColor etchColor(Qt::white);
-        QLinearGradient fill(1, 1, THUMB_WIDTH - 2, THUMB_HEIGHT - 2);
-
-        int start=(THUMB_WIDTH/4)*1.5;
-        int size=THUMB_WIDTH/5;
-        QPoint pgUpPoints[] = {
-            QPoint(THUMB_WIDTH/2, start),
-            QPoint(THUMB_WIDTH/2 + size, start+size+1),
-            QPoint(THUMB_WIDTH/2 - size, start+size+1)
-        };
-        QPoint pgDownPoints[] = {
-            QPoint(THUMB_WIDTH/2, THUMB_HEIGHT - start/*75*/),
-            QPoint(THUMB_WIDTH/2 + size, THUMB_HEIGHT - (start+size+1)/*69*/),
-            QPoint(THUMB_WIDTH/2 - size, THUMB_HEIGHT - (start+size+1)/*69*/)
-        };
-
-        /*
-         *  The folowing condition is responsible for the alpha setting during the animation. If the thumb
-         *  is hidden that means that is about to be drawn therefor we increment the alpha value by
-         *  ANIMATION_ALPHA_INC, once the alpha is at it's maximum value (255) we stop the timer. If the
-         *  thumb is shown (!hidden) we decrement the alpha value by ANIMATION_ALPHA_INC until it reaches
-         *  it's minimum (0), at which time we stop the timer and hide the widget.
-         */
-        if (hidden())
-        {
-            if (d->alpha >= 255)
-            {
-                d->animationTimer->stop();
-            }
-            else
-                d->alpha += ANIMATION_ALPHA_INC;
-            if (d->alpha>100) {
-                emit showing();
-            }
-        }
-        else
-        {
-            if (d->alpha <= 0)
-            {
-                d->animationTimer->stop();
-                setVisible(false);
-            }
-            else
-                d->alpha -= ANIMATION_ALPHA_INC;
-            if (d->alpha<100) {
-                emit hiding();
-            }
-        }
-
-        /*
-         *  Set the current alpha for each individual color of the widget.
-         */
-        thumbStartColor.setAlpha(d->alpha);
-        thumbStopColor.setAlpha(d->alpha);
-        outlineColor.setAlpha(d->alpha);
-        arrowColor.setAlpha(d->alpha*0.5);
-        etchColor.setAlpha(d->alpha*0.5);
-
-        /*
-         *  Set up the gradient used for filling the widget
-         */
-        fill.setColorAt(0, thumbStartColor);
-        fill.setColorAt(0.5, thumbStopColor);
-        fill.setColorAt(1, thumbStartColor);
-
-        /*
-         *  Save the current painter state onto the stack
-         */
-        painter.save();
-
-        /*
-         *  Set up antialiasing
-         */
-        painter.setRenderHint(QPainter::Antialiasing);
-
-        /*
-         *  Check if the widget is horizontal, and if it is apply required transformations to the painter and thumb
-         */
-        if (orientation() == Qt::Horizontal)
-        {
-            painter.translate(THUMB_HEIGHT, 0);
-            painter.rotate(90);
-        }
-
-        /*
-         *  Draw the widget's contents
-         */
-        painter.setPen(Qt::NoPen);
-        painter.setBrush(QBrush(fill));
-        painter.drawRect(1, 1, THUMB_WIDTH - 2, THUMB_HEIGHT - 2);
-
-        painter.setPen(QPen(outlineColor, OUTLINE_THICKNESS));
-        painter.setBrush(Qt::NoBrush);
-        painter.drawRect(1, 1, THUMB_WIDTH - 2, THUMB_HEIGHT - 2);
-
-        painter.setPen(Qt::NoPen);
-        painter.setBrush(QBrush(arrowColor, Qt::SolidPattern));
-        painter.drawConvexPolygon(pgUpPoints, 3);
-        painter.drawConvexPolygon(pgDownPoints, 3);
-
-        arrowColor.setAlphaF(arrowColor.alphaF()*0.4);
-        painter.setPen(arrowColor);
-        painter.drawLine(QPointF(3.5, (THUMB_HEIGHT/2)+0.5), QPointF(THUMB_WIDTH-3.5, (THUMB_HEIGHT/2)+0.5));
-        painter.setPen(etchColor);
-        painter.drawLine(QPointF(3.5, (THUMB_HEIGHT/2)+1.5), QPointF(THUMB_WIDTH-3.5, (THUMB_HEIGHT/2)+1.5));
-
-        // TODO: Draw dots...
-
-        /*
-         *  Pop the new painter state from the stack
-         */
-        painter.restore();
-}
-
-void OsThumb::show()
-{
-    Q_D(OsThumb);
-    /*
-     *  Show the thumb (in case it was not already shown), in case it was fading out stop the animation,
-     *  set the thumb's current state (visibility wise) (hidden property) to true in order for
-     *  the paintEvent to start incrementing the alpha value of the thumb, and start the animation again.
-     */
-    setVisible(true);
-    d->animationTimer->stop();
-    setHidden(true);
-    d->animationTimer->start(ANIMATION_TIMEOUT);
-}
-
-void OsThumb::hide()
-{
-    Q_D(OsThumb);
-    /*
-     *  In case it was fading out stop the animation, set the thumb's current state (visibility wise)
-     *  (hidden property) to false in order for the paintEvent to start decrementing the alpha value
-     *  of the thumb, and start the animation again.
-     */
-    d->animationTimer->stop();
-    setHidden(false);
-    d->animationTimer->start(ANIMATION_TIMEOUT);
-}
-
-void OsThumb::mousePressEvent(QMouseEvent *event)
-{
-    Q_D(OsThumb);
-    d->hideTimer->stop();
-    /*
-     *  Verify that the left mouse button was pressed and save the position at which the event
-     *  occurred. Set the mouseButtonPressed property to true in order to initiate dragging in case
-     *  the user moves the mouse (mouseMoveEvent occurres) while the left mouse button is pressed.
-     */
-    if (event->button() == Qt::LeftButton)
-    {
-        d->yPos = event->pos().y();
-        d->xPos = event->pos().x();
-        d->mouseButtonPressed = true;
-    }
-    //else QApplication::quit();
-}
-
-void OsThumb::mouseMoveEvent(QMouseEvent *event)
-{
-    Q_D(OsThumb);
-
-    d->hideTimer->stop();
-    d->checkForLeave(event);
-    /*
-     *  If the mouse button is pressed and the user starts moving the mouse; move the thumb
-     *  to the mouse's Y position (vertical) or X position (horizontal). Also don't move the thumb
-     *  outside the proximity region's boundries. Set wasDragged property to true so that when
-     *  the mouseReleaseEvent occurs don't initiate a pageUp or pageDown movement within the
-     *  scrollable content.
-     */
-    if (d->mouseButtonPressed) {
-        int toXPos = x();
-        int toYPos = y();
-
-        if (orientation() == Qt::Vertical) {
-            // vertical movement
-            toYPos = event->globalY() - d->yPos;
-            int minYPos = minimum();
-            int maxYPos = maximum();
-
-            if (toYPos < minYPos)
-                toYPos = minYPos;
-            if (toYPos > maxYPos)
-                toYPos = maxYPos;
-            // end vertical movement
-        } else {
-            // horizontal movement
-            toXPos = event->globalX() - d->xPos;
-            int minXPos = minimum();
-            int maxXPos = maximum();
-
-            if (toXPos < minXPos)
-                toXPos = minXPos;
-            if (toXPos > maxXPos)
-                toXPos = maxXPos;
-            // end horizontal movement
-        }
-
-        move(toXPos, toYPos);
-
-        d->wasDragged = true;
-
-        emit thumbDragged(QPoint(toXPos,toYPos));
-    }
-}
-
-void OsThumb::mouseReleaseEvent(QMouseEvent *event)
-{
-    Q_D(OsThumb);
-
-    d->hideTimer->stop();
-
-    /*
-     *  When the mouse button is released set mouseButton pressed to false, verify if the thumb has beed dragged
-     *  if it has then check if the mouse pointer has left the thumb's surface and hide it or not accordingly.
-     */
-    d->mouseButtonPressed = false;
-
-    if (d->wasDragged) {
-        d->wasDragged = false;
-
-        d->checkForLeave(event);
-
-    /*
-     *  If the thumb wasn't dragged, based on orientation, the user clicked the top/bottom, lef/right arrow and
-     *  the content should scroll one page in the respective direction.
-     */
-    } else {
-        if (orientation() == Qt::Vertical)
-        {
-            if (event->y() < THUMB_HEIGHT / 2)
-                emit pageUp();
-            if (event->y() > THUMB_HEIGHT / 2)
-                emit pageDown();
-        }
-        else
-        {
-            if (event->x() < THUMB_HEIGHT / 2)
-                emit pageUp();
-            if (event->x() > THUMB_HEIGHT / 2)
-                emit pageDown();
-        }
-    }
-}
-
-bool OsThumb::isVisible() const
-{
-    return hidden();
-}
-
-bool OsThumb::mouseButtonPressed() const
-{
-    Q_D(const OsThumb);
-    return d->mouseButtonPressed;
-}
-
-Qt::Orientation OsThumb::orientation() const
-{
-    Q_D(const OsThumb);
-    return d->orientation;
-}
-
-void OsThumb::setOrientation(Qt::Orientation o)
-{
-    Q_D(OsThumb);
-    d->orientation = o;
-    if (o == Qt::Vertical)
-        setFixedSize(THUMB_WIDTH, THUMB_HEIGHT);
-    else
-        setFixedSize(THUMB_HEIGHT, THUMB_WIDTH);
-}
-
-int OsThumb::minimum() const
-{
-    Q_D(const OsThumb);
-    return d->minimum;
-}
-
-int OsThumb::maximum() const
-{
-    Q_D(const OsThumb);
-    return d->maximum;
-}
-
-void OsThumb::setMinimum(int minimum)
-{
-    Q_D(OsThumb);
-    d->minimum = minimum;
-}
-
-void OsThumb::setMaximum(int maximum)
-{
-    Q_D(OsThumb);
-    d->maximum = maximum;
-}
-
-bool OsThumb::hidden() const
-{
-    Q_D(const OsThumb);
-    return d->hidden;
-}
-
-void OsThumb::setHidden(bool hidden)
-{
-    Q_D(OsThumb);
-    d->hidden = hidden;
-}
diff --git a/support/osthumb.h b/support/osthumb.h
deleted file mode 100644
index 63eac7f..0000000
--- a/support/osthumb.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* liboverlay-scrollbar-qt
- *
- * Copyright © 2011 Canonical Ltd
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- *
- * Authored by Romeo Calota (kicsyromy at gmail.com)
- */
-
-#ifndef OSTHUMB_H
-#define OSTHUMB_H
-
-#include <QWidget>
-
-class OsThumbPrivate;
-
-class OsThumb : public QWidget
-{
-    Q_OBJECT
-    Q_PROPERTY(bool hidden READ hidden WRITE setHidden)
-    Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation)
-    Q_PROPERTY(int minimum READ minimum WRITE setMinimum)
-    Q_PROPERTY(int maximum READ maximum WRITE setMaximum)
-
-public:
-    explicit OsThumb(Qt::Orientation = Qt::Vertical, QWidget *parent = 0);
-    Qt::Orientation orientation() const;
-    void setOrientation(Qt::Orientation);
-    int minimum() const;
-    int maximum() const;
-    void setMinimum(int minimum);
-    void setMaximum(int maximum);
-    bool isVisible() const;
-    bool mouseButtonPressed() const;
-
-protected:
-    OsThumbPrivate * const d_ptr;
-
-    void paintEvent(QPaintEvent *);
-    void mouseMoveEvent(QMouseEvent *);
-    void mousePressEvent(QMouseEvent *);
-    void mouseReleaseEvent(QMouseEvent *);
-
-Q_SIGNALS:
-    void thumbDragged(QPoint coordinates);
-    void pageUp();
-    void pageDown();
-    void hiding();
-    void showing();
-
-public Q_SLOTS:
-    void show();
-    void hide();
-
-private:
-    Q_DECLARE_PRIVATE(OsThumb);
-    bool hidden() const;
-    void setHidden(bool hidden);
-};
-
-#endif // OSTHUMB_H
diff --git a/support/pagewidget.cpp b/support/pagewidget.cpp
index ae0222f..1ad488e 100644
--- a/support/pagewidget.cpp
+++ b/support/pagewidget.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -58,6 +58,7 @@ class PageWidgetItemDelegate : public QAbstractItemDelegate
 public:
     PageWidgetItemDelegate(QObject *parent)
         : QAbstractItemDelegate(parent)
+        , underMouse(false)
     {
         int height=QApplication::fontMetrics().height();
         iconSize=height>22 ? Icon::stdSize(height*2.5) : 32;
@@ -257,6 +258,7 @@ PageWidget::PageWidget(QWidget *p)
     list = new QListWidget(p);
     stack = new QStackedWidget(p);
     connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int)));
+    connect(stack, SIGNAL(currentChanged(int)), this, SIGNAL(currentPageChanged()));
     layout->addWidget(list);
     layout->addWidget(stack);
     layout->setMargin(0);
diff --git a/support/pagewidget.h b/support/pagewidget.h
index e77ab23..44fecaa 100644
--- a/support/pagewidget.h
+++ b/support/pagewidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -32,8 +32,11 @@ typedef KPageWidgetItem PageWidgetItem;
 
 class PageWidget : public KPageWidget
 {
+    Q_OBJECT
 public:
-    PageWidget(QWidget *p) : KPageWidget(p) { }
+    PageWidget(QWidget *p) : KPageWidget(p) {
+        connect(this, SIGNAL(currentPageChanged(KPageWidgetItem *, KPageWidgetItem *)), this, SIGNAL(currentPageChanged()));
+    }
     virtual ~PageWidget() { }
     PageWidgetItem * addPage(QWidget *widget, const QString &name, const Icon &icon, const QString &header) {
         PageWidgetItem *item=KPageWidget::addPage(widget, name);
@@ -42,6 +45,9 @@ public:
         adjustSize();
         return item;
     }
+
+Q_SIGNALS:
+    void currentPageChanged();
 };
 
 #else
@@ -65,6 +71,8 @@ private:
 
 class PageWidget : public QWidget
 {
+    Q_OBJECT
+
 public:
     PageWidget(QWidget *p);
     virtual ~PageWidget() { }
@@ -73,6 +81,9 @@ public:
     PageWidgetItem * currentPage() const;
     void setCurrentPage(PageWidgetItem *item);
 
+Q_SIGNALS:
+    void currentPageChanged();
+
 private:
     QListWidget *list;
     QStackedWidget *stack;
diff --git a/support/pathrequester.cpp b/support/pathrequester.cpp
index 35a8457..36431e8 100644
--- a/support/pathrequester.cpp
+++ b/support/pathrequester.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/pathrequester.h b/support/pathrequester.h
index 38ce5c9..2550b8e 100644
--- a/support/pathrequester.h
+++ b/support/pathrequester.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/proxystyle.cpp b/support/proxystyle.cpp
index 2e5922f..d88a322 100644
--- a/support/proxystyle.cpp
+++ b/support/proxystyle.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/proxystyle.h b/support/proxystyle.h
index d105e46..657444c 100644
--- a/support/proxystyle.h
+++ b/support/proxystyle.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/shortcuthandler.cpp b/support/shortcuthandler.cpp
index 4f06a3f..044bc9c 100644
--- a/support/shortcuthandler.cpp
+++ b/support/shortcuthandler.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -46,7 +46,7 @@ bool ShortcutHandler::hasSeenAlt(const QWidget *widget) const
     if (qobject_cast<const QMenu *>(widget)) {
         return openMenus.count() && openMenus.last()==widget;
     } else {
-        return openMenus.isEmpty() && seenAlt.contains((QWidget *)(widget->window()));
+        return openMenus.isEmpty() && seenAlt.contains(static_cast<QWidget *>(widget->window()));
     }
 }
 
diff --git a/support/shortcuthandler.h b/support/shortcuthandler.h
index c8223ef..a9fa6a3 100644
--- a/support/shortcuthandler.h
+++ b/support/shortcuthandler.h
@@ -4,7 +4,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/spinbox.cpp b/support/spinbox.cpp
deleted file mode 100644
index e696989..0000000
--- a/support/spinbox.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Cantata
- *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
- *
- * ----
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "spinbox.h"
-#include "icon.h"
-#include "gtkstyle.h"
-#include <QToolButton>
-#include <QHBoxLayout>
-#include <QSpacerItem>
-#include <QApplication>
-#include <QWheelEvent>
-#include <QApplication>
-#include <QPixmap>
-#include <QFont>
-#include <QPainter>
-#include <QLinearGradient>
-#include <QPalette>
-#include <QStyle>
-#include <QStyleOption>
-
-static Icon incIcon;
-static Icon decIcon;
-
-static QPixmap createPixmap(int size, QColor &col, double opacity, bool isPlus)
-{
-    int lineWidth=size<32 ? 2 : 4;
-    QPixmap pix(size, size);
-    pix.fill(Qt::transparent);
-    QPainter p(&pix);
-    p.setRenderHint(QPainter::Antialiasing, false);
-    p.setPen(QPen(col, lineWidth));
-    p.setOpacity(opacity);
-
-    int offset=size<=16 ? 4 : size<=22 ? 6 : 8; // lineWidth*2;
-    int pos=(size/2);
-    p.drawLine(offset, pos, size-offset, pos);
-    if (isPlus) {
-        p.drawLine(pos, offset, pos, size-offset);
-    }
-    p.end();
-    return pix;
-}
-
-static Icon createIcon(bool isPlus)
-{
-    Icon icon;
-    QColor stdColor=QColor(QApplication::palette().color(QPalette::Active, QPalette::ButtonText));
-    QColor highlightColor=stdColor.red()<100 ? stdColor.lighter(50) : stdColor.darker(50);
-    QList<int> sizes=QList<int>() << 16 << 22;
-
-    foreach (int s, sizes) {
-        icon.addPixmap(createPixmap(s, stdColor, 1.0, isPlus));
-        icon.addPixmap(createPixmap(s, stdColor, 0.5, isPlus), QIcon::Disabled);
-        icon.addPixmap(createPixmap(s, highlightColor, 1.0, isPlus), QIcon::Active);
-    }
-
-    return icon;
-}
-
-static void intButton(QToolButton *btn, bool inc)
-{
-    if (incIcon.isNull()) {
-        incIcon=createIcon(true);
-    }
-    if (decIcon.isNull()) {
-        decIcon=createIcon(false);
-    }
-    btn->setAutoRaise(true);
-    btn->setIcon(inc ? incIcon : decIcon);
-    btn->setAutoRepeat(true);
-}
-
-static QString toString(const QColor &col, int alpha)
-{
-    return QString("rgba(%1, %2, %3, %4%)").arg(col.red()).arg(col.green()).arg(col.blue()).arg(alpha);
-}
-
-class SpinBoxButton : public QToolButton
-{
-public:
-    SpinBoxButton(QWidget *p)
-        : QToolButton(p)
-    {
-        setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
-    }
-
-    QSize sizeHint() const
-    {
-        QSize sz=QToolButton::sizeHint();
-        if (sz.width()==sz.height()) {
-            sz.setWidth(sz.width()*1.5);
-        }
-        return sz;
-    }
-};
-
-SpinBox::SpinBox(QWidget *p)
-    : QWidget(p)
-    , incButton(0)
-    , decButton(0)
-    , spacer(0)
-{
-    QHBoxLayout *layout=new QHBoxLayout(this);
-    layout->setContentsMargins(0, 0, 0, 0);
-    layout->setSpacing(0);
-    spin=new EmptySpinBox(this);
-    connect(spin, SIGNAL(valueChanged(int)), SIGNAL(valueChanged(int)));
-    if (GtkStyle::mimicWidgets()) {
-        spin->setButtonSymbols(QAbstractSpinBox::NoButtons);
-        decButton=new SpinBoxButton(this);
-        incButton=new SpinBoxButton(this);
-        layout->addWidget(spin);
-        layout->addWidget(decButton);
-        layout->addWidget(incButton);
-        spacer=new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
-        layout->addItem(spacer);
-        connect(spin, SIGNAL(valueChanged(int)), SLOT(checkValue()));
-        connect(decButton, SIGNAL(pressed()), SLOT(decPressed()));
-        connect(incButton, SIGNAL(pressed()), SLOT(incPressed()));
-        intButton(decButton, false);
-        intButton(incButton, true);
-        decButton->installEventFilter(this);
-        incButton->installEventFilter(this);
-        QString stylesheet=QString("QToolButton { border: 0px } QToolButton:pressed { background-color: %2 } ")
-                           .arg(toString(palette().highlight().color(), 20));
-        decButton->setStyleSheet(stylesheet);
-        incButton->setStyleSheet(stylesheet);
-        decButton->setFocusPolicy(Qt::NoFocus);
-        incButton->setFocusPolicy(Qt::NoFocus);
-        spin->installEventFilter(this);
-    } else {
-        layout->addWidget(spin);
-    }
-}
-
-SpinBox::~SpinBox()
-{
-}
-
-void SpinBox::setValue(int v)
-{
-    spin->setValue(v);
-    if (GtkStyle::mimicWidgets()) {
-        checkValue();
-    }
-}
-
-void SpinBox::setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)
-{
-    spin->setSizePolicy(horizontal, vertical);
-    // If spin is set to expand, then we can remove our spacer...
-    if (QSizePolicy::MinimumExpanding==horizontal && spacer) {
-        layout()->removeItem(spacer);
-        delete spacer;
-        spacer=0;
-    }
-}
-
-void SpinBox::incPressed()
-{
-    spin->setValue(spin->value()+spin->singleStep());
-    checkValue();
-}
-
-void SpinBox::decPressed()
-{
-    spin->setValue(spin->value()-spin->singleStep());
-    checkValue();
-}
-
-void SpinBox::checkValue()
-{
-    decButton->setEnabled(spin->value()>spin->minimum());
-    incButton->setEnabled(spin->value()<spin->maximum());
-}
-
-static void drawLine(QPainter *painter, QColor col, const QPoint &start, const QPoint &end)
-{
-    QLinearGradient grad(start, end);
-    col.setAlphaF(0.0);
-    grad.setColorAt(0, col);
-    col.setAlphaF(0.25);
-    grad.setColorAt(0.25, col);
-    grad.setColorAt(0.8, col);
-    col.setAlphaF(0.0);
-    grad.setColorAt(1, col);
-    painter->setPen(QPen(QBrush(grad), 1));
-    painter->drawLine(start, end);
-}
-
-void SpinBox::paintEvent(QPaintEvent *e)
-{
-    if (GtkStyle::mimicWidgets()) {
-        QStyleOptionFrame opt;
-        opt.init(this);
-        opt.rect=spin->geometry().united(incButton->geometry()).united(decButton->geometry());
-        if (Qt::RightToLeft==QApplication::layoutDirection()) {
-            opt.rect.adjust(-1, 0, 1, 0);
-        } else {
-            opt.rect.adjust(0, 0, 1, 0);
-        }
-        opt.state=(isEnabled() ? (QStyle::State_Enabled|(spin->hasFocus() ? QStyle::State_HasFocus : QStyle::State_None)) : QStyle::State_None)|QStyle::State_Sunken;
-        opt.lineWidth=1;
-        QPainter painter(this);
-        QApplication::style()->drawPrimitive(QStyle::PE_PanelLineEdit, &opt, &painter, this);
-        QColor col(palette().foreground().color());
-        if (Qt::RightToLeft==QApplication::layoutDirection()) {
-            drawLine(&painter, col, incButton->geometry().topRight(), incButton->geometry().bottomRight());
-            drawLine(&painter, col, decButton->geometry().topRight(), decButton->geometry().bottomRight());
-        } else {
-            drawLine(&painter, col, incButton->geometry().topLeft(), incButton->geometry().bottomLeft());
-            drawLine(&painter, col, decButton->geometry().topLeft(), decButton->geometry().bottomLeft());
-        }
-    } else {
-        QWidget::paintEvent(e);
-    }
-}
-
-bool SpinBox::eventFilter(QObject *obj, QEvent *event)
-{
-    if (GtkStyle::mimicWidgets()) {
-        if ((obj==incButton || obj==decButton) && QEvent::Wheel==event->type()) {
-            QWheelEvent *we=(QWheelEvent *)event;
-            if (we->delta()<0) {
-                decPressed();
-            } else if (we->delta()>0) {
-                incPressed();
-            }
-            return true;
-        } else if (obj==spin) {
-            // QGtkStyle does not seem to like spinboxes with no buttons - which is what we use. It looks like it sets the 'has focus' flag
-            // on some internal gtk-line edit. If a spinbox has focus, and we change to another config dialog page - ALL line-edits on the new
-            // page a re drawn as if they have focus.
-            //
-            // So, to 'fix' this, we ignore paint events on the spin-box itself, and handle focus in/out here...
-            if (QEvent::FocusIn==event->type() || QEvent::FocusOut==event->type()) {
-                // focus in/out on spin just cause this whole widget to be repainted - therefore focus is drawn around whole widget...
-                repaint();
-                // Dont stop here, need to pass event down to spin widget - so that the | bar appears.
-                //return true;
-            } else if (QEvent::Paint==event->type()) {
-                // ignore paint events...
-                return true;
-            }
-        }
-    }
-
-    return QWidget::eventFilter(obj, event);
-}
diff --git a/support/spinbox.h b/support/spinbox.h
deleted file mode 100644
index 9dba96e..0000000
--- a/support/spinbox.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Cantata
- *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
- *
- * ----
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifndef SPINBOX_H
-#define SPINBOX_H
-
-#include <QSpinBox>
-#include <QFontMetrics>
-
-class EmptySpinBox : public QSpinBox
-{
-public:
-    EmptySpinBox(QWidget *parent)
-        : QSpinBox(parent)
-        , allowEmpty(false) {
-    }
-
-    void setAllowEmpty() {
-        setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
-        setKeyboardTracking(true);
-        setMaximum(3000);
-        allowEmpty=true;
-    }
-
-    QSize sizeHint() const {
-        return QSpinBox::sizeHint()+QSize(fontMetrics().height()/2, 0);
-    }
-
-protected:
-    virtual QValidator::State validate(QString &input, int &pos) const {
-        return allowEmpty && input.isEmpty() ? QValidator::Acceptable : QSpinBox::validate(input, pos);
-    }
-
-    virtual int valueFromText(const QString &text) const {
-        return allowEmpty && text.isEmpty() ? minimum() : QSpinBox::valueFromText(text);
-    }
-
-    virtual QString textFromValue(int val) const {
-        return allowEmpty && val==minimum() ? QString() : QSpinBox::textFromValue(val);
-    }
-private:
-    bool allowEmpty;
-};
-
-#ifdef Q_WS_WIN
-class SpinBox : public EmptySpinBox
-{
-public:
-    SpinBox(QWidget *p) : EmptySpinBox(p) { }
-};
-#else
-class SpinBoxButton;
-class QSpacerItem;
-
-class SpinBox : public QWidget
-{
-    Q_OBJECT
-
-public:
-    SpinBox(QWidget *p);
-    virtual ~SpinBox();
-
-    void setSpecialValueText(const QString &text) { spin->setSpecialValueText(text); }
-    void setSuffix(const QString &text) { spin->setSuffix(text); }
-    void setSingleStep(int v) { spin->setSingleStep(v); }
-    void setMinimum(int v) { spin->setMinimum(v); }
-    void setMaximum(int v) { spin->setMaximum(v); }
-    void setRange(int min, int max) { spin->setRange(min, max); }
-    void setValue(int v);
-    int value() const { return spin->value(); }
-    int minimum() const{ return spin->minimum(); }
-    int maximum() const { return spin->maximum(); }
-    void setFocus() const { spin->setFocus(); }
-    void setAllowEmpty() { spin->setAllowEmpty(); }
-    void setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical);
-
-Q_SIGNALS:
-    void valueChanged(int v);
-
-private Q_SLOTS:
-    void incPressed();
-    void decPressed();
-    void checkValue();
-
-private:
-    bool eventFilter(QObject *obj, QEvent *event);
-    void paintEvent(QPaintEvent *e);
-
-private:
-    EmptySpinBox *spin;
-    SpinBoxButton *incButton;
-    SpinBoxButton *decButton;
-    QSpacerItem *spacer;
-};
-#endif // Q_WS_WIN
-
-#endif
diff --git a/support/spinner.cpp b/support/spinner.cpp
index f784906..8e1a459 100644
--- a/support/spinner.cpp
+++ b/support/spinner.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -23,6 +23,7 @@
 
 #include "spinner.h"
 #include <QApplication>
+#include <QAbstractItemView>
 
 #ifdef ENABLE_KDE_SUPPORT
 
@@ -46,24 +47,42 @@ void Spinner::stop()
      KPixmapSequenceOverlayPainter::stop();
 }
 
+void Spinner::setWidget(QWidget *widget)
+{
+    if (qobject_cast<QAbstractItemView *>(widget)) {
+        KPixmapSequenceOverlayPainter::setWidget(static_cast<QAbstractItemView *>(widget)->viewport());
+    } else {
+        KPixmapSequenceOverlayPainter::setWidget(widget);
+    }
+}
+
 #else
 #include <QPainter>
 #include <QPaintEvent>
 #include <QTimer>
+#include <QScrollBar>
+#include "utils.h"
 
 Spinner::Spinner(QObject *p, bool inMiddle)
     : QWidget(0)
     , timer(0)
+    , space(Utils::isHighDpi() ? 8 : 4)
     , value(0)
     , active(false)
     , central(inMiddle)
+    , onView(false)
 {
     Q_UNUSED(p)
-    int size=fontMetrics().height()*2;
+    int size=fontMetrics().height()*1.5;
     setVisible(false);
     setMinimumSize(size, size);
     setMaximumSize(size, size);
 }
+void Spinner::setWidget(QWidget *widget)
+{
+    setParent(widget);
+    onView=qobject_cast<QAbstractItemView *>(widget);
+}
 
 void Spinner::start()
 {
@@ -75,7 +94,7 @@ void Spinner::start()
         timer=new QTimer(this);
         connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
     }
-    timer->start(100);
+    timer->start(75);
 }
 
 void Spinner::stop()
@@ -92,6 +111,8 @@ static const int constSpinnerSteps=64;
 void Spinner::paintEvent(QPaintEvent *event)
 {
     static const int constParts=8;
+
+    int lineWidth(Utils::isHighDpi() ? 4 : 2);
     QPainter p(this);
     QRectF rectangle(1.5, 1.5, size().width()-3, size().height()-3);
     QColor col(palette().color(QPalette::Text));
@@ -100,7 +121,7 @@ void Spinner::paintEvent(QPaintEvent *event)
     double size=(360*16)/(2.0*constParts);
     for (int i=0; i<constParts; ++i) {
         col.setAlphaF((constParts-i)/(1.0*constParts));
-        p.setPen(QPen(col, 2));
+        p.setPen(QPen(col, lineWidth));
         p.drawArc(rectangle, (((constSpinnerSteps-value)*1.0)/(constSpinnerSteps*1.0)*360*16)+(i*2.0*size), size);
     }
     p.end();
@@ -117,12 +138,17 @@ void Spinner::timeout()
 
 void Spinner::setPosition()
 {
+    QWidget *pw=parentWidget();
+    int hSpace=space+(onView && pw && static_cast<QAbstractItemView *>(pw)->verticalScrollBar() &&
+                      static_cast<QAbstractItemView *>(pw)->verticalScrollBar()->isVisible()
+                      ? static_cast<QAbstractItemView *>(pw)->verticalScrollBar()->width()+2 : 0);
+
     QPoint current=pos();
     QPoint desired=central
                     ? QPoint((parentWidget()->size().width()-size().width())/2, (parentWidget()->size().height()-size().height())/2)
                     : Qt::RightToLeft==QApplication::layoutDirection()
-                        ? QPoint(4, 4)
-                        : QPoint(parentWidget()->size().width()-(size().width()+4), 4);
+                        ? QPoint(hSpace, space)
+                        : QPoint(parentWidget()->size().width()-(size().width()+hSpace), space);
 
     if (current!=desired) {
         move(desired);
diff --git a/support/spinner.h b/support/spinner.h
index c0c68b2..41ead69 100644
--- a/support/spinner.h
+++ b/support/spinner.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -32,6 +32,7 @@ public:
     bool isActive() const { return active; }
     void start();
     void stop();
+    void setWidget(QWidget *widget);
 
 private:
     bool active;
@@ -47,7 +48,7 @@ public:
     Spinner(QObject *p, bool inMiddle=false);
     virtual ~Spinner() { }
 
-    void setWidget(QWidget *widget) { setParent(widget); }
+    void setWidget(QWidget *widget);
     void start();
     void stop();
     void paintEvent(QPaintEvent *event);
@@ -61,8 +62,10 @@ private:
 
 private:
     QTimer *timer;
+    int space;
     int value;
     bool active;
     bool central;
+    bool onView;
 };
 #endif
diff --git a/support/squeezedtextlabel.cpp b/support/squeezedtextlabel.cpp
index ec21269..4509550 100644
--- a/support/squeezedtextlabel.cpp
+++ b/support/squeezedtextlabel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/squeezedtextlabel.h b/support/squeezedtextlabel.h
index 67afb91..56d7a43 100644
--- a/support/squeezedtextlabel.h
+++ b/support/squeezedtextlabel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/themes/adwaita.css b/support/themes/adwaita.css
new file mode 100644
index 0000000..a4b4db4
--- /dev/null
+++ b/support/themes/adwaita.css
@@ -0,0 +1,3 @@
+/* drag:toolbar scrollbar:overlay symbolic-icons:#2d3335 spinbox:touch*/
+
+QToolBar#MainToolBar { border: 0px;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel { color: #a7aaa7;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel:active { color: #2d3335;} QToolBar#MainToolBar QToolButton { background: transparent; border: 1px outset transparent;} QToolBar#MainToolBar QToolButton:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #f7f7f7, stop: 1 #dcdcdc); border-radius: 3px; border: 1px solid #b2b6b2;} QToolBar#MainToolBar QToolButton:pressed,QToolBar#MainToolBar QToolButton:checked { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #a8aca8, stop: 1 #e0e0e0); border-radius: 3; border: 1px solid #bdbfbd;} 
diff --git a/support/themes/ambiance-dt.css b/support/themes/ambiance-dt.css
index fc78f0a..cf8902b 100644
--- a/support/themes/ambiance-dt.css
+++ b/support/themes/ambiance-dt.css
@@ -1,97 +1,5 @@
-/* drag:toolbar scrollbar:overlay symbolic-icons:true light-icons:true*/
-QToolBar,
-ToolBar {
-  background-color: #3c3b37;
-  border: 0px;
-}
+/* drag:toolbar scrollbar:overlay symbolic-icons:#dfdbd2 spinbox:touch*/
 
-QToolBar:active,
-ToolBar:active {
-  background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,  stop: 0 #3c3b37, stop: 1 #575651);
-  border: 0px;
-}
+QToolBar#MainToolBar { background-color: #3c3b37; border: 0px;} QToolBar#MainToolBar:active { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #3c3b37, stop: 1 #575651); border: 0px;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel { color: #bfbbb2;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel:active { color: #dfdbd2;} QToolBar#MainToolBar QToolButton:disabled,QToolBar#MainToolBar QLabel:disabled { color: #9f9b92;} QToolBar#MainToolBar QToolButton { background: transparent; border: 1px outset transparent;} QToolBar#MainToolBar QToolButton:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #464640, stop: 1 #303025); border-radius: 5px; border: 1px outset #3c3b37;} QToolBar#MainToolBar QToolButton:pressed,QToolBar#MainToolBar QToolButton:checked { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #383730, stop: 1 #2b2c27); border-radius: 5px; border: 1px inset #292825;} QToolBar#MainToolBar:separator { width: 1px; background: #3f3b32; margin-top: 4px; margin-bottom: 4px; margin-left: 7px; margin-right: 7px;} 
 
-QToolBar QToolButton,
-QToolBar QLabel,
-ToolBar QToolButton,
-ToolBar QLabel {
-  color: #bfbbb2;
-}
-
-QToolBar QToolButton,
-QToolBar QLabel,
-ToolBar QToolButton,
-ToolBar QLabel:active {
-  color: #dfdbd2;
-}
-
-QToolBar QToolButton:disabled,
-QToolBar QLabel:disabled,
-ToolBar QToolButton:disabled,
-ToolBar QLabel:disabled {
-  color: #9f9b92;
-}
-
-QToolBar QToolButton,
-ToolBar QToolButton {
-  background: transparent;
-  border: 1px outset transparent;
-}
-
-QToolBar QToolButton:hover,
-ToolBar QToolButton:hover {
-  background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #464640, stop: 1 #303025);
-  border-radius: 5px;
-  border: 1px outset #3c3b37;
-}
-
-QToolBar QToolButton:pressed,
-QToolBar QToolButton:checked,
-ToolBar QToolButton:pressed,
-ToolBar QToolButton:checked {
-  background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #383730, stop: 1 #2b2c27);
-  border-radius: 5px;
-  border: 1px inset #292825;
-}
-
-QToolBar:separator,
-ToolBar:separator {
-    width: 1px;
-    background: #3f3b32;
-    margin-top: 4px;
-    margin-bottom: 4px;
-    margin-left: 7px;
-    margin-right: 7px;
-}
-
-QMenu {
-  background-color: #363531;
-  color: #dfdbd2;
-  padding: 1px;
-}
-
-QMenu QLabel {
-  color: #dfdbd2;
-}
-
-QMenu:active {
-  background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,  stop: 0 #e07746, stop: 1 #d05726);
-  color: #dfdbd2;
-}
-
-QMenu:disabled {
-  background-color: #363531;
-  color: #8f8b82;
-}
-
-QMenu::separator {
-  background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0  #2b2a26, stop: 1  #4b4a46);
-  height: 2;
-}
-
-/*
-QMenu::separator {
-    background-color: #2b2a26;
-    height: 1;
-}
-*/
+QMenu { background-color: #363531; color: #dfdbd2; padding: 1px;} QMenu QLabel { color: #dfdbd2;} QMenu:active { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e07746, stop: 1 #d05726); color: #dfdbd2;} QMenu:disabled { background-color: #363531; color: #8f8b82;} QMenu::separator { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2b2a26, stop: 1 #4b4a46); height: 2;} /*QMenu::separator { background-color: #2b2a26; height: 1;} */
diff --git a/support/themes/ambiance.css b/support/themes/ambiance.css
index fc78f0a..cf8902b 100644
--- a/support/themes/ambiance.css
+++ b/support/themes/ambiance.css
@@ -1,97 +1,5 @@
-/* drag:toolbar scrollbar:overlay symbolic-icons:true light-icons:true*/
-QToolBar,
-ToolBar {
-  background-color: #3c3b37;
-  border: 0px;
-}
+/* drag:toolbar scrollbar:overlay symbolic-icons:#dfdbd2 spinbox:touch*/
 
-QToolBar:active,
-ToolBar:active {
-  background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,  stop: 0 #3c3b37, stop: 1 #575651);
-  border: 0px;
-}
+QToolBar#MainToolBar { background-color: #3c3b37; border: 0px;} QToolBar#MainToolBar:active { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #3c3b37, stop: 1 #575651); border: 0px;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel { color: #bfbbb2;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel:active { color: #dfdbd2;} QToolBar#MainToolBar QToolButton:disabled,QToolBar#MainToolBar QLabel:disabled { color: #9f9b92;} QToolBar#MainToolBar QToolButton { background: transparent; border: 1px outset transparent;} QToolBar#MainToolBar QToolButton:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #464640, stop: 1 #303025); border-radius: 5px; border: 1px outset #3c3b37;} QToolBar#MainToolBar QToolButton:pressed,QToolBar#MainToolBar QToolButton:checked { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #383730, stop: 1 #2b2c27); border-radius: 5px; border: 1px inset #292825;} QToolBar#MainToolBar:separator { width: 1px; background: #3f3b32; margin-top: 4px; margin-bottom: 4px; margin-left: 7px; margin-right: 7px;} 
 
-QToolBar QToolButton,
-QToolBar QLabel,
-ToolBar QToolButton,
-ToolBar QLabel {
-  color: #bfbbb2;
-}
-
-QToolBar QToolButton,
-QToolBar QLabel,
-ToolBar QToolButton,
-ToolBar QLabel:active {
-  color: #dfdbd2;
-}
-
-QToolBar QToolButton:disabled,
-QToolBar QLabel:disabled,
-ToolBar QToolButton:disabled,
-ToolBar QLabel:disabled {
-  color: #9f9b92;
-}
-
-QToolBar QToolButton,
-ToolBar QToolButton {
-  background: transparent;
-  border: 1px outset transparent;
-}
-
-QToolBar QToolButton:hover,
-ToolBar QToolButton:hover {
-  background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #464640, stop: 1 #303025);
-  border-radius: 5px;
-  border: 1px outset #3c3b37;
-}
-
-QToolBar QToolButton:pressed,
-QToolBar QToolButton:checked,
-ToolBar QToolButton:pressed,
-ToolBar QToolButton:checked {
-  background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #383730, stop: 1 #2b2c27);
-  border-radius: 5px;
-  border: 1px inset #292825;
-}
-
-QToolBar:separator,
-ToolBar:separator {
-    width: 1px;
-    background: #3f3b32;
-    margin-top: 4px;
-    margin-bottom: 4px;
-    margin-left: 7px;
-    margin-right: 7px;
-}
-
-QMenu {
-  background-color: #363531;
-  color: #dfdbd2;
-  padding: 1px;
-}
-
-QMenu QLabel {
-  color: #dfdbd2;
-}
-
-QMenu:active {
-  background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,  stop: 0 #e07746, stop: 1 #d05726);
-  color: #dfdbd2;
-}
-
-QMenu:disabled {
-  background-color: #363531;
-  color: #8f8b82;
-}
-
-QMenu::separator {
-  background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0  #2b2a26, stop: 1  #4b4a46);
-  height: 2;
-}
-
-/*
-QMenu::separator {
-    background-color: #2b2a26;
-    height: 1;
-}
-*/
+QMenu { background-color: #363531; color: #dfdbd2; padding: 1px;} QMenu QLabel { color: #dfdbd2;} QMenu:active { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e07746, stop: 1 #d05726); color: #dfdbd2;} QMenu:disabled { background-color: #363531; color: #8f8b82;} QMenu::separator { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2b2a26, stop: 1 #4b4a46); height: 2;} /*QMenu::separator { background-color: #2b2a26; height: 1;} */
diff --git a/support/themes/elementary.css b/support/themes/elementary.css
new file mode 100644
index 0000000..b28ca9b
--- /dev/null
+++ b/support/themes/elementary.css
@@ -0,0 +1,5 @@
+/* drag:toolbar scrollbar:overlay symbolic-icons:#404040 spinbox:touch*/
+
+QToolBar#MainToolBar { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dedede, stop: 1 #bbbbbb); border: 0px;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel { color: #3c3c3c;} QToolBar#MainToolBar QToolButton { background: transparent; border: 1px outset transparent;} QToolBar#MainToolBar QToolButton:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #eeeeee, stop: 1 #d8d8d8); border-radius: 4px; border: 1px outset #606060;} QToolBar#MainToolBar QToolButton:pressed,QToolBar#MainToolBar QToolButton:checked { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #a0a0a0, stop: 1 #d8d8d8); border-radius: 4px; border: 1px inset #505050;} 
+
+QMenu::separator { background-color: #ececec; height: 1;} 
diff --git a/support/themes/faience.css b/support/themes/faience.css
index 2b966cf..5772baf 100644
--- a/support/themes/faience.css
+++ b/support/themes/faience.css
@@ -1,53 +1,5 @@
-/* drag:toolbar scrollbar:overlay*/
-QToolBar,
-ToolBar {
-  background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,  stop: 0 #ececec, stop: 1 #d2d2d2);
-  border: 0px;
-}
+/* drag:toolbar scrollbar:overlay symbolic-icons:#3d434f spinbox:touch*/
 
-QToolBar:active,
-ToolBar:active {
-  background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,  stop: 0 #cccccc, stop: 1 #b0b0b0);
-  border: 0px;
-}
+QToolBar#MainToolBar { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ececec, stop: 1 #d2d2d2); border: 0px;} QToolBar#MainToolBar:active { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #cccccc, stop: 1 #b0b0b0); border: 0px;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel { color: #222222;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel:active { color: #222222;} QToolBar#MainToolBar QToolButton { background: transparent; border: 1px outset transparent;} QToolBar#MainToolBar QToolButton:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #eeeeee, stop: 1 #d8d8d8); border-radius: 4px; border: 1px outset #606060;} QToolBar#MainToolBar QToolButton:pressed,QToolBar#MainToolBar QToolButton:checked { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #a0a0a0, stop: 1 #d8d8d8); border-radius: 4px; border: 1px inset #505050;} 
 
-QToolBar QToolButton,
-QToolBar QLabel,
-ToolBar QToolButton,
-ToolBar QLabel {
-  color: #222222;
-}
-
-QToolBar QToolButton,
-QToolBar QLabel:active,
-ToolBar QToolButton,
-ToolBar QLabel:active {
-  color: #222222;
-}
-
-QToolBar QToolButton,
-ToolBar QToolButton {
-  background: transparent;
-  border: 1px outset transparent;
-}
-
-QToolBar QToolButton:hover,
-ToolBar QToolButton:hover {
-  background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #eeeeee, stop: 1 #d8d8d8);
-  border-radius: 4px;
-  border: 1px outset #606060;
-}
-
-QToolBar QToolButton:pressed,
-QToolBar QToolButton:checked,
-ToolBar QToolButton:pressed,
-ToolBar QToolButton:checked {
-  background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #a0a0a0, stop: 1 #d8d8d8);
-  border-radius: 4px;
-  border: 1px inset #505050;
-}
-
-QMenu::separator {
-  background-color: #ececec;
-  height: 1;
-}
+QMenu::separator { background-color: #ececec; height: 1;} 
diff --git a/support/themes/mint-x.css b/support/themes/mint-x.css
new file mode 100644
index 0000000..d95aa27
--- /dev/null
+++ b/support/themes/mint-x.css
@@ -0,0 +1,3 @@
+/* drag:toolbar scrollbar:overlay symbolic-icons:#2b2b2b spinbox:touch*/
+
+QToolBar#MainToolBar { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.99, x3: 0, y3: 1, stop: 0 #d7d7d7, stop: 0.99 #bdbdbd, stop: 1 #969696); border: 0px;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel { color: #2b2b2b;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QToolBar#MainToolBar QToolButton { background: transparent; border: 1px outset transparent;} QToolBar#MainToolBar QToolButton:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #eeeeee, stop: 1 #d8d8d8); border-radius: 4px; border: 1px outset #606060;} QToolBar#MainToolBar QToolButton:pressed,QToolBar#MainToolBar QToolButton:checked { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #a0a0a0, stop: 1 #d8d8d8); border-radius: 4px; border: 1px inset #505050;} 
diff --git a/support/themes/radiance-dt.css b/support/themes/radiance-dt.css
index 0d0d06e..8ac464e 100644
--- a/support/themes/radiance-dt.css
+++ b/support/themes/radiance-dt.css
@@ -1,48 +1,3 @@
-/* drag:toolbar scrollbar:overlay*/
-QToolBar,
-ToolBar {
-  background-color: #dfd7d0;
-  border: 0px;
-}
+/* drag:toolbar scrollbar:overlay symbolic-icons:#3c3c3c spinbox:touch*/
 
-QToolBar:active,
-ToolBar:active {
-  background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,  stop: 0 #d5cdc6, stop: 1 #efe7e0);
-  border: 0px;
-}
-
-QToolBar QToolButton,
-QToolBar QLabel,
-ToolBar QToolButton,
-ToolBar QLabel {
-  color: #6c6c6c;
-}
-
-QToolBar QToolButton,
-QToolBar QLabel:active,
-ToolBar QToolButton,
-ToolBar QLabel:active {
-  color: #3c3c3c;
-}
-
-QToolBar QToolButton,
-ToolBar QToolButton {
-  background: transparent;
-  border: 1px outset transparent;
-}
-
-QToolBar QToolButton:hover,
-ToolBar QToolButton:hover {
-  background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #efe7e0, stop: 1 #cfc7c0);
-  border-radius: 5px;
-  border: 1px solid #afa7a0;
-}
-
-QToolBar QToolButton:pressed,
-QToolBar QToolButton:checked,
-ToolBar QToolButton:pressed,
-ToolBar QToolButton:checked {
-  background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #cfc7c0, stop: 1 #dfd7d0);
-  border-radius: 5px;
-  border: 1px solid #afa7a0;
-}
+QToolBar#MainToolBar { background-color: #dfd7d0; border: 0px;} QToolBar#MainToolBar:active { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #d5cdc6, stop: 1 #efe7e0); border: 0px;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel { color: #6c6c6c;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel:active { color: #3c3c3c;} QToolBar#MainToolBar QToolButton { background: transparent; border: 1px outset transparent;} QToolBar#MainToolBar QToolButton:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #efe7e0, stop: 1 #cfc7c0); border-radius: 5px; border: 1px solid #afa7a0;} QToolBar#MainToolBar QToolButton:pressed,QToolBar#MainToolBar QToolButton:checked { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #cfc7c0, stop: 1 #dfd7d0); border-radius: 5px; border: 1px solid #afa7a0;} 
diff --git a/support/themes/radiance.css b/support/themes/radiance.css
index 0d0d06e..8ac464e 100644
--- a/support/themes/radiance.css
+++ b/support/themes/radiance.css
@@ -1,48 +1,3 @@
-/* drag:toolbar scrollbar:overlay*/
-QToolBar,
-ToolBar {
-  background-color: #dfd7d0;
-  border: 0px;
-}
+/* drag:toolbar scrollbar:overlay symbolic-icons:#3c3c3c spinbox:touch*/
 
-QToolBar:active,
-ToolBar:active {
-  background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,  stop: 0 #d5cdc6, stop: 1 #efe7e0);
-  border: 0px;
-}
-
-QToolBar QToolButton,
-QToolBar QLabel,
-ToolBar QToolButton,
-ToolBar QLabel {
-  color: #6c6c6c;
-}
-
-QToolBar QToolButton,
-QToolBar QLabel:active,
-ToolBar QToolButton,
-ToolBar QLabel:active {
-  color: #3c3c3c;
-}
-
-QToolBar QToolButton,
-ToolBar QToolButton {
-  background: transparent;
-  border: 1px outset transparent;
-}
-
-QToolBar QToolButton:hover,
-ToolBar QToolButton:hover {
-  background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #efe7e0, stop: 1 #cfc7c0);
-  border-radius: 5px;
-  border: 1px solid #afa7a0;
-}
-
-QToolBar QToolButton:pressed,
-QToolBar QToolButton:checked,
-ToolBar QToolButton:pressed,
-ToolBar QToolButton:checked {
-  background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #cfc7c0, stop: 1 #dfd7d0);
-  border-radius: 5px;
-  border: 1px solid #afa7a0;
-}
+QToolBar#MainToolBar { background-color: #dfd7d0; border: 0px;} QToolBar#MainToolBar:active { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #d5cdc6, stop: 1 #efe7e0); border: 0px;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel { color: #6c6c6c;} QToolBar#MainToolBar QToolButton,QToolBar#MainToolBar QLabel:active { color: #3c3c3c;} QToolBar#MainToolBar QToolButton { background: transparent; border: 1px outset transparent;} QToolBar#MainToolBar QToolButton:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #efe7e0, stop: 1 #cfc7c0); border-radius: 5px; border: 1px solid #afa7a0;} QToolBar#MainToolBar QToolButton:pressed,QToolBar#MainToolBar QToolButton:checked { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #cfc7c0, stop: 1 #dfd7d0); border-radius: 5px; border: 1px solid #afa7a0;} 
diff --git a/support/thread.cpp b/support/thread.cpp
index ca6fbf2..0bedf42 100644
--- a/support/thread.cpp
+++ b/support/thread.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -22,11 +22,27 @@
  */
 
 #include "thread.h"
-//#include <QDebug>
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KGlobal>
 K_GLOBAL_STATIC(ThreadCleaner, instance)
 #endif
+#include <QCoreApplication>
+#include <QDebug>
+#include <signal.h>
+#include <unistd.h>
+
+static bool debugEnabled=false;
+#define DBUG if (debugEnabled) qWarning() << metaObject()->className() << __FUNCTION__
+void ThreadCleaner::enableDebug()
+{
+    debugEnabled=true;
+}
+
+static void segvHandler(int i)
+{
+    if (debugEnabled) qWarning() << "SEGV handler called";
+    _exit(i);
+}
 
 ThreadCleaner * ThreadCleaner::self()
 {
@@ -41,22 +57,60 @@ ThreadCleaner * ThreadCleaner::self()
     #endif
 }
 
+void ThreadCleaner::stopAll()
+{
+    DBUG << "Remaining threads:" << threads.count();
+    foreach (Thread *thread, threads) {
+        DBUG << "Cleanup" << thread->objectName();
+        disconnect(thread, SIGNAL(finished()), this, SLOT(threadFinished()));
+    }
+
+    foreach (Thread *thread, threads) {
+        thread->stop();
+    }
+
+    QList<Thread *> stillRunning;
+    foreach (Thread *thread, threads) {
+        if (thread->wait(250)) {
+            delete thread;
+        } else {
+            stillRunning.append(thread);
+            DBUG << "Failed to close" << thread->objectName();
+        }
+    }
+
+    // Terminate any still running threads...
+    signal(SIGSEGV, segvHandler); // Ignore SEGV in case a thread throws an error...
+    foreach (Thread *thread, stillRunning) {
+        thread->terminate();
+    }
+}
+
 void ThreadCleaner::threadFinished()
 {
-    QThread *thread=qobject_cast<QThread *>(sender());
+    Thread *thread=qobject_cast<Thread *>(sender());
     if (thread) {
         thread->deleteLater();
+        threads.removeAll(thread);
+        DBUG << "Thread finished" << thread->objectName() << "Total threads:" << threads.count();
     }
 }
 
+void ThreadCleaner::add(Thread *thread)
+{
+    threads.append(thread);
+    connect(thread, SIGNAL(finished()), this, SLOT(threadFinished()));
+    DBUG << "Thread created" << thread->objectName() << "Total threads:" << threads.count();
+}
+
 Thread::Thread(const QString &name, QObject *p)
     : QThread(p)
 {
     setObjectName(name);
-    connect(this, SIGNAL(finished()), ThreadCleaner::self(), SLOT(threadFinished()));
+    ThreadCleaner::self()->add(this);
 }
 
 Thread::~Thread()
 {
-//    qWarning() << objectName() << "destroyed";
+    DBUG << objectName() << "destroyed";
 }
diff --git a/support/thread.h b/support/thread.h
index 4357837..9f5f21b 100644
--- a/support/thread.h
+++ b/support/thread.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,18 +26,31 @@
 
 #include <QThread>
 
-// ThreadCleaner *needs* to resde in the GUI thread. When a 'Thread' is created it will connect
+// ThreadCleaner *needs* to reside in the GUI thread. When a 'Thread' is created it will connect
 // its finished signal to threadFinished(), this then calls deleteLater() to ensure that the
 // thread is finished before it is deleted - and is deleted in the gui thread.
+class Thread;
 class ThreadCleaner : public QObject
 {
     Q_OBJECT
 public:
+    static void enableDebug();
     static ThreadCleaner * self();
     ThreadCleaner() { }
     ~ThreadCleaner() { }
+
+    // This function must *ONLY* be called from GUI thread...
+    void stopAll();
+
 public Q_SLOTS:
     void threadFinished();
+
+private:
+    void add(Thread *thread);
+
+private:
+    QList<Thread *> threads;
+    friend class Thread;
 };
 
 class Thread : public QThread
diff --git a/support/urllabel.cpp b/support/urllabel.cpp
index 5eacb04..6ddc270 100644
--- a/support/urllabel.cpp
+++ b/support/urllabel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/urllabel.h b/support/urllabel.h
index 55eb3e0..7450a10 100644
--- a/support/urllabel.h
+++ b/support/urllabel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/support/utils.cpp b/support/utils.cpp
index 2a09ad9..377a5b2 100644
--- a/support/utils.cpp
+++ b/support/utils.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -657,11 +657,9 @@ QString Utils::cacheDir(const QString &sub, bool create)
     #endif
 }
 
-void Utils::moveFile(const QString &from, const QString &to)
+bool Utils::moveFile(const QString &from, const QString &to)
 {
-    if (!from.isEmpty() && !to.isEmpty() && from!=to && QFile::exists(from) && !QFile::exists(to)) {
-        QFile::rename(from, to);
-    }
+    return !from.isEmpty() && !to.isEmpty() && from!=to && QFile::exists(from) && !QFile::exists(to) && QFile::rename(from, to);
 }
 
 void Utils::moveDir(const QString &from, const QString &to)
diff --git a/support/utils.h b/support/utils.h
index 885387f..b4d0db4 100644
--- a/support/utils.h
+++ b/support/utils.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -98,7 +98,7 @@ namespace Utils
     extern QString configDir(const QString &sub=QString(), bool create=false);
     extern QString dataDir(const QString &sub=QString(), bool create=false);
     extern QString cacheDir(const QString &sub=QString(), bool create=true);
-    extern void moveFile(const QString &from, const QString &to);
+    extern bool moveFile(const QString &from, const QString &to);
     extern void moveDir(const QString &from, const QString &to);
     extern void clearOldCache(const QString &sub, int maxAge);
     extern void touchFile(const QString &fileName);
diff --git a/support/windowmanager.cpp b/support/windowmanager.cpp
index 3c21f38..5260104 100644
--- a/support/windowmanager.cpp
+++ b/support/windowmanager.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 
diff --git a/support/windowmanager.h b/support/windowmanager.h
index 3450714..0cfa9b2 100644
--- a/support/windowmanager.h
+++ b/support/windowmanager.h
@@ -4,7 +4,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 
diff --git a/tags/filetyperesolver.cpp b/tags/filetyperesolver.cpp
index 05906e9..9d55f89 100644
--- a/tags/filetyperesolver.cpp
+++ b/tags/filetyperesolver.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /****************************************************************************************
diff --git a/tags/filetyperesolver.h b/tags/filetyperesolver.h
index f4aef2a..980b532 100644
--- a/tags/filetyperesolver.h
+++ b/tags/filetyperesolver.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  */
 /****************************************************************************************
diff --git a/tags/main.cpp b/tags/main.cpp
index a1eb93c..62f06b0 100644
--- a/tags/main.cpp
+++ b/tags/main.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/tags/tagclient.cpp b/tags/tagclient.cpp
index a19521f..00eff17 100644
--- a/tags/tagclient.cpp
+++ b/tags/tagclient.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/tags/tagclient.h b/tags/tagclient.h
index cf03491..4347c63 100644
--- a/tags/tagclient.h
+++ b/tags/tagclient.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/tags/tageditor.cpp b/tags/tageditor.cpp
index d566b46..c2174c8 100644
--- a/tags/tageditor.cpp
+++ b/tags/tageditor.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -71,7 +71,7 @@ int TagEditor::instanceCount()
 TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
                      const QSet<QString> &existingArtists, const QSet<QString> &existingAlbumArtists, const QSet<QString> &existingComposers,
                      const QSet<QString> &existingAlbums, const QSet<QString> &existingGenres, const QString &udi)
-    : SongDialog(parent, "TagEditor", QSize(500, 200))
+    : SongDialog(parent)
     #ifdef ENABLE_DEVICES_SUPPORT
     , deviceUdi(udi)
     #endif
@@ -104,10 +104,12 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
         return;
     }
 
+    bool isMopidy=false;
     #ifdef ENABLE_DEVICES_SUPPORT
     if (deviceUdi.isEmpty()) {
         baseDir=MPDConnection::self()->getDetails().dir;
         composerSupport=MPDConnection::self()->composerTagSupported();
+        isMopidy=MPDConnection::self()->isMopdidy();
     } else {
         Device *dev=getDevice(udi, parentWidget());
 
@@ -121,6 +123,7 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
     #else
     baseDir=MPDConnection::self()->getDetails().dir;
     composerSupport=MPDConnection::self()->composerTagSupported();
+    isMopidy=MPDConnection::self()->isMopdidy();
     #endif
     qSort(original);
 
@@ -130,9 +133,11 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
 
     QWidget *mainWidet = new QWidget(this);
     setupUi(mainWidet);
-    track->setAllowEmpty();
-    disc->setAllowEmpty();
-    year->setAllowEmpty();
+    if (isMopidy) {
+        connect(mopidyNote, SIGNAL(leftClickedUrl()), SLOT(showMopidyMessage()));
+    } else {
+        REMOVE(mopidyNote);
+    }
     setMainWidget(mainWidet);
     ButtonCodes buttons=Ok|Cancel|Reset|User3;
     if (songs.count()>1) {
@@ -205,25 +210,15 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
         QSet<int> songDiscs;
 
         foreach (const Song &s, original) {
-            if (!s.artist.isEmpty()) {
-                songArtists.insert(s.artist);
-            }
-            if (!s.albumartist.isEmpty()) {
-                songAlbumArtists.insert(s.albumartist);
-            }
-            if (!s.album.isEmpty()) {
-                songAlbums.insert(s.album);
-            }
-            if (!s.genre.isEmpty()) {
-                songGenres.insert(s.genre);
-            }
-            if (!s.composer.isEmpty()) {
-                songComposers.insert(s.composer);
-            }
+            songArtists.insert(s.artist);
+            songAlbumArtists.insert(s.albumartist);
+            songAlbums.insert(s.album);
+            songGenres.insert(s.genre);
+            songComposers.insert(s.composer);
             songYears.insert(s.year);
             songDiscs.insert(s.disc);
             if (songArtists.count()>1 && songAlbumArtists.count()>1 && songAlbums.count()>1 &&
-                songGenres.count()>1 && songYears.count()>1 && songDiscs.count()>1 && songComposers.count()>=1) {
+                songGenres.count()>1 && songYears.count()>1 && songDiscs.count()>1 && songComposers.count()>1) {
                 break;
             }
         }
@@ -240,11 +235,11 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
         all.disc=1==songDiscs.count() ? *(songDiscs.begin()) : 0;
         original.prepend(all);
         artist->setFocus();
-        haveArtists=!songArtists.isEmpty();
-        haveAlbumArtists=!songAlbumArtists.isEmpty();
-        haveAlbums=!songAlbums.isEmpty();
-        haveGenres=!songGenres.isEmpty();
-        haveComposers=!songComposers.isEmpty();
+        haveArtists=songArtists.count()>1;
+        haveAlbumArtists=songAlbumArtists.count()>1;
+        haveAlbums=songAlbums.count()>1;
+        haveGenres=songGenres.count()>1;
+        haveComposers=songComposers.count()>1;
     } else {
         title->setFocus();
     }
@@ -256,7 +251,7 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
             trackName->insertItem(trackName->count(), i18n("All tracks"));
             first=false;
         } else {
-            trackName->insertItem(trackName->count(), s.file);
+            trackName->insertItem(trackName->count(), s.filePath());
         }
     }
     connect(title, SIGNAL(textChanged(const QString &)), SLOT(checkChanged()));
@@ -277,6 +272,12 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
     connect(year, SIGNAL(valueChanged(int)), SLOT(checkChanged()));
     connect(trackName, SIGNAL(activated(int)), SLOT(setIndex(int)));
     connect(this, SIGNAL(update()), MPDConnection::self(), SLOT(update()));
+    adjustSize();
+    int w=600*(Utils::isHighDpi() ? 2 : 1);
+    if (width()<w) {
+        resize(w, height());
+    }
+    setMaximumHeight(height());
 }
 
 TagEditor::~TagEditor()
@@ -302,9 +303,13 @@ void TagEditor::fillSong(Song &s, bool isAll, bool skipEmpty) const
     if (!isAll) {
         s.track=track->value();
     }
-    s.disc=disc->value();
+    if (!isAll || 0!=disc->value()) {
+        s.disc=disc->value();
+    }
     setString(s.genre, genre->text().trimmed(), skipEmpty && (!haveAll || all.genre.isEmpty()));
-    s.year=year->value();
+    if (!isAll || 0!=year->value()) {
+        s.year=year->value();
+    }
 }
 
 void TagEditor::setPlaceholderTexts()
@@ -574,13 +579,13 @@ void TagEditor::updateTrackName(int index, bool edited)
         if (isAll) {
             trackName->setItemText(index, i18n("All tracks [modified]"));
         } else {
-            trackName->setItemText(index, i18n("%1 [modified]", original.at(index).file));
+            trackName->setItemText(index, i18n("%1 [modified]", original.at(index).filePath()));
         }
     } else {
         if (isAll) {
             trackName->setItemText(index, i18n("All tracks"));
         } else {
-            trackName->setItemText(index, original.at(index).file);
+            trackName->setItemText(index, original.at(index).filePath());
         }
     }
 }
@@ -697,6 +702,15 @@ void TagEditor::setIndex(int idx)
     updating=false;
 }
 
+void TagEditor::showMopidyMessage()
+{
+    MessageBox::information(this, i18n("Cantata has detected that you are connected to a Mopidy server.\n\n"
+                                       "Currently it is not possible for Cantata to force Mopidy to refresh its local "
+                                       "music listing. Therefore, you will need to stop Cantata, manually refresh "
+                                       "Mopidy's database, and restart Cantata for any changes to be active."),
+                            QLatin1String("Mopidy"));
+}
+
 bool TagEditor::applyUpdates()
 {
     bool skipFirst=original.count()>1;
@@ -748,7 +762,8 @@ bool TagEditor::applyUpdates()
             continue;
         }
 
-        switch(Tags::update(baseDir+orig.file, orig, edit)) {
+        QString file=orig.filePath();
+        switch(Tags::update(baseDir+file, orig, edit)) {
         case Tags::Update_Modified:
             #ifdef ENABLE_DEVICES_SUPPORT
             if (!deviceUdi.isEmpty()) {
@@ -765,20 +780,20 @@ bool TagEditor::applyUpdates()
                 }
             }
             updatedSongs.append(edit);
-            if (!renameFiles && orig.file!=opts.createFilename(edit)) {
+            if (!renameFiles && file!=opts.createFilename(edit)) {
                 renameFiles=true;
             }
             break;
         case Tags::Update_Failed:
-            failed.append(orig.file);
+            failed.append(file);
             break;
         #ifdef ENABLE_EXTERNAL_TAGS
         case Tags::Update_Timedout:
-            failed.append(i18nc("filename (Timeout)", "%1 (Timeout)", orig.file));
+            failed.append(i18nc("filename (Timeout)", "%1 (Timeout)", file));
             someTimedout=true;
             break;
         case Tags::Update_BadFile:
-            failed.append(i18nc("filename (Corrupt tags?)", "%1 (Corrupt tags?)", orig.file));
+            failed.append(i18nc("filename (Corrupt tags?)", "%1 (Corrupt tags?)", file));
             break;
         #endif
         default:
@@ -792,21 +807,22 @@ bool TagEditor::applyUpdates()
     }
 
     if (updatedSongs.count()) {
-        #ifdef ENABLE_DEVICES_SUPPORT
-        if (!deviceUdi.isEmpty()) {
-            dev->saveCache();
-        } else
-        #endif
-        {
-//             MusicLibraryModel::self()->removeCache();
-            emit update();
-        }
-
+        // If we call tag-editor, no need to do MPD update - as this will be done from that dialog...
         if (renameFiles &&
             MessageBox::Yes==MessageBox::questionYesNo(this, i18n("Would you also like to rename your song files, so as to match your tags?"),
                                                        i18n("Rename Files"), GuiItem(i18n("Rename")), StdGuiItem::cancel())) {
             TrackOrganiser *dlg=new TrackOrganiser(parentWidget());
-            dlg->show(updatedSongs, udi);
+            dlg->show(updatedSongs, udi, true);
+        } else {
+            #ifdef ENABLE_DEVICES_SUPPORT
+            if (!deviceUdi.isEmpty()) {
+                dev->saveCache();
+            } else
+            #endif
+            {
+            //             MusicLibraryModel::self()->removeCache();
+                emit update();
+            }
         }
     }
 
diff --git a/tags/tageditor.h b/tags/tageditor.h
index c9bce04..70187bf 100644
--- a/tags/tageditor.h
+++ b/tags/tageditor.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -74,6 +74,7 @@ private Q_SLOTS:
     void updateEdited(bool isFromAll=false);
     void setSong(const Song &s);
     void setIndex(int idx);
+    void showMopidyMessage();
 
 private:
     QString baseDir;
diff --git a/tags/tageditor.ui b/tags/tageditor.ui
index 0f8c22b..7ed54dd 100644
--- a/tags/tageditor.ui
+++ b/tags/tageditor.ui
@@ -108,7 +108,7 @@
     </widget>
    </item>
    <item row="6" column="1">
-    <widget class="SpinBox" name="track"/>
+    <widget class="EmptySpinBox" name="track"/>
    </item>
    <item row="7" column="0">
     <widget class="StateLabel" name="discLabel">
@@ -121,7 +121,7 @@
     </widget>
    </item>
    <item row="7" column="1">
-    <widget class="SpinBox" name="disc"/>
+    <widget class="EmptySpinBox" name="disc"/>
    </item>
    <item row="8" column="0">
     <widget class="StateLabel" name="genreLabel">
@@ -147,11 +147,18 @@
     </widget>
    </item>
    <item row="9" column="1">
-    <widget class="SpinBox" name="year"/>
+    <widget class="EmptySpinBox" name="year"/>
    </item>
   </layout>
   </item>
   <item>
+   <widget class="UrlLabel" name="mopidyNote">
+    <property name="text" stdset="0">
+     <string><i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i></string>
+    </property>
+   </widget>
+  </item>
+  <item>
    <widget class="QProgressBar" name="progress"/>
    </item>
   </layout>
@@ -173,15 +180,20 @@
    <header>combobox.h</header>
   </customwidget>
   <customwidget>
-   <class>SpinBox</class>
-   <extends>SpinBox</extends>
-   <header>spinbox.h</header>
+   <class>EmptySpinBox</class>
+   <extends>QSpinBox</extends>
+   <header>emptyspinbox.h</header>
   </customwidget>
   <customwidget>
    <class>StateLabel</class>
    <extends>QLabel</extends>
    <header>statelabel.h</header>
   </customwidget>
+  <customwidget>
+   <class>UrlLabel</class>
+   <extends>QLabel</extends>
+   <header>urllabel.h</header>
+  </customwidget>
  </customwidgets>
  <tabstops>
   <tabstop>trackName</tabstop>
diff --git a/tags/tags.cpp b/tags/tags.cpp
index bc5be30..4ab47a6 100644
--- a/tags/tags.cpp
+++ b/tags/tags.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -527,7 +527,7 @@ static TagLib::String readVorbisTag(TagLib::Ogg::XiphComment *tag, const char *f
     return TagLib::String();
 }
 
-static void readVorbisCommentTags(TagLib::Ogg::XiphComment *tag, Song *song, ReplayGain *rg, QImage *img)
+static void readVorbisCommentTags(TagLib::Ogg::XiphComment *tag, Song *song, ReplayGain *rg, QImage *img, QString *lyrics)
 {
     if (song) {
         TagLib::String str=readVorbisTag(tag, "ALBUMARTIST");
@@ -563,6 +563,13 @@ static void readVorbisCommentTags(TagLib::Ogg::XiphComment *tag, Song *song, Rep
             }
         }
     }
+
+    if (lyrics) {
+        TagLib::String str=readVorbisTag(tag, "LYRICS");
+        if (!str.isEmpty()) {
+            *lyrics=tString2QString(str);
+        }
+    }
 }
 
 #if (TAGLIB_MAJOR_VERSION > 1) || (TAGLIB_MAJOR_VERSION == 1 && TAGLIB_MINOR_VERSION >= 7)
@@ -813,25 +820,25 @@ static void readTags(const TagLib::FileRef fileref, Song *song, ReplayGain *rg,
         }
     } else if (TagLib::Ogg::Vorbis::File *file = dynamic_cast< TagLib::Ogg::Vorbis::File * >(fileref.file()))  {
         if (file->tag()) {
-            readVorbisCommentTags(file->tag(), song, rg, img);
+            readVorbisCommentTags(file->tag(), song, rg, img, lyrics);
         }
     } else if (TagLib::Ogg::FLAC::File *file = dynamic_cast< TagLib::Ogg::FLAC::File * >(fileref.file())) {
         if (file->tag()) {
-            readVorbisCommentTags(file->tag(), song, rg, img);
+            readVorbisCommentTags(file->tag(), song, rg, img, lyrics);
         }
     } else if (TagLib::Ogg::Speex::File *file = dynamic_cast< TagLib::Ogg::Speex::File * >(fileref.file())) {
         if (file->tag()) {
-            readVorbisCommentTags(file->tag(), song, rg, img);
+            readVorbisCommentTags(file->tag(), song, rg, img, lyrics);
         }
     #ifdef TAGLIB_OPUS_FOUND
     } else if (TagLib::Ogg::Opus::File *file = dynamic_cast< TagLib::Ogg::Opus::File * >(fileref.file())) {
         if (file->tag()) {
-            readVorbisCommentTags(file->tag(), song, rg, img);
+            readVorbisCommentTags(file->tag(), song, rg, img, lyrics);
         }
     #endif
     } else if (TagLib::FLAC::File *file = dynamic_cast< TagLib::FLAC::File * >(fileref.file())) {
         if (file->xiphComment()) {
-            readVorbisCommentTags(file->xiphComment(), song, rg, img);
+            readVorbisCommentTags(file->xiphComment(), song, rg, img, lyrics);
             #if (TAGLIB_MAJOR_VERSION > 1) || (TAGLIB_MAJOR_VERSION == 1 && TAGLIB_MINOR_VERSION >= 7)
             if (img && img->isNull()) {
                 readFlacPicture(file->pictureList(), img);
diff --git a/tags/tags.h b/tags/tags.h
index 9375e3b..ddec329 100644
--- a/tags/tags.h
+++ b/tags/tags.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/tags/tagserver.cpp b/tags/tagserver.cpp
index 1f4eea9..87c3c8c 100644
--- a/tags/tagserver.cpp
+++ b/tags/tagserver.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/tags/tagserver.h b/tags/tagserver.h
index 54129d9..4c505e3 100644
--- a/tags/tagserver.h
+++ b/tags/tagserver.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -35,6 +35,10 @@ public:
     int process();
 
 private:
+    TagServer(const TagServer &);
+    TagServer & operator=(const TagServer &o);
+
+private:
     QFile *in;
     QFile *out;
 };
diff --git a/tags/trackorganiser.cpp b/tags/trackorganiser.cpp
index f5a9a7e..5f59754 100644
--- a/tags/trackorganiser.cpp
+++ b/tags/trackorganiser.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -38,10 +38,17 @@
 #include "icons.h"
 #include "basicitemdelegate.h"
 #include "cuefile.h"
+#include "covers.h"
+#include "contextwidget.h"
 #include <QTimer>
 #include <QFile>
 #include <QDir>
 
+#define REMOVE(w) \
+    w->setVisible(false); \
+    w->deleteLater(); \
+    w=0;
+
 static int iCount=0;
 
 int TrackOrganiser::instanceCount()
@@ -52,9 +59,12 @@ int TrackOrganiser::instanceCount()
 TrackOrganiser::TrackOrganiser(QWidget *parent)
     : SongDialog(parent, "TrackOrganiser",  QSize(800, 500))
     , schemeDlg(0)
+    , autoSkip(false)
+    , paused(false)
+    , updated(false)
+    , alwaysUpdate(false)
 {
     iCount++;
-    updated=false;
     setButtons(Ok|Cancel);
     setCaption(i18n("Organize Files"));
     setAttribute(Qt::WA_DeleteOnClose);
@@ -81,8 +91,11 @@ TrackOrganiser::~TrackOrganiser()
     iCount--;
 }
 
-void TrackOrganiser::show(const QList<Song> &songs, const QString &udi)
+void TrackOrganiser::show(const QList<Song> &songs, const QString &udi, bool forceUpdate)
 {
+    // If we are called from the TagEditor dialog, then forceUpdate will be true. This is so that we dont do 2
+    // MPD updates (one from TagEditor, and one from here!)
+    alwaysUpdate=forceUpdate;
     foreach (const Song &s, songs) {
         if (!CueFile::isCue(s.file)) {
            origSongs.append(s);
@@ -91,14 +104,19 @@ void TrackOrganiser::show(const QList<Song> &songs, const QString &udi)
 
     if (origSongs.isEmpty()) {
         deleteLater();
+        if (alwaysUpdate) {
+            doUpdate();
+        }
         return;
     }
 
     QString musicFolder;
+    bool isMopidy=false;
     #ifdef ENABLE_DEVICES_SUPPORT
     if (udi.isEmpty()) {
         musicFolder=MPDConnection::self()->getDetails().dir;
         opts.load(MPDConnectionDetails::configGroupName(MPDConnection::self()->getDetails().name), true);
+        isMopidy=MPDConnection::self()->isMopdidy();
     } else {
         deviceUdi=udi;
         Device *dev=getDevice(parentWidget());
@@ -114,6 +132,7 @@ void TrackOrganiser::show(const QList<Song> &songs, const QString &udi)
     #else
     opts.load(MPDConnectionDetails::configGroupName(MPDConnection::self()->getDetails().name), true);
     musicFolder=MPDConnection::self()->getDetails().dir;
+    isMopidy=MPDConnection::self()->isMopdidy();
     #endif
     qSort(origSongs);
 
@@ -132,7 +151,11 @@ void TrackOrganiser::show(const QList<Song> &songs, const QString &udi)
     if (!songsOk(origSongs, musicFolder, udi.isEmpty())) {
         return;
     }
-
+    if (isMopidy) {
+        connect(mopidyNote, SIGNAL(leftClickedUrl()), SLOT(showMopidyMessage()));
+    } else {
+        REMOVE(mopidyNote);
+    }
     Dialog::show();
     enableButtonOk(false);
     updateView();
@@ -166,7 +189,7 @@ void TrackOrganiser::configureFilenameScheme()
 {
     if (!schemeDlg) {
         schemeDlg=new FilenameSchemeDialog(this);
-        connect(schemeDlg, SIGNAL(scheme(const QString &)), filenameScheme, SLOT(setText(const QString &)));
+        connect(schemeDlg, SIGNAL(scheme(const QString &)), this, SLOT(setFilenameScheme(const QString &)));
     }
     readOptions();
     schemeDlg->show(opts);
@@ -191,9 +214,10 @@ void TrackOrganiser::updateView()
     foreach (const Song &s, origSongs) {
         QString modified=opts.createFilename(s);
         //different=different||(modified!=s.file);
-        bool diff=modified!=s.file;
+        QString orig=s.filePath();
+        bool diff=modified!=orig;
         different|=diff;
-        QTreeWidgetItem *item=new QTreeWidgetItem(files, QStringList() << s.file << modified);
+        QTreeWidgetItem *item=new QTreeWidgetItem(files, QStringList() << orig << modified);
         if (diff) {
             item->setFont(0, f);
             item->setFont(1, f);
@@ -212,17 +236,7 @@ void TrackOrganiser::startRename()
     enableButtonOk(false);
     index=0;
     paused=autoSkip=false;
-    readOptions();
-    #ifdef ENABLE_DEVICES_SUPPORT
-    if (!deviceUdi.isEmpty()) {
-        Device *dev=getDevice();
-        if (!dev) {
-            return;
-        }
-        dev->setOptions(opts);
-    } else
-    #endif
-        opts.save(MPDConnectionDetails::configGroupName(MPDConnection::self()->getDetails().name), true);
+    saveOptions();
 
     QTimer::singleShot(100, this, SLOT(renameFile()));
 }
@@ -252,8 +266,9 @@ void TrackOrganiser::renameFile()
     #endif
         musicFolder=MPDConnection::self()->getDetails().dir;
 
-    if (modified!=s.file) {
-        QString source=musicFolder+s.file;
+    QString orig=s.filePath();
+    if (modified!=orig) {
+        QString source=musicFolder+orig;
         QString dest=musicFolder+modified;
         bool skip=false;
         if (!QFile::exists(source)) {
@@ -349,29 +364,74 @@ void TrackOrganiser::renameFile()
 
         if (!skip) {
             QDir sDir(Utils::getDir(source));
+            QDir sArtistDir(sDir); sArtistDir.cdUp();
             QDir dDir(Utils::getDir(dest));
             #ifdef ENABLE_DEVICES_SUPPORT
             Device *dev=deviceUdi.isEmpty() ? 0 : getDevice();
             if (sDir.absolutePath()!=dDir.absolutePath()) {
-                Device::moveDir(sDir.absolutePath(), dDir.absolutePath(), musicFolder, dev ? dev->coverFile() : QString());
+                Device::moveDir(sDir.absolutePath(), dDir.absolutePath(), musicFolder, dev ? dev->coverFile()
+                                                                                           : QString(Covers::albumFileName(s)+QLatin1String(".jpg")));
             }
             #else
             if (sDir.absolutePath()!=dDir.absolutePath()) {
-                Device::moveDir(sDir.absolutePath(), dDir.absolutePath(), musicFolder, QString());
+                Device::moveDir(sDir.absolutePath(), dDir.absolutePath(), musicFolder,  QString(Covers::albumFileName(s)+QLatin1String(".jpg")));
             }
             #endif
+            QDir dArtistDir(dDir); dArtistDir.cdUp();
+
+            // Move any artist, or backdrop, image...
+            if (sArtistDir.exists() && dArtistDir.exists() && sArtistDir.absolutePath()!=sDir.absolutePath() && sArtistDir.absolutePath()!=dArtistDir.absolutePath()) {
+                QStringList artistImages;
+                QFileInfoList entries=sArtistDir.entryInfoList(QDir::Files|QDir::Dirs|QDir::NoDotAndDotDot);
+                QString artistImage=Covers::artistFileName(s);
+                QSet<QString> acceptable=QSet<QString>() << artistImage+QLatin1String(".jpg") << artistImage+QLatin1String(".png")
+                                                         << ContextWidget::constBackdropFileName+QLatin1String(".jpg")
+                                                         << ContextWidget::constBackdropFileName+QLatin1String(".png");
+
+                foreach (const QFileInfo &entry, entries) {
+                    if (entry.isDir() || !acceptable.contains(entry.fileName())) {
+                        artistImages.clear();
+                        break;
+                    } else {
+                        artistImages.append(entry.fileName());
+                    }
+                }
+                if (!artistImages.isEmpty()) {
+                    bool delDir=true;
+                    foreach (const QString &f, artistImages) {
+                        if (!QFile::rename(sArtistDir.absolutePath()+Utils::constDirSep+f, dArtistDir.absolutePath()+Utils::constDirSep+f)) {
+                            delDir=false;
+                            break;
+                        }
+                    }
+                    if (delDir) {
+                        QString dirName=sArtistDir.dirName();
+                        if (!dirName.isEmpty()) {
+                            sArtistDir.cdUp();
+                            sArtistDir.rmdir(dirName);
+                        }
+                    }
+                }
+            }
             item->setText(0, modified);
             item->setFont(0, font());
             item->setFont(1, font());
             Song to=s;
-            to.file=modified;
+            QString origPath;
+            if (s.file.startsWith(Song::constMopidyLocal)) {
+                origPath=to.file;
+                to.file=Song::encodePath(to.file);
+            } else {
+                to.file=modified;
+            }
             origSongs.replace(index, to);
             updated=true;
 
             if (deviceUdi.isEmpty()) {
                 MusicLibraryModel::self()->updateSongFile(s, to);
-                DirViewModel::self()->removeFileFromList(s.file);
-                DirViewModel::self()->addFileToList(to.file);
+                DirViewModel::self()->removeFileFromList(s.file);                
+                DirViewModel::self()->addFileToList(origPath.isEmpty() ? to.file : origPath,
+                                                    origPath.isEmpty() ? QString() : to.file);
             }
             #ifdef ENABLE_DEVICES_SUPPORT
             else {
@@ -416,20 +476,57 @@ void TrackOrganiser::removeItems()
     }
 }
 
-void TrackOrganiser::finish(bool ok)
+void TrackOrganiser::showMopidyMessage()
+{
+    MessageBox::information(this, i18n("Cantata has detected that you are connected to a Mopidy server.\n\n"
+                                       "Currently it is not possible for Cantata to force Mopidy to refresh its local "
+                                       "music listing. Therefore, you will need to stop Cantata, manually refresh "
+                                       "Mopidy's database, and restart Cantata for any changes to be active."),
+                            QLatin1String("Mopidy"));
+}
+
+void TrackOrganiser::setFilenameScheme(const QString &text)
 {
-    if (updated) {
-        if (deviceUdi.isEmpty()) {
-            emit update();
+    if (filenameScheme->text()!=text) {
+        filenameScheme->setText(text);
+        saveOptions();
+    }
+}
+
+void TrackOrganiser::saveOptions()
+{
+    readOptions();
+    #ifdef ENABLE_DEVICES_SUPPORT
+    if (!deviceUdi.isEmpty()) {
+        Device *dev=getDevice();
+        if (!dev) {
+            return;
         }
-        #ifdef ENABLE_DEVICES_SUPPORT
-        else {
-            Device *dev=getDevice();
-            if (dev) {
-                dev->saveCache();
-            }
+        dev->setOptions(opts);
+    } else
+    #endif
+    opts.save(MPDConnectionDetails::configGroupName(MPDConnection::self()->getDetails().name), true);
+}
+
+void TrackOrganiser::doUpdate()
+{
+    if (deviceUdi.isEmpty()) {
+        emit update();
+    }
+    #ifdef ENABLE_DEVICES_SUPPORT
+    else {
+        Device *dev=getDevice();
+        if (dev) {
+            dev->saveCache();
         }
-        #endif
+    }
+    #endif
+}
+
+void TrackOrganiser::finish(bool ok)
+{
+    if (updated || alwaysUpdate) {
+        doUpdate();
     }
     if (ok) {
         accept();
diff --git a/tags/trackorganiser.h b/tags/trackorganiser.h
index caa17ff..a90b0be 100644
--- a/tags/trackorganiser.h
+++ b/tags/trackorganiser.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -46,7 +46,7 @@ public:
     TrackOrganiser(QWidget *parent);
     virtual ~TrackOrganiser();
 
-    void show(const QList<Song> &songs, const QString &udi);
+    void show(const QList<Song> &songs, const QString &udi, bool forceUpdate=false);
 
 Q_SIGNALS:
     // These are for communicating with MPD object (which is in its own thread, so need to talk via signal/slots)
@@ -59,13 +59,17 @@ private Q_SLOTS:
     void renameFile();
     void controlRemoveAct();
     void removeItems();
+    void showMopidyMessage();
+    void setFilenameScheme(const QString &text);
 
 private:
+    void saveOptions();
     void slotButtonClicked(int button);
     void readOptions();
     #ifdef ENABLE_DEVICES_SUPPORT
     Device * getDevice(QWidget *p=0);
     #endif
+    void doUpdate();
     void finish(bool ok);
 
 private:
@@ -77,6 +81,7 @@ private:
     bool autoSkip;
     bool paused;
     bool updated;
+    bool alwaysUpdate;
     DeviceOptions opts;
 };
 
diff --git a/tags/trackorganiser.ui b/tags/trackorganiser.ui
index 3f90e92..c35cd06 100644
--- a/tags/trackorganiser.ui
+++ b/tags/trackorganiser.ui
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>532</width>
+    <width>551</width>
     <height>337</height>
    </rect>
   </property>
@@ -15,167 +15,129 @@
     <number>0</number>
    </property>
    <item>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="margin">
-    <number>0</number>
-   </property>
-   <item>
-    <widget class="QGroupBox" name="optionsBox">
-     <property name="title">
-      <string>Filenames</string>
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <property name="margin">
+      <number>0</number>
      </property>
-     <layout class="QFormLayout" name="formLayout_2">
-      <property name="fieldGrowthPolicy">
-       <enum>QFormLayout::ExpandingFieldsGrow</enum>
-      </property>
-      <item row="4" column="1">
-       <layout class="QHBoxLayout" name="horizontalLayout">
-        <property name="spacing">
-         <number>0</number>
+     <item>
+      <widget class="QGroupBox" name="optionsBox">
+       <property name="title">
+        <string>Filenames</string>
+       </property>
+       <layout class="QFormLayout" name="formLayout_2">
+        <property name="fieldGrowthPolicy">
+         <enum>QFormLayout::ExpandingFieldsGrow</enum>
         </property>
-        <item>
-         <widget class="LineEdit" name="filenameScheme">
-          <property name="minimumSize">
-           <size>
-            <width>288</width>
-            <height>0</height>
-           </size>
+        <item row="4" column="1">
+         <layout class="QHBoxLayout" name="horizontalLayout">
+          <property name="spacing">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="LineEdit" name="filenameScheme">
+            <property name="minimumSize">
+             <size>
+              <width>288</width>
+              <height>0</height>
+             </size>
+            </property>
+            <property name="readOnly">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QToolButton" name="configFilename">
+            <property name="autoRaise">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+        <item row="4" column="0">
+         <widget class="BuddyLabel" name="label_6">
+          <property name="text">
+           <string>Filename scheme:</string>
           </property>
-          <property name="readOnly">
-           <bool>true</bool>
+          <property name="buddy">
+           <cstring>filenameScheme</cstring>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="0" colspan="2">
+         <widget class="QCheckBox" name="vfatSafe">
+          <property name="text">
+           <string>VFAT safe</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0" colspan="2">
+         <widget class="QCheckBox" name="asciiOnly">
+          <property name="text">
+           <string>Use only ASCII characters</string>
           </property>
          </widget>
         </item>
-        <item>
-         <widget class="QToolButton" name="configFilename">
-          <property name="autoRaise">
-           <bool>true</bool>
+        <item row="2" column="0" colspan="2">
+         <widget class="QCheckBox" name="replaceSpaces">
+          <property name="text">
+           <string>Replace spaces with underscores</string>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="0" colspan="2">
+         <widget class="QCheckBox" name="ignoreThe">
+          <property name="text">
+           <string>Ignore 'The' in artist names</string>
           </property>
          </widget>
         </item>
        </layout>
-      </item>
-      <item row="4" column="0">
-       <widget class="BuddyLabel" name="label_6">
-        <property name="text">
-         <string>Filename scheme:</string>
-        </property>
-        <property name="buddy">
-         <cstring>filenameScheme</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1">
-       <widget class="OnOffButton" name="ignoreThe">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="0">
-       <widget class="BuddyLabel" name="label_5">
-        <property name="text">
-         <string>Ignore 'The' in artist names:</string>
-        </property>
-        <property name="buddy">
-         <cstring>ignoreThe</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="OnOffButton" name="replaceSpaces">
+      </widget>
+     </item>
+     <item>
+      <widget class="QTreeWidget" name="files">
+       <property name="alternatingRowColors">
+        <bool>true</bool>
+       </property>
+       <property name="rootIsDecorated">
+        <bool>false</bool>
+       </property>
+       <property name="uniformRowHeights">
+        <bool>true</bool>
+       </property>
+       <property name="allColumnsShowFocus">
+        <bool>true</bool>
+       </property>
+       <column>
         <property name="text">
-         <string/>
+         <string>Original Name</string>
         </property>
-       </widget>
-      </item>
-      <item row="2" column="0">
-       <widget class="BuddyLabel" name="label_4">
+       </column>
+       <column>
         <property name="text">
-         <string>Replace spaces with underscores:</string>
+         <string>New Name</string>
         </property>
-        <property name="buddy">
-         <cstring>replaceSpaces</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="OnOffButton" name="asciiOnly">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0">
-       <widget class="BuddyLabel" name="label_3">
-        <property name="text">
-         <string>Use only ASCII characters:</string>
-        </property>
-        <property name="buddy">
-         <cstring>asciiOnly</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="OnOffButton" name="vfatSafe">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="0">
-       <widget class="BuddyLabel" name="label_2">
-        <property name="text">
-         <string>VFAT safe:</string>
-        </property>
-        <property name="buddy">
-         <cstring>vfatSafe</cstring>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
+       </column>
+      </widget>
+     </item>
+    </layout>
    </item>
    <item>
-    <widget class="QTreeWidget" name="files">
-     <property name="rootIsDecorated">
-      <bool>false</bool>
-     </property>
-     <property name="uniformRowHeights">
-      <bool>true</bool>
-     </property>
-     <property name="allColumnsShowFocus">
-      <bool>true</bool>
+    <widget class="UrlLabel" name="mopidyNote">
+     <property name="text" stdset="0">
+      <string><i><b>NOTE:</b> Connected to a Mopidy server (manual update required).</i></string>
      </property>
-     <property name="alternatingRowColors">
-      <bool>true</bool>
-     </property>
-     <column>
-      <property name="text">
-       <string>Original Name</string>
-      </property>
-     </column>
-     <column>
-      <property name="text">
-       <string>New Name</string>
-      </property>
-     </column>
     </widget>
    </item>
-  </layout>
-  </item>
-  <item>
-   <widget class="QProgressBar" name="progress"/>
+   <item>
+    <widget class="QProgressBar" name="progress"/>
    </item>
   </layout>
  </widget>
  <customwidgets>
   <customwidget>
-   <class>OnOffButton</class>
-   <extends>QCheckBox</extends>
-   <header>onoffbutton.h</header>
-  </customwidget>
-  <customwidget>
    <class>LineEdit</class>
    <extends>QLineEdit</extends>
    <header>lineedit.h</header>
@@ -185,6 +147,11 @@
    <extends>QLabel</extends>
    <header>buddylabel.h</header>
   </customwidget>
+  <customwidget>
+   <class>UrlLabel</class>
+   <extends>QLabel</extends>
+   <header>urllabel.h</header>
+  </customwidget>
  </customwidgets>
  <tabstops>
   <tabstop>vfatSafe</tabstop>
diff --git a/widgets/actionitemdelegate.cpp b/widgets/actionitemdelegate.cpp
index 2ac1506..d089a42 100644
--- a/widgets/actionitemdelegate.cpp
+++ b/widgets/actionitemdelegate.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -156,26 +156,6 @@ void ActionItemDelegate::drawIcons(QPainter *painter, const QRect &r, bool mouse
     }
 }
 
-void ActionItemDelegate::drawDivider(QPainter *p, const QRect &r, const QColor &color) const
-{
-    QLinearGradient grad(r.bottomLeft(), r.bottomRight());
-    QColor col(color);
-    double fadeSize=64.0;
-    if (r.width()<(2.2*fadeSize)) {
-        fadeSize=r.width()/3.0;
-    }
-    double fadePos=fadeSize/r.width();
-    col.setAlphaF(0.0);
-    grad.setColorAt(0, col);
-    col.setAlphaF(0.1);
-    grad.setColorAt(fadePos, col);
-    grad.setColorAt(1.0-fadePos, col);
-    col.setAlphaF(0.0);
-    grad.setColorAt(1, col);
-    p->setPen(QPen(grad, 1));
-    p->drawLine(r.bottomLeft(), r.bottomRight());
-}
-
 bool ActionItemDelegate::helpEvent(QHelpEvent *e, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)
 {
     if (QEvent::ToolTip==e->type()) {
diff --git a/widgets/actionitemdelegate.h b/widgets/actionitemdelegate.h
index 23dcb21..7ad473d 100644
--- a/widgets/actionitemdelegate.h
+++ b/widgets/actionitemdelegate.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -50,7 +50,6 @@ public:
     static int constLargeActionIconSize;
 
     void drawIcons(QPainter *painter, const QRect &r, bool mouseOver, bool rtl, ActionPos actionPos, const QModelIndex &index) const;
-    void drawDivider(QPainter *p, const QRect &r, const QColor &color) const;
     void setUnderMouse(bool um) { underMouse=um; }
     void setLargeIcons(bool l) { largeIcons=l; }
 
diff --git a/widgets/actionlabel.cpp b/widgets/actionlabel.cpp
index 8ce5284..fc57f89 100644
--- a/widgets/actionlabel.cpp
+++ b/widgets/actionlabel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/actionlabel.h b/widgets/actionlabel.h
index af175f1..bb7d5b2 100644
--- a/widgets/actionlabel.h
+++ b/widgets/actionlabel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/autohidingsplitter.cpp b/widgets/autohidingsplitter.cpp
index 7fc399e..18d6de4 100644
--- a/widgets/autohidingsplitter.cpp
+++ b/widgets/autohidingsplitter.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  * This file (c) 2012 Piotr Wicijowski <piotr.wicijowski at gmail.com>
  *
  * ----
diff --git a/widgets/autohidingsplitter.h b/widgets/autohidingsplitter.h
index 6ec1bbc..e5db025 100644
--- a/widgets/autohidingsplitter.h
+++ b/widgets/autohidingsplitter.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  * This file (c) 2012 Piotr Wicijowski <piotr.wicijowski at gmail.com>
  *
  * ----
diff --git a/widgets/basicitemdelegate.cpp b/widgets/basicitemdelegate.cpp
index aeded7d..a3e0610 100644
--- a/widgets/basicitemdelegate.cpp
+++ b/widgets/basicitemdelegate.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -22,11 +22,14 @@
  */
 
 #include "basicitemdelegate.h"
+#include "gtkstyle.h"
 #include <QPainter>
 #include <QStyle>
 #include <QStyledItemDelegate>
+#include <QApplication>
+#include <QAbstractItemView>
 
-static void drawLine(QPainter *p, const QRect &r, const QColor &color, bool fadeStart, bool fadeEnd)
+void BasicItemDelegate::drawLine(QPainter *p, const QRect &r, const QColor &color, bool fadeStart, bool fadeEnd)
 {
     static const double constAlpha=0.1;
     QColor col(color);
@@ -55,7 +58,14 @@ static void drawLine(QPainter *p, const QRect &r, const QColor &color, bool fade
 
 BasicItemDelegate::BasicItemDelegate(QObject *p)
     : QStyledItemDelegate(p)
+    , trackMouse(false)
+    , underMouse(false)
 {
+    if (GtkStyle::isActive() && qobject_cast<QAbstractItemView *>(p)) {
+        static_cast<QAbstractItemView *>(p)->setAttribute(Qt::WA_MouseTracking);
+        trackMouse=true;
+        p->installEventFilter(this);
+    }
 }
 
 BasicItemDelegate::~BasicItemDelegate()
@@ -70,30 +80,60 @@ void BasicItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opt
 
     bool selected=option.state&QStyle::State_Selected;
     bool active=option.state&QStyle::State_Active;
-    QStyledItemDelegate::paint(painter, option, index);
-    QColor col(option.palette.color(active ? QPalette::Active : QPalette::Inactive,
-                                    selected ? QPalette::HighlightedText : QPalette::Text));
+    if (GtkStyle::isActive()) {
+        bool mouseOver=option.state&QStyle::State_MouseOver;
+        QStyleOptionViewItemV4 opt = option;
+        initStyleOption(&opt, index);
 
+        if (trackMouse && !underMouse) {
+            mouseOver=false;
+        }
 
-    if (4==option.version) {
-        const QStyleOptionViewItemV4 &v4=(QStyleOptionViewItemV4 &)option;
+        if (mouseOver) {
+            opt.showDecorationSelected=true;
 
-        switch (v4.viewItemPosition) {
-        case QStyleOptionViewItemV4::Beginning:
-            drawLine(painter, option.rect, col, true, false);
-            break;
-        case QStyleOptionViewItemV4::Middle:
-            drawLine(painter, option.rect, col, false, false);
-            break;
-        case QStyleOptionViewItemV4::End:
-            drawLine(painter, option.rect, col, false, true);
-            break;
-        case QStyleOptionViewItemV4::Invalid:
-        case QStyleOptionViewItemV4::OnlyOne:
-            drawLine(painter, option.rect, col, true, true);
+            GtkStyle::drawSelection(option, painter, selected ? 0.75 : 0.25);
+            opt.showDecorationSelected=false;
+            opt.state&=~(QStyle::State_MouseOver|QStyle::State_Selected);
+            opt.backgroundBrush=QBrush(Qt::transparent);
+            if (selected) {
+                opt.palette.setBrush(QPalette::Text, opt.palette.highlightedText());
+            }
         }
+        QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
     } else {
+        QStyledItemDelegate::paint(painter, option, index);
+    }
+
+    QColor col(option.palette.color(active ? QPalette::Active : QPalette::Inactive,
+                                    selected ? QPalette::HighlightedText : QPalette::Text));
+
+    switch (((QStyleOptionViewItemV4 &)option).viewItemPosition) {
+    case QStyleOptionViewItemV4::Beginning:
+        drawLine(painter, option.rect, col, true, false);
+        break;
+    case QStyleOptionViewItemV4::Middle:
         drawLine(painter, option.rect, col, false, false);
+        break;
+    case QStyleOptionViewItemV4::End:
+        drawLine(painter, option.rect, col, false, true);
+        break;
+    case QStyleOptionViewItemV4::Invalid:
+    case QStyleOptionViewItemV4::OnlyOne:
+        drawLine(painter, option.rect, col, true, true);
     }
 }
 
+bool BasicItemDelegate::eventFilter(QObject *object, QEvent *event)
+{
+    if (object==parent()) {
+        if (QEvent::Enter==event->type()) {
+            underMouse=true;
+            static_cast<QAbstractItemView *>(parent())->viewport()->update();
+        } else if (QEvent::Leave==event->type()) {
+            underMouse=false;
+            static_cast<QAbstractItemView *>(parent())->viewport()->update();
+        }
+    }
+    return QStyledItemDelegate::eventFilter(object, event);
+}
diff --git a/widgets/basicitemdelegate.h b/widgets/basicitemdelegate.h
index 0d4dbba..74e0100 100644
--- a/widgets/basicitemdelegate.h
+++ b/widgets/basicitemdelegate.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -29,9 +29,15 @@
 class BasicItemDelegate : public QStyledItemDelegate
 {
 public:
+    static void drawLine(QPainter *p, const QRect &r, const QColor &color, bool fadeStart=true, bool fadeEnd=true);
     BasicItemDelegate(QObject *p);
     virtual ~BasicItemDelegate();
     void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+private:
+    bool eventFilter(QObject *object, QEvent *event);
+private:
+    bool trackMouse;
+    bool underMouse;
 };
 
 #endif
diff --git a/widgets/completioncombo.h b/widgets/completioncombo.h
index bc31700..7040e19 100644
--- a/widgets/completioncombo.h
+++ b/widgets/completioncombo.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/coverwidget.cpp b/widgets/coverwidget.cpp
index 88055f2..c717cdc 100644
--- a/widgets/coverwidget.cpp
+++ b/widgets/coverwidget.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -34,7 +34,7 @@
 #include <QFile>
 #include <QTimer>
 #include <QVariant>
-#include <QCoreApplication>
+#include <QApplication>
 #include <QFile>
 
 static QString encode(const QImage &img)
@@ -69,7 +69,7 @@ static void themes(const QString &theme, QStringList &iconThemes)
         QFile f(index);
         if (f.open(QIODevice::ReadOnly|QIODevice::Text)) {
             while (!f.atEnd()) {
-                QString line=f.readLine().trimmed().simplified();
+                QString line=QString::fromUtf8(f.readLine()).trimmed().simplified();
                 if (line.startsWith(key)) {
                     QStringList inherited=line.mid(key.length()).split(",", QString::SkipEmptyParts);
                     foreach (const QString &i, inherited) {
@@ -143,7 +143,6 @@ CoverWidget::CoverWidget(QWidget *parent)
 {
     connect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)), SLOT(coverRetrieved(const Song &, const QImage &, const QString &)));
     connect(Covers::self(), SIGNAL(coverUpdated(const Song &, const QImage &, const QString &)), SLOT(coverRetrieved(const Song &, const QImage &, const QString &)));
-    installEventFilter(this);
     QTimer::singleShot(0, this, SLOT(init())); // Need to do this after constructed, so that size is set....
     setStyleSheet(QString("QLabel {border: %1px solid transparent} QToolTip {background-color:#111111; color: #DDDDDD}").arg(constBorder));
 }
@@ -162,7 +161,7 @@ const QPixmap & CoverWidget::stdPixmap(bool stream)
         pix = (stream ? Icons::self()->streamIcon : Icons::self()->albumIcon).pixmap(iconSize, iconSize).scaled(s, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
 
         QString &file=stream ? noStreamCoverFileName : noCoverFileName;
-        if (stream &file.isEmpty()) {
+        if (stream && file.isEmpty()) {
             #ifdef Q_OS_WIN
             QString iconFile=QCoreApplication::applicationDirPath()+"/icons/stream.png";
             #else
@@ -209,7 +208,21 @@ void CoverWidget::update(const Song &s)
                 coverFileName=cImg.fileName;
                 emit coverImage(cImg.img);
                 emit coverFile(cImg.fileName);
-                emit albumCover(cImg.img);
+                if (current.isFromOnlineService()) {
+                    if (coverFileName.startsWith(
+                        #ifdef Q_OS_WIN
+                        QCoreApplication::applicationDirPath()+"/icons/"
+                        #else
+                        QString(INSTALL_PREFIX"/share/")+QCoreApplication::applicationName()+"/icons/"
+                        #endif
+                                )) {
+                        emit albumCover(QImage());
+                    } else {
+                        emit albumCover(cImg.img);
+                    }
+                } else {
+                    emit albumCover(cImg.img);
+                }
             } else {
                 // We ned to set the image here, so that TrayItem gets the correct 'noCover' image
                 // ...but if Covers does eventually download a cover, we dont want valid->noCover->valid
@@ -253,7 +266,7 @@ void CoverWidget::coverRetrieved(const Song &s, const QImage &img, const QString
     }
 }
 
-bool CoverWidget::eventFilter(QObject *object, QEvent *event)
+bool CoverWidget::event(QEvent *event)
 {
     switch(event->type()) {
     case QEvent::ToolTip: {
@@ -282,12 +295,12 @@ bool CoverWidget::eventFilter(QObject *object, QEvent *event)
         break;
     }
     case QEvent::MouseButtonPress:
-        if (Qt::LeftButton==static_cast<QMouseEvent *>(event)->button()) {
+        if (Qt::LeftButton==static_cast<QMouseEvent *>(event)->button() && Qt::NoModifier==static_cast<QMouseEvent *>(event)->modifiers()) {
             pressed=true;
         }
         break;
     case QEvent::MouseButtonRelease:
-        if (pressed && Qt::LeftButton==static_cast<QMouseEvent *>(event)->button()) {
+        if (pressed && Qt::LeftButton==static_cast<QMouseEvent *>(event)->button() && !QApplication::overrideCursor()) {
             emit clicked();
         }
         pressed=false;
@@ -295,7 +308,7 @@ bool CoverWidget::eventFilter(QObject *object, QEvent *event)
     default:
         break;
     }
-    return QObject::eventFilter(object, event);
+    return QLabel::event(event);
 }
 
 void CoverWidget::resizeEvent(QResizeEvent *e)
diff --git a/widgets/coverwidget.h b/widgets/coverwidget.h
index fafd1b8..f281d4a 100644
--- a/widgets/coverwidget.h
+++ b/widgets/coverwidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -63,7 +63,7 @@ private:
     const QPixmap & stdPixmap(bool stream);
     void update(const QImage &i);
     void update(const QPixmap &pix);
-    bool eventFilter(QObject *object, QEvent *event);
+    bool event(QEvent *event);
     void resizeEvent(QResizeEvent *e);
 //     void paintEvent(QPaintEvent *e);
     #ifndef Q_OS_WIN
diff --git a/widgets/emptyspinbox.h b/widgets/emptyspinbox.h
new file mode 100644
index 0000000..3aeec57
--- /dev/null
+++ b/widgets/emptyspinbox.h
@@ -0,0 +1,58 @@
+/*
+ * Cantata
+ *
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
+ *
+ * ----
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef EMPTYSPINBOX_H
+#define EMPTYSPINBOX_H
+
+#include <QSpinBox>
+#include <QFontMetrics>
+
+class EmptySpinBox : public QSpinBox
+{
+public:
+    EmptySpinBox(QWidget *parent)
+        : QSpinBox(parent)
+        {
+        setKeyboardTracking(true);
+        setMaximum(3000);
+    }
+
+    QSize sizeHint() const {
+        return QSpinBox::sizeHint()+QSize(fontMetrics().height()/2, 0);
+    }
+
+protected:
+    virtual QValidator::State validate(QString &input, int &pos) const {
+        return input.isEmpty() ? QValidator::Acceptable : QSpinBox::validate(input, pos);
+    }
+
+    virtual int valueFromText(const QString &text) const {
+        return text.isEmpty() ? minimum() : QSpinBox::valueFromText(text);
+    }
+
+    virtual QString textFromValue(int val) const {
+        return val==minimum() ? QString() : QSpinBox::textFromValue(val);
+    }
+};
+
+#endif
diff --git a/widgets/genrecombo.cpp b/widgets/genrecombo.cpp
index 2999864..4d8e8a7 100644
--- a/widgets/genrecombo.cpp
+++ b/widgets/genrecombo.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -24,16 +24,28 @@
 #include "genrecombo.h"
 #include "toolbutton.h"
 #include "localize.h"
+#include "actioncollection.h"
+#include "action.h"
+#include <QEvent>
 
 // Max number of items before we try to force a scrollbar in popup menu...
 static const int constPopupItemCount=32;
 
+static Action *action=0;
+
 GenreCombo::GenreCombo(QWidget *p)
      : ComboBox(p)
 {
     setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
     update(QSet<QString>());
     setEditable(false);
+    setFocusPolicy(Qt::NoFocus);
+    if (!action) {
+        action=ActionCollection::get()->createAction("genrefilter", i18n("Filter On Genre"), 0);
+        action->setShortcut(Qt::ControlModifier+Qt::Key_G);
+    }
+    addAction(action);
+    connect(action, SIGNAL(triggered()), SLOT(showEntries()));
 }
 
 void GenreCombo::update(const QSet<QString> &g)
@@ -92,6 +104,13 @@ void GenreCombo::update(const QSet<QString> &g)
     setAttribute(Qt::WA_TransparentForMouseEvents, count()<2);
 }
 
+void GenreCombo::showEntries()
+{
+    if (isVisible()) {
+        showPopup();
+    }
+}
+
 void GenreCombo::paintEvent(QPaintEvent *e)
 {
     if (count()>1) {
@@ -100,3 +119,11 @@ void GenreCombo::paintEvent(QPaintEvent *e)
         QWidget::paintEvent(e);
     }
 }
+
+bool GenreCombo::event(QEvent *event)
+{
+    if (QEvent::ToolTip==event->type() && toolTip()!=action->toolTip()) {
+        setToolTip(action->toolTip());
+    }
+    return ComboBox::event(event);
+}
diff --git a/widgets/genrecombo.h b/widgets/genrecombo.h
index 2660380..b688522 100644
--- a/widgets/genrecombo.h
+++ b/widgets/genrecombo.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -37,10 +37,14 @@ public:
     const QSet<QString> & entries() const { return genres; }
 
     void paintEvent(QPaintEvent *e);
+    bool event(QEvent *event);
 
 public Q_SLOTS:
     void update(const QSet<QString> &g);
 
+private Q_SLOTS:
+    void showEntries();
+
 private:
     QSet<QString> genres;
 };
diff --git a/widgets/groupedview.cpp b/widgets/groupedview.cpp
index 36ea569..54c324e 100644
--- a/widgets/groupedview.cpp
+++ b/widgets/groupedview.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,6 +26,7 @@
 #include "mpdstatus.h"
 #include "song.h"
 #include "actionitemdelegate.h"
+#include "basicitemdelegate.h"
 #include "itemview.h"
 #include "config.h"
 #include "localize.h"
@@ -251,7 +252,7 @@ public:
                     track=streamText(song, trackTitle);
                 }
             } else if (isEmpty) {
-                title=i18n("Unknown");
+                title=Song::unknown();
                 track=trackTitle;
             } else if (song.album.isEmpty()) {
                 title=song.artistOrComposer();
@@ -441,7 +442,7 @@ public:
         if (mouseOver) {
             drawIcons(painter, option.rect, true, rtl, AlbumHeader==type || isCollection ? AP_HBottom : AP_HMiddle, index);
         }
-        drawDivider(painter, option.rect, col);
+        BasicItemDelegate::drawLine(painter, option.rect, col);
         painter->restore();
     }
 
@@ -466,6 +467,7 @@ GroupedView::GroupedView(QWidget *parent, bool isPlayQueue)
     setHeaderHidden(true);
     setRootIsDecorated(false);
     setSelectionBehavior(SelectRows);
+    setForceSingleColumn(true);
     connect(this, SIGNAL(clicked(const QModelIndex &)), this, SLOT(itemClicked(const QModelIndex &)));
     setStyleSheet("QTreeView::branch { border: 0px; }");
     GroupedViewDelegate *delegate=new GroupedViewDelegate(this);
@@ -483,15 +485,14 @@ GroupedView::~GroupedView()
 
 void GroupedView::setModel(QAbstractItemModel *model)
 {
-    QTreeView::setModel(model);
+    TreeView::setModel(model);
     if (model) {
-        connect(Covers::self(), SIGNAL(coverRetrieved(const Song &)), this, SLOT(coverRetrieved(const Song &)));
-        int columnCount=model->columnCount();
-        QHeaderView *hdr=header();
-        for (int i=1; i<columnCount; ++i) {
-            hdr->setSectionHidden(i, true);
+        if (startClosed) {
+            updateCollectionRows();
         }
+        connect(Covers::self(), SIGNAL(coverRetrieved(const Song &)), this, SLOT(coverRetrieved(const Song &)));
     } else {
+        controlledAlbums.clear();
         disconnect(Covers::self(), SIGNAL(coverRetrieved(const Song &)), this, SLOT(coverRetrieved(const Song &)));
     }
 }
@@ -526,6 +527,9 @@ void GroupedView::setStartClosed(bool sc)
     }
     controlledAlbums.clear();
     startClosed=sc;
+    if (startClosed) {
+        updateCollectionRows();
+    }
 }
 
 void GroupedView::updateRows(qint32 row, quint16 curAlbum, bool scroll, const QModelIndex &parent)
@@ -828,8 +832,7 @@ void GroupedView::expand(const QModelIndex &idx, bool singleOnly)
                     expand(idx.child(i, 0));
                 }
             }
-        }
-        else if (AlbumHeader==getType(idx)) {
+        } else if (AlbumHeader==getType(idx)) {
             quint16 indexKey=idx.data(GroupedView::Role_Key).toUInt();
             quint32 collection=idx.data(GroupedView::Role_CollectionId).toUInt();
             if (!isExpanded(indexKey, collection)) {
@@ -838,3 +841,18 @@ void GroupedView::expand(const QModelIndex &idx, bool singleOnly)
         }
     }
 }
+
+void GroupedView::collapse(const QModelIndex &idx, bool singleOnly)
+{
+    if (idx.isValid()) {
+        if (idx.data(GroupedView::Role_IsCollection).toBool()) {
+            setExpanded(idx, false);
+            if (!singleOnly) {
+                quint32 count=model()->rowCount(idx);
+                for (quint32 i=0; i<count; ++i) {
+                    collapse(idx.child(i, 0));
+                }
+            }
+        }
+    }
+}
diff --git a/widgets/groupedview.h b/widgets/groupedview.h
index 7683c97..d3ee7dd 100644
--- a/widgets/groupedview.h
+++ b/widgets/groupedview.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -44,7 +44,7 @@ public:
     };
 
     enum Roles {
-        Role_Key = Qt::UserRole+512,
+        Role_Key = Qt::UserRole+200,
         Role_Id,
         Role_Song,
         Role_AlbumDuration,
@@ -83,6 +83,7 @@ public:
     void dropEvent(QDropEvent *event);
     void collectionRemoved(quint32 key);
     void expand(const QModelIndex &idx, bool singleOnly=false);
+    void collapse(const QModelIndex &idx, bool singleOnly=false);
 
 public Q_SLOTS:
     void updateRows(const QModelIndex &parent);
diff --git a/widgets/icons.cpp b/widgets/icons.cpp
index 6b4b026..18cf546 100644
--- a/widgets/icons.cpp
+++ b/widgets/icons.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -54,29 +54,27 @@ Icons * Icons::self()
 }
 
 static QList<int> constStdSizes=QList<int>() << 16 << 22 << 32 << 48;
-static const double constDisabledOpacity=0.5;
-static const int constShadeFactor=75;
+
+static const int constDarkLimit=80;
+static const int constDarkValue=64;
+static const int constLightLimit=240;
+static const int constLightValue=240;
 
 static bool inline isLight(const QColor &col)
 {
     return col.red()>100 && col.blue()>100 && col.green()>100;
 }
 
-static bool inline isVeryLight(const QColor &col, int limit=200)
+static bool inline isVeryLight(const QColor &col, int limit=constLightValue)
 {
     return col.red()>=limit && col.blue()>=limit && col.green()>=limit;
 }
 
-static bool inline isVeryDark(const QColor &col, int limit=80)
+static bool inline isVeryDark(const QColor &col, int limit=constDarkValue)
 {
     return col.red()<limit && col.blue()<limit && col.green()<limit;
 }
 
-static const int constDarkLimit=80;
-static const int constDarkValue=64;
-static const int constLightLimit=240;
-static const int constLightValue=240;
-
 static QColor clampColor(const QColor &color, int darkLimit=constDarkLimit, int darkValue=constDarkValue,
                          int lightLimit=constLightLimit, int lightValue=constLightValue)
 {
@@ -136,6 +134,7 @@ static QPixmap createConsumeIconPixmap(int size, const QColor &col, double opaci
     return pix;
 }
 
+#ifndef USE_SYSTEM_MENU_ICON
 static QPainterPath buildPath(const QRectF &r, double radius)
 {
     QPainterPath path;
@@ -151,6 +150,8 @@ static QPainterPath buildPath(const QRectF &r, double radius)
 
 static QPixmap createMenuIconPixmap(int size, QColor col, double opacity=1.0)
 {
+    static const int constShadeFactor=75;
+
     QPixmap pix(size, size);
     pix.fill(Qt::transparent);
     QPainter p(&pix);
@@ -193,53 +194,43 @@ static QPixmap createMenuIconPixmap(int size, QColor col, double opacity=1.0)
     p.end();
     return pix;
 }
+#endif
 
-static void calcIconColors(QColor &stdColor, QColor &highlightColor)
+static QColor calcIconColor()
 {
     QColor bgnd=QApplication::palette().color(QPalette::Active, QPalette::Background);
-    QColor text=QApplication::palette().color(QPalette::Active, QPalette::ButtonText);
-    stdColor=clampColor(text, constDarkLimit, bgnd.value()<224 ? 32 : 48);
-    highlightColor=isLight(stdColor) ? stdColor.lighter(constShadeFactor) : stdColor.darker(constShadeFactor);
+    QColor text=QApplication::palette().color(QPalette::Active, QPalette::WindowText);
+    return clampColor(text, constDarkLimit, bgnd.value()<224 ? 32 : 48);
 }
 
-static Icon createSingleIcon(const QColor &stdColor, const QColor &highlightColor)
+static Icon createSingleIcon(const QColor &stdColor)
 {
     Icon icon;
-
     foreach (int s, constStdSizes) {
         icon.addPixmap(createSingleIconPixmap(s, stdColor));
-        icon.addPixmap(createSingleIconPixmap(s, stdColor, constDisabledOpacity), QIcon::Disabled);
-        icon.addPixmap(createSingleIconPixmap(s, highlightColor), QIcon::Active);
     }
-
     return icon;
 }
 
-static Icon createConsumeIcon(const QColor &stdColor, const QColor &highlightColor)
+static Icon createConsumeIcon(const QColor &stdColor)
 {
     Icon icon;
-
     foreach (int s, constStdSizes) {
         icon.addPixmap(createConsumeIconPixmap(s, stdColor));
-        icon.addPixmap(createConsumeIconPixmap(s, stdColor, constDisabledOpacity), QIcon::Disabled);
-        icon.addPixmap(createConsumeIconPixmap(s, highlightColor), QIcon::Active);
     }
-
     return icon;
 }
 
-static Icon createMenuIcon(const QColor &stdColor, const QColor &highlightColor)
+#ifndef USE_SYSTEM_MENU_ICON
+static Icon createMenuIcon(const QColor &stdColor)
 {
     Icon icon;
-
     foreach (int s, constStdSizes) {
         icon.addPixmap(createMenuIconPixmap(s, stdColor));
-        icon.addPixmap(createMenuIconPixmap(s, stdColor, constDisabledOpacity), QIcon::Disabled);
-        icon.addPixmap(createMenuIconPixmap(s, highlightColor), QIcon::Active);
     }
-
     return icon;
 }
+#endif
 
 static void recolourPix(QImage &img, const QColor &col, double opacity=1.0)
 {
@@ -285,7 +276,7 @@ static QPixmap recolour(const QImage &img, const QColor &col, double opacity=1.0
     return QPixmap::fromImage(i);
 }
 
-static Icon createRecolourableIcon(const QString &name, const QColor &stdColor, const QColor &highlightColor)
+static Icon createRecolourableIcon(const QString &name, const QColor &stdColor)
 {
     if (QColor(Qt::black)==stdColor) {
         // Text colour is black, so is icon, therefore no need to recolour!!!
@@ -298,44 +289,38 @@ static Icon createRecolourableIcon(const QString &name, const QColor &stdColor,
         QImage img(QChar(':')+name+QString::number(s));
         if (!img.isNull()) {
             icon.addPixmap(recolour(img, stdColor));
-            icon.addPixmap(recolour(img, stdColor, constDisabledOpacity), QIcon::Disabled);
-            icon.addPixmap(recolour(img, highlightColor), QIcon::Active);
         }
     }
     return icon;
 }
 
-static QColor stdColor;
-static QColor highlightColor;
-
-static void updateSidebarIcon(Icon &i, const QString &name, const QColor &color, QIcon::Mode mode)
+static void updateMonoSvgIcon(Icon &i, const QString &type, const QString &name, const QColor &color, QIcon::Mode mode)
 {
-    QColor adjusted=color;
     int darkValue=constDarkValue;
     int lightValue=constLightValue;
 
-    if (isVeryDark(adjusted)) {
+    if (isVeryDark(color)) {
         QColor bgnd=QApplication::palette().color(QPalette::Active, QPalette::Background);
         if (bgnd.value()<224) {
             darkValue=48;
         }
-    } else if (isVeryLight(adjusted)) {
+    } else if (isVeryLight(color)) {
         QColor bgnd=QApplication::palette().color(QPalette::Active, QPalette::Background);
         if (bgnd.value()<224) {
             lightValue=232;
         }
     }
 
-    if (darkValue==constDarkValue && isVeryDark(adjusted)) {
-        i.addFile(":sidebar-"+name+"-dark", QSize(), mode);
-    } else if (lightValue==constLightValue && isVeryLight(adjusted)) {
-        i.addFile(":sidebar-"+name+"-light", QSize(), mode);
+    if (darkValue==constDarkValue && isVeryDark(color)) {
+        i.addFile(":"+type+"-"+name+"-dark", QSize(), mode);
+    } else if (lightValue==constLightValue && isVeryLight(color)) {
+        i.addFile(":"+type+"-"+name+"-light", QSize(), mode);
     } else { // Neither black nor white, so we need to recolour...
         Icon std;
-        std.addFile(":sidebar-"+name+"-dark", QSize(), mode);
+        std.addFile(":"+type+"-"+name+"-dark", QSize(), mode);
         // Now recolour the icon!
         QList<int> sizes=QList<int>() << 16 << 22 << 32 << 48 << 64;
-        QColor col=clampColor(adjusted, constDarkLimit, darkValue, constLightLimit, lightValue);
+        QColor col=clampColor(color, constDarkLimit, darkValue, constLightLimit, lightValue);
         foreach (int s, sizes) {
             QImage img=std.pixmap(s, s, mode).toImage().convertToFormat(QImage::Format_ARGB32);
             recolourPix(img, col);
@@ -344,23 +329,74 @@ static void updateSidebarIcon(Icon &i, const QString &name, const QColor &color,
     }
 }
 
-static Icon loadSidebarIcon(const QString &name, const QColor &normal, const QColor &selected)
+static Icon loadMonoSvgIcon(const QString &type, const QString &name, const QColor &normal, const QColor &selected)
 {
     Icon i;
-    updateSidebarIcon(i, name, normal, QIcon::Normal);
+    updateMonoSvgIcon(i, type, name, normal, QIcon::Normal);
     if (normal!=selected) {
-        updateSidebarIcon(i, name, selected, QIcon::Selected);
+        updateMonoSvgIcon(i, type, name, selected, QIcon::Selected);
     }
     return i;
 }
 
+static Icon loadSidebarIcon(const QString &name, const QColor &normal, const QColor &selected)
+{
+    return loadMonoSvgIcon(QLatin1String("sidebar"), name, normal, selected);
+}
+
+#if !defined Q_OS_WIN && !defined Q_OS_MAC
+static void setDisabledOpacity(Icon &icon)
+{
+    static const double constDisabledOpacity=0.5;
+    Icon copy;
+    for (int i=0; i<2; ++i) {
+        QIcon::State state=(QIcon::State)i;
+        for (int j=0; j<4; ++j) {
+            QIcon::Mode mode=(QIcon::Mode)j;
+            QList<int> sizes=constStdSizes;
+            foreach (const int sz, sizes) {
+                if (QIcon::Disabled==mode) {
+                    QPixmap pix=icon.pixmap(QSize(sz, sz), QIcon::Normal, state);
+                    if (!pix.isNull()) {
+                        QPixmap dis(sz, sz);
+                        dis.fill(Qt::transparent);
+                        QPainter p(&dis);
+                        p.setOpacity(constDisabledOpacity);
+                        p.drawPixmap(0, 0, pix);
+                        p.end();
+                        copy.addPixmap(dis, mode, state);
+                    }
+                } else {
+                    copy.addPixmap(icon.pixmap(QSize(sz, sz), mode, state), mode, state);
+                }
+            }
+        }
+    }
+    icon=copy;
+}
+
+static Icon loadMediaIcon(const QString &name, const QColor &normal, const QColor &selected)
+{
+    Icon icon=loadMonoSvgIcon(QLatin1String("media"), name, normal, selected);
+    setDisabledOpacity(icon);
+    return icon;
+}
+#endif
+
 Icons::Icons()
 {
-    calcIconColors(stdColor, highlightColor);
-    singleIcon=createSingleIcon(stdColor, highlightColor);
-    consumeIcon=createConsumeIcon(stdColor, highlightColor);
-    menuIcon=createMenuIcon(stdColor, highlightColor);
+    QColor stdColor=calcIconColor();
+    singleIcon=createSingleIcon(stdColor);
+    consumeIcon=createConsumeIcon(stdColor);
+    #ifdef USE_SYSTEM_MENU_ICON
+    menuIcon=Icon("applications-system");
+    #else
+    menuIcon=createMenuIcon(stdColor);
+    #endif
+
+    #ifdef ENABLE_STREAMS
     streamCategoryIcon=Icon(QLatin1String("oxygen")==Icon::currentTheme().toLower() ? "inode-directory" : "folder-music");
+    #endif
 
     #ifdef Q_OS_WIN
     QString iconFile=QCoreApplication::applicationDirPath()+"/icons/stream.png";
@@ -387,8 +423,8 @@ Icons::Icons()
     editIcon=Icon("document-edit");
     searchIcon=Icon("edit-find");
     clearListIcon=Icon("edit-clear-list");
-    repeatIcon=createRecolourableIcon("repeat", stdColor, highlightColor);
-    shuffleIcon=createRecolourableIcon("shuffle", stdColor, highlightColor);
+    repeatIcon=createRecolourableIcon("repeat", stdColor);
+    shuffleIcon=createRecolourableIcon("shuffle", stdColor);
     filesIcon=Icon("document-multiple");
     cancelIcon=Icon("dialog-cancel");
     importIcon=Icon("document-import");
@@ -404,10 +440,6 @@ Icons::Icons()
     variousArtistsIcon=Icon::create("va", QList<int>() << 16 << 22 << 32 << 48 << 64 << 128);
     artistIcon=Icon::create("artist", QList<int>() << 16 << 22 << 32 << 48 << 64 << 128);
     #ifndef ENABLE_KDE_SUPPORT
-    QList<int> appSizes=QList<int>() << 16 << 22 << 24 << 32 << 48 << 64;
-    foreach (int s, appSizes) {
-        appIcon.addFile(QString(":cantata%1.png").arg(s), QSize(s, s));
-    }
     appIcon.addFile(":cantata.svg");
 
     shortcutsIcon=Icon("preferences-desktop-keyboard");
@@ -433,9 +465,11 @@ Icons::Icons()
             speakerIcon=Icon("gnome-volume-control");
         }
     }
+    #ifdef ENABLE_DYNAMIC
     if (dynamicRuleIcon.isNull()) {
         dynamicRuleIcon=Icon("text-x-generic");
     }
+    #endif
     if (playlistIcon.isNull()) {
         playlistIcon=Icon("audio-x-mp3-playlist");
         if (playlistIcon.isNull()) {
@@ -457,39 +491,62 @@ Icons::Icons()
     #endif // Q_OS_WIN && Q_OS_MAC
     #endif // ENABLE_KDE_SUPPORT
 
+    #ifdef ENABLE_STREAMS
     if (streamCategoryIcon.isNull()) {
         streamCategoryIcon=libraryIcon;
     }
+    #endif
+}
+
+static bool monoSb=true;
+bool Icons::monoSidebarIcons()
+{
+    return monoSb;
 }
 
 void Icons::initSidebarIcons()
 {
     if (Settings::self()->monoSidebarIcons()) {
-        QColor textCol=QApplication::palette().color(QPalette::Active, QPalette::ButtonText);
+        monoSb=true;
+        QColor textCol=QApplication::palette().color(QPalette::Active, QPalette::WindowText);
         QColor highlightedTexCol=QApplication::palette().color(QPalette::Active, QPalette::HighlightedText);
-        playqueueIcon=loadSidebarIcon("playqueue", textCol, highlightedTexCol);
-        artistsIcon=loadSidebarIcon("artists", textCol, highlightedTexCol);
-        albumsIcon=loadSidebarIcon("albums", textCol, highlightedTexCol);
-        foldersIcon=loadSidebarIcon("folders", textCol, highlightedTexCol);
-        playlistsIcon=loadSidebarIcon("playlists", textCol, highlightedTexCol);
-        dynamicIcon=loadSidebarIcon("dynamic", textCol, highlightedTexCol);
-        streamsIcon=loadSidebarIcon("streams", textCol, highlightedTexCol);
-        onlineIcon=loadSidebarIcon("online", textCol, highlightedTexCol);
-        infoSidebarIcon=loadSidebarIcon("info", textCol, highlightedTexCol);
+        playqueueIcon=loadSidebarIcon(QLatin1String("playqueue"), textCol, highlightedTexCol);
+        artistsIcon=loadSidebarIcon(QLatin1String("artists"), textCol, highlightedTexCol);
+        albumsIcon=loadSidebarIcon(QLatin1String("albums"), textCol, highlightedTexCol);
+        foldersIcon=loadSidebarIcon(QLatin1String("folders"), textCol, highlightedTexCol);
+        playlistsIcon=loadSidebarIcon(QLatin1String("playlists"), textCol, highlightedTexCol);
+        #ifdef ENABLE_DYNAMIC
+        dynamicIcon=loadSidebarIcon(QLatin1String("dynamic"), textCol, highlightedTexCol);
+        #endif
+        #ifdef ENABLE_STREAMS
+        streamsIcon=loadSidebarIcon(QLatin1String("streams"), textCol, highlightedTexCol);
+        #endif
+        #ifdef ENABLE_ONLINE_SERVICES
+        onlineIcon=loadSidebarIcon(QLatin1String("online"), textCol, highlightedTexCol);
+        #endif
+        infoSidebarIcon=loadSidebarIcon(QLatin1String("info"), textCol, highlightedTexCol);
         #ifdef ENABLE_DEVICES_SUPPORT
-        devicesIcon=loadSidebarIcon("devices", textCol, highlightedTexCol);
+        devicesIcon=loadSidebarIcon(QLatin1String("devices"), textCol, highlightedTexCol);
         #endif
+        searchTabIcon=loadSidebarIcon(QLatin1String("search"), textCol, highlightedTexCol);
     } else {
+        monoSb=false;
         playqueueIcon=Icon("media-playback-start");
         artistsIcon=artistIcon;
         albumsIcon=albumIcon;
         foldersIcon=Icon("inode-directory");
         playlistsIcon=playlistIcon;
+        #ifdef ENABLE_DYNAMIC
         dynamicIcon=dynamicRuleIcon;
+        #endif
+        #ifdef ENABLE_STREAMS
         streamsIcon=radioStreamIcon;
+        #endif
+        #ifdef ENABLE_ONLINE_SERVICES
         onlineIcon=Icon("applications-internet");
+        #endif
         if (QLatin1String("gnome")==Icon::currentTheme().toLower()) {
-            QColor col=QApplication::palette().color(QPalette::Active, QPalette::ButtonText);
+            QColor col=QApplication::palette().color(QPalette::Active, QPalette::WindowText);
             infoSidebarIcon=loadSidebarIcon("info", col, col);
         } else {
             infoSidebarIcon=Icon("dialog-information");
@@ -497,72 +554,53 @@ void Icons::initSidebarIcons()
         #ifdef ENABLE_DEVICES_SUPPORT
         devicesIcon=Icon("multimedia-player");
         #endif
+        searchTabIcon=searchIcon;
     }
 }
 
-#if !defined ENABLE_KDE_SUPPORT && !defined Q_OS_WIN && !defined Q_OS_MAC // FIXME -- needed?
-// For some reason, the -symbolic icons on Ubuntu have a lighter colour when disabled!
-// This looks odd to me, so base the disabled icon on the enabled version but with opacity
-// set to default value...
-static void setDisabledOpacity(Icon &icon)
+void Icons::initToolbarIcons(const QColor &toolbarText)
 {
-    Icon copy;
-    for (int i=0; i<2; ++i) {
-        QIcon::State state=(QIcon::State)i;
-        for (int j=0; j<4; ++j) {
-            QIcon::Mode mode=(QIcon::Mode)j;
-            QList<int> sizes=constStdSizes;
-            foreach (const int sz, sizes) {
-                if (QIcon::Disabled==mode) {
-                    QPixmap pix=icon.pixmap(QSize(sz, sz), QIcon::Normal, state);
-                    if (!pix.isNull()) {
-                        QPixmap dis(sz, sz);
-                        dis.fill(Qt::transparent);
-                        QPainter p(&dis);
-                        p.setOpacity(constDisabledOpacity);
-                        p.drawPixmap(0, 0, pix);
-                        p.end();
-                        copy.addPixmap(dis, mode, state);
-                    }
-                } else {
-                    copy.addPixmap(icon.pixmap(QSize(sz, sz), mode, state), mode, state);
-                }
-            }
-        }
-    }
-    icon=copy;
-}
-#else
-#define setDisabledOpacity(A) ;
-#endif
-
-void Icons::initToolbarIcons(const QColor &color, bool forceLight)
-{
-    bool light=forceLight || isLight(color);
-
-    if (light) {
-        QColor col(Qt::white);
-        QColor highlight(col.darker(constShadeFactor));
-        toolbarMenuIcon=createMenuIcon(col, highlight);
-    } else {
-        toolbarMenuIcon=menuIcon;
-    }
-
+    #ifdef USE_SYSTEM_MENU_ICON
+    Q_UNUSED(toolbarText)
+    #endif
+    QColor stdColor=calcIconColor();
     #if !defined Q_OS_WIN && !defined Q_OS_MAC
-    if (light && GtkStyle::useSymbolicIcons()) {
-        toolbarPrevIcon=Icon("media-skip-backward-symbolic");
-        toolbarPlayIcon=Icon("media-playback-start-symbolic");
-        toolbarPauseIcon=Icon("media-playback-pause-symbolic");
-        toolbarStopIcon=Icon("media-playback-stop-symbolic");
-        toolbarNextIcon=Icon("media-skip-forward-symbolic");
-        QColor col(196, 196, 196);
+    if (GtkStyle::useSymbolicIcons()) {
+        bool rtl=Qt::RightToLeft==QApplication::layoutDirection();
+        QColor col=GtkStyle::symbolicColor();
+        toolbarPrevIcon=loadMediaIcon(QLatin1String(rtl ? "prev-rtl" : "prev"), col, col);
+        toolbarPlayIcon=loadMediaIcon(QLatin1String(rtl ? "play-rtl" : "play"), col, col);
+        toolbarPauseIcon=loadMediaIcon(QLatin1String("pause"), col, col);
+        toolbarStopIcon=loadMediaIcon(QLatin1String("stop"), col, col);
+        toolbarNextIcon=loadMediaIcon(QLatin1String(rtl ? "next-rtl" : "next"), col, col);
         infoIcon=loadSidebarIcon("info", col, col);
+        #ifdef USE_SYSTEM_MENU_ICON
+        toolbarMenuIcon=loadMonoSvgIcon(QLatin1String("menu"), QLatin1String("icon"), col, col);
+        menuIcon=loadMonoSvgIcon(QLatin1String("menu"), QLatin1String("icon"), stdColor, stdColor);
+        #else
+        if (col==stdColor) {
+            toolbarMenuIcon=menuIcon;
+        } else {
+            toolbarMenuIcon=createMenuIcon(col);
+        }
+        #endif
     } else
     #endif
+    {
+        #ifdef USE_SYSTEM_MENU_ICON
+        toolbarMenuIcon=menuIcon;
+        #else
+        if (toolbarText==stdColor) {
+            toolbarMenuIcon=menuIcon;
+        } else {
+            toolbarMenuIcon=createMenuIcon(toolbarText);
+        }
+        #endif
         if (QLatin1String("gnome")==Icon::currentTheme().toLower()) {
-            QColor col=QApplication::palette().color(QPalette::Active, QPalette::ButtonText);
+            QColor col=QApplication::palette().color(QPalette::Active, QPalette::WindowText);
             infoIcon=loadSidebarIcon("info", col, col);
         }
+    }
 
     if (infoIcon.isNull()) {
         infoIcon=Icon("dialog-information");
@@ -570,7 +608,7 @@ void Icons::initToolbarIcons(const QColor &color, bool forceLight)
 
     #if !defined ENABLE_KDE_SUPPORT && !defined Q_OS_WIN && !defined Q_OS_MAC
     if (QLatin1String("gnome")==Icon::currentTheme().toLower()) {
-        QColor col=QApplication::palette().color(QPalette::Active, QPalette::ButtonText);
+        QColor col=QApplication::palette().color(QPalette::Active, QPalette::WindowText);
         contextIcon=loadSidebarIcon("info", col, col);
     } else
     #endif
@@ -578,27 +616,17 @@ void Icons::initToolbarIcons(const QColor &color, bool forceLight)
 
     if (toolbarPrevIcon.isNull()) {
         toolbarPrevIcon=Icon::getMediaIcon("media-skip-backward");
-    } else {
-        setDisabledOpacity(toolbarPrevIcon);
     }
     if (toolbarPlayIcon.isNull()) {
         toolbarPlayIcon=Icon::getMediaIcon("media-playback-start");
-    } else {
-        setDisabledOpacity(toolbarPlayIcon);
     }
     if (toolbarPauseIcon.isNull()) {
         toolbarPauseIcon=Icon::getMediaIcon("media-playback-pause");
-    } else {
-        setDisabledOpacity(toolbarPauseIcon);
     }
     if (toolbarStopIcon.isNull()) {
         toolbarStopIcon=Icon::getMediaIcon("media-playback-stop");
-    } else {
-        setDisabledOpacity(toolbarStopIcon);
     }
     if (toolbarNextIcon.isNull()) {
         toolbarNextIcon=Icon::getMediaIcon("media-skip-forward");
-    } else {
-        setDisabledOpacity(toolbarNextIcon);
     }
 }
diff --git a/widgets/icons.h b/widgets/icons.h
index f87f718..cc877c4 100644
--- a/widgets/icons.h
+++ b/widgets/icons.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -35,8 +35,9 @@ public:
     static Icons *self();
 
     Icons();
+    bool monoSidebarIcons();
     void initSidebarIcons();
-    void initToolbarIcons(const QColor &color, bool forceLight=false);
+    void initToolbarIcons(const QColor &toolbarText);
     #ifndef ENABLE_KDE_SUPPORT
     Icon appIcon;
     Icon shortcutsIcon;
@@ -48,13 +49,15 @@ public:
     Icon folderIcon;
     Icon audioFileIcon;
     Icon playlistIcon;
-    Icon dynamicRuleIcon;
+    Icon dynamicRuleIcon; // Alsu used for Mopidy smart playlists...
     Icon singleIcon;
     Icon consumeIcon;
     Icon repeatIcon;
     Icon shuffleIcon;
     Icon libraryIcon;
+    #ifdef ENABLE_STREAMS
     Icon streamCategoryIcon;
+    #endif
     Icon radioStreamIcon;
     Icon addRadioStreamIcon;
     Icon streamIcon;
@@ -76,10 +79,17 @@ public:
     Icon albumsIcon;
     Icon foldersIcon;
     Icon playlistsIcon;
+    #ifdef ENABLE_DYNAMIC
     Icon dynamicIcon;
+    #endif
+    #ifdef ENABLE_STREAMS
     Icon streamsIcon;
+    #endif
+    #ifdef ENABLE_ONLINE_SERVICES
     Icon onlineIcon;
+    #endif
     Icon contextIcon;
+    Icon searchTabIcon;
     Icon infoIcon;
     Icon infoSidebarIcon;
     #ifdef ENABLE_DEVICES_SUPPORT
diff --git a/widgets/itemview.cpp b/widgets/itemview.cpp
index a99c85a..d5443a3 100644
--- a/widgets/itemview.cpp
+++ b/widgets/itemview.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -27,6 +27,7 @@
 #include "covers.h"
 #include "proxymodel.h"
 #include "actionitemdelegate.h"
+#include "basicitemdelegate.h"
 #include "actionmodel.h"
 #include "localize.h"
 #include "icon.h"
@@ -64,6 +65,7 @@ ViewEventHandler::ViewEventHandler(ActionItemDelegate *d, QAbstractItemView *v)
     : QObject(v)
     , delegate(d)
     , view(v)
+    , interceptBackspace(qobject_cast<ListView *>(view))
 {
 }
 
@@ -81,6 +83,16 @@ bool ViewEventHandler::eventFilter(QObject *obj, QEvent *event)
             view->viewport()->update();
         }
     }
+
+    if (interceptBackspace && view->hasFocus()) {
+        if (QEvent::KeyPress==event->type()) {
+            QKeyEvent *keyEvent=static_cast<QKeyEvent *>(event);
+            if (Qt::Key_Backspace==keyEvent->key() && Qt::NoModifier==keyEvent->modifiers()) {
+                emit escPressed();
+            }
+        }
+    }
+
     return QObject::eventFilter(obj, event);
 }
 
@@ -118,7 +130,9 @@ public:
             // Use same calculation as in LibraryPage/AlbumsPage...
             return QSize(imageSize+8, imageSize+(QApplication::fontMetrics().height()*2.5));
         } else {
-            bool oneLine = index.data(ItemView::Role_SubText).toString().isEmpty();
+            // TODO: Any poit to checking one-line here? All models return sub-text...
+            //       Thisngs will be quicker if we dont call SubText here...
+            bool oneLine = false ; // index.data(ItemView::Role_SubText).toString().isEmpty();
             bool showCapacity = !index.data(ItemView::Role_CapacityText).toString().isEmpty();
             int textHeight = QApplication::fontMetrics().height()*(oneLine ? 1 : 2);
 
@@ -316,7 +330,7 @@ public:
             drawIcons(painter, AP_VTop==actionPos ? r2 : r, true, rtl, actionPos, index);
         }
         if (!iconMode) {
-            drawDivider(painter, option.rect, color);
+            BasicItemDelegate::drawLine(painter, option.rect, color);
         }
         painter->restore();
     }
@@ -365,21 +379,23 @@ public:
         bool rtl = Qt::RightToLeft==QApplication::layoutDirection();
         bool selected=option.state&QStyle::State_Selected;
         bool active=option.state&QStyle::State_Active;
+        bool mouseOver=underMouse && option.state&QStyle::State_MouseOver;
+
         if (!gtk && 1==text.count()) {
             QStyledItemDelegate::paint(painter, option, index);
         } else {
-            if ((option.state&QStyle::State_MouseOver) && gtk) {
+            if (mouseOver && gtk) {
                 GtkStyle::drawSelection(option, painter, selected ? 0.75 : 0.25);
             } else {
                 QApplication::style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, 0L);
             }
             QRect r(option.rect);
             r.adjust(4, 0, -4, 0);
-            QPixmap pix=index.data(Qt::DecorationRole).value<QIcon>().pixmap(treeDecorationSize, treeDecorationSize);
+            QPixmap pix=noIcons ? QPixmap() : index.data(Qt::DecorationRole).value<QIcon>().pixmap(treeDecorationSize, treeDecorationSize);
             if (gtk && pix.isNull()) {
                 QVariant image = index.data(ItemView::Role_Image);
                 if (!image.isNull()) {
-                    pix = QVariant::Pixmap==image.type() ? image.value<QPixmap>() : image.value<QIcon>().pixmap(listDecorationSize, listDecorationSize);
+                    pix = QVariant::Pixmap==image.type() ? image.value<QPixmap>() : noIcons ? QPixmap() : image.value<QIcon>().pixmap(listDecorationSize, listDecorationSize);
                 }
             }
             if (!pix.isNull()) {
@@ -423,17 +439,75 @@ public:
             }
         }
 
-        if ((option.state & QStyle::State_MouseOver)) {
+        if (mouseOver) {
             drawIcons(painter, option.rect, true, rtl, AP_HMiddle, index);
         }
-        drawDivider(painter, option.rect, option.palette.color(active ? QPalette::Active : QPalette::Inactive,
-                                                               selected ? QPalette::HighlightedText : QPalette::Text));
+        BasicItemDelegate::drawLine(painter, option.rect, option.palette.color(active ? QPalette::Active : QPalette::Inactive,
+                                                                               selected ? QPalette::HighlightedText : QPalette::Text));
     }
 
     void setSimple(bool s) { simpleStyle=s; }
+    void setNoIcons(bool n) { noIcons=n; }
 
     bool simpleStyle;
+    bool noIcons;
+};
+
+#if 0
+// NOTE: was to be used for table style playlists page, but actions overlap text in last column :-(
+class TableDelegate : public ActionItemDelegate
+{
+public:
+    TableDelegate(QAbstractItemView *p)
+        : ActionItemDelegate(p)
+    {
+    }
+
+    virtual ~TableDelegate()
+    {
+    }
+
+    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+    {
+        if (!index.isValid()) {
+            return;
+        }
+        bool selected=option.state&QStyle::State_Selected;
+        bool active=option.state&QStyle::State_Active;
+        QStyledItemDelegate::paint(painter, option, index);
+        QColor col(option.palette.color(active ? QPalette::Active : QPalette::Inactive,
+                                        selected ? QPalette::HighlightedText : QPalette::Text));
+
+
+        if (4==option.version) {
+            bool drawActions=false;
+            const QStyleOptionViewItemV4 &v4=(QStyleOptionViewItemV4 &)option;
+
+            switch (v4.viewItemPosition) {
+            case QStyleOptionViewItemV4::Beginning:
+                BasicItemDelegate::drawLine(painter, option.rect, col, true, false);
+                break;
+            case QStyleOptionViewItemV4::Middle:
+                BasicItemDelegate::drawLine(painter, option.rect, col, false, false);
+                break;
+            case QStyleOptionViewItemV4::End:
+                BasicItemDelegate::drawLine(painter, option.rect, col, false, true);
+                drawActions=true;
+                break;
+            case QStyleOptionViewItemV4::Invalid:
+            case QStyleOptionViewItemV4::OnlyOne:
+                drawActions=true;
+                BasicItemDelegate::drawLine(painter, option.rect, col, true, true);
+            }
+            if (drawActions && underMouse && option.state&QStyle::State_MouseOver) {
+                drawIcons(painter, option.rect, true, Qt::RightToLeft==QApplication::layoutDirection(), AP_HMiddle, index);
+            }
+        } else {
+            BasicItemDelegate::drawLine(painter, option.rect, col, false, false);
+        }
+    }
 };
+#endif
 
 ItemView::Mode ItemView::toMode(const QString &str)
 {
@@ -459,13 +533,17 @@ QString ItemView::modeStr(Mode m)
     switch (m) {
     default:
     case Mode_SimpleTree:   return QLatin1String("simpletree");
+    case Mode_BasicTree:    return QLatin1String("basictree");
     case Mode_DetailedTree: return QLatin1String("detailedtree");
     case Mode_List:         return QLatin1String("list");
     case Mode_IconTop:      return QLatin1String("icontop");
     case Mode_GroupedTree:  return QLatin1String("grouped");
+    case Mode_Table:        return QLatin1String("table");
     }
 }
 
+static const char *constPageProp="page";
+
 ItemView::ItemView(QWidget *p)
     : QWidget(p)
     , searchTimer(0)
@@ -473,8 +551,11 @@ ItemView::ItemView(QWidget *p)
     , currentLevel(0)
     , mode(Mode_SimpleTree)
     , groupedView(0)
+    , tableView(0)
     , spinner(0)
     , msgOverlay(0)
+    , performedSearch(false)
+    , searchResetLevel(0)
 {
     setupUi(this);
     backAction = new QAction(i18n("Go Back"), this);
@@ -495,6 +576,9 @@ ItemView::ItemView(QWidget *p)
     sep->setSeparator(true);
     listView->addAction(sep);
     Icon::init(backButton);
+    Icon::init(homeButton);
+    title->installEventFilter(this);
+    title->setAttribute(Qt::WA_Hover, true);
     treeView->setPageDefaults();
     // Some styles, eg Cleanlooks/Plastique require that we explicitly set mouse tracking on the treeview.
     treeView->setAttribute(Qt::WA_MouseTracking);
@@ -503,11 +587,12 @@ ItemView::ItemView(QWidget *p)
     TreeDelegate *td=new TreeDelegate(treeView);
     listView->setItemDelegate(ld);
     treeView->setItemDelegate(td);
-    listView->installEventFilter(new ViewEventHandler(ld, listView));
+    ViewEventHandler *listViewEventHandler=new ViewEventHandler(ld, listView);
+    listView->installEventFilter(listViewEventHandler);
     treeView->installEventFilter(new ViewEventHandler(td, treeView));
     connect(searchWidget, SIGNAL(returnPressed()), this, SLOT(delaySearchItems()));
     connect(searchWidget, SIGNAL(textChanged(const QString)), this, SLOT(delaySearchItems()));
-    connect(searchWidget, SIGNAL(active(bool)), this, SIGNAL(searchIsActive(bool)));
+    connect(searchWidget, SIGNAL(active(bool)), this, SLOT(searchActive(bool)));
     connect(treeView, SIGNAL(itemsSelected(bool)), this, SIGNAL(itemsSelected(bool)));
     connect(treeView, SIGNAL(itemActivated(const QModelIndex &)), this, SLOT(itemActivated(const QModelIndex &)));
     connect(treeView, SIGNAL(doubleClicked(const QModelIndex &)), this, SIGNAL(doubleClicked(const QModelIndex &)));
@@ -518,6 +603,7 @@ ItemView::ItemView(QWidget *p)
     connect(listView, SIGNAL(clicked(const QModelIndex &)),  this, SLOT(itemClicked(const QModelIndex &)));
     connect(backAction, SIGNAL(triggered(bool)), this, SLOT(backActivated()));
     connect(homeAction, SIGNAL(triggered(bool)), this, SLOT(homeActivated()));
+    connect(listViewEventHandler, SIGNAL(escPressed()), this, SLOT(backActivated()));
     searchWidget->setVisible(false);
 }
 
@@ -529,12 +615,13 @@ void ItemView::allowGroupedView()
 {
     if (!groupedView) {
         groupedView=new GroupedView(stackedWidget);
+        stackedWidget->addWidget(groupedView);
+        groupedView->setProperty(constPageProp, stackedWidget->count()-1);
         // Some styles, eg Cleanlooks/Plastique require that we explicitly set mouse tracking on the treeview.
         groupedView->setAttribute(Qt::WA_MouseTracking, true);
         groupedView->installEventFilter(new ViewEventHandler(qobject_cast<ActionItemDelegate *>(groupedView->itemDelegate()), groupedView));
         groupedView->setAutoExpand(false);
         groupedView->setMultiLevel(true);
-        treeLayout->addWidget(groupedView);
         connect(groupedView, SIGNAL(itemsSelected(bool)), this, SIGNAL(itemsSelected(bool)));
         connect(groupedView, SIGNAL(itemActivated(const QModelIndex &)), this, SLOT(itemActivated(const QModelIndex &)));
         connect(groupedView, SIGNAL(doubleClicked(const QModelIndex &)), this, SIGNAL(doubleClicked(const QModelIndex &)));
@@ -542,6 +629,22 @@ void ItemView::allowGroupedView()
     }
 }
 
+void ItemView::allowTableView(TableView *v)
+{
+    if (!tableView) {
+        tableView=v;
+        tableView->setParent(stackedWidget);
+        stackedWidget->addWidget(tableView);
+        tableView->setProperty(constPageProp, stackedWidget->count()-1);
+        // Some styles, eg Cleanlooks/Plastique require that we explicitly set mouse tracking on the treeview.
+//        tableView->installEventFilter(new ViewEventHandler(0, tableView));
+        connect(tableView, SIGNAL(itemsSelected(bool)), this, SIGNAL(itemsSelected(bool)));
+        connect(tableView, SIGNAL(itemActivated(const QModelIndex &)), this, SLOT(itemActivated(const QModelIndex &)));
+        connect(tableView, SIGNAL(doubleClicked(const QModelIndex &)), this, SIGNAL(doubleClicked(const QModelIndex &)));
+        connect(tableView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(itemClicked(const QModelIndex &)));
+    }
+}
+
 void ItemView::addAction(QAction *act)
 {
     treeView->addAction(act);
@@ -549,11 +652,14 @@ void ItemView::addAction(QAction *act)
     if (groupedView) {
         groupedView->addAction(act);
     }
+    if (tableView) {
+        tableView->addAction(act);
+    }
 }
 
 void ItemView::setMode(Mode m)
 {
-    if (m<0 || m>Mode_GroupedTree || (Mode_GroupedTree==m && !groupedView)) {
+    if (m<0 || m>=Mode_Count || (Mode_GroupedTree==m && !groupedView) || (Mode_Table==m && !tableView)) {
         m=Mode_SimpleTree;
     }
 
@@ -568,34 +674,60 @@ void ItemView::setMode(Mode m)
 
     mode=m;
     searchWidget->setText(QString());
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
-        treeView->setModel(itemModel);
+    int stackIndex=0;
+    if (usingTreeView()) {
         listView->setModel(0);
         if (groupedView) {
-            groupedView->setHidden(true);
             groupedView->setModel(0);
         }
+        if (tableView) {
+            tableView->saveHeader();
+            tableView->setModel(0);
+        }
+        treeView->setModel(itemModel);
         treeView->setHidden(false);
-        ((TreeDelegate *)treeView->itemDelegate())->setSimple(Mode_SimpleTree==mode);
+        static_cast<TreeDelegate *>(treeView->itemDelegate())->setSimple(Mode_SimpleTree==mode || Mode_BasicTree==mode);
+        static_cast<TreeDelegate *>(treeView->itemDelegate())->setNoIcons(Mode_BasicTree==mode);
         itemModel->setRootIndex(QModelIndex());
         treeView->reset();
     } else if (Mode_GroupedTree==mode) {
         treeView->setModel(0);
         listView->setModel(0);
+        if (tableView) {
+            tableView->saveHeader();
+            tableView->setModel(0);
+        }
         groupedView->setHidden(false);
         treeView->setHidden(true);
         groupedView->setModel(itemModel);
         itemModel->setRootIndex(QModelIndex());
+        stackIndex=groupedView->property(constPageProp).toInt();
+    } else if (Mode_Table==mode) {
+        int w=view()->width();
+        treeView->setModel(0);
+        listView->setModel(0);
+        if (groupedView) {
+            groupedView->setModel(0);
+        }
+        tableView->setHidden(false);
+        treeView->setHidden(true);
+        tableView->setModel(itemModel);
+        tableView->initHeader();
+        itemModel->setRootIndex(QModelIndex());
+        tableView->resize(w, tableView->height());
+        stackIndex=tableView->property(constPageProp).toInt();
     } else {
+        stackIndex=1;
         treeView->setModel(0);
         if (groupedView) {
             groupedView->setModel(0);
         }
+        if (tableView) {
+            tableView->saveHeader();
+            tableView->setModel(0);
+        }
         listView->setModel(itemModel);
-        setLevel(0);
-        listView->setRootIndex(QModelIndex());
-        itemModel->setRootIndex(QModelIndex());
-        emit rootIndexSet(QModelIndex());
+        goToTop();
         if (Mode_IconTop!=mode) {
             listView->setGridSize(listGridSize);
             listView->setViewMode(QListView::ListMode);
@@ -605,15 +737,15 @@ void ItemView::setMode(Mode m)
         }
     }
 
-    stackedWidget->setCurrentIndex(Mode_SimpleTree==mode || Mode_DetailedTree==mode || Mode_GroupedTree==mode ? 0 : 1);
+    stackedWidget->setCurrentIndex(stackIndex);
     if (spinner) {
-        spinner->setWidget(view()->viewport());
+        spinner->setWidget(view());
         if (spinner->isActive()) {
             spinner->start();
         }
     }
     if (msgOverlay) {
-        msgOverlay->setWidget(view()->viewport());
+        msgOverlay->setWidget(view());
     }
 
     if (!oldBgndIcon.isNull()) {
@@ -623,14 +755,24 @@ void ItemView::setMode(Mode m)
 
 QModelIndexList ItemView::selectedIndexes(bool sorted) const
 {
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
+    if (usingTreeView()) {
         return treeView->selectedIndexes(sorted);
     } else if (Mode_GroupedTree==mode) {
         return groupedView->selectedIndexes(sorted);
+    } else if (Mode_Table==mode) {
+        return tableView->selectedIndexes(sorted);
     }
     return listView->selectedIndexes(sorted);
 }
 
+void ItemView::goToTop()
+{
+    setLevel(0);
+    itemModel->setRootIndex(QModelIndex());
+    listView->setRootIndex(QModelIndex());
+    emit rootIndexSet(QModelIndex());
+}
+
 void ItemView::setLevel(int l, bool haveChildren)
 {
     int prev=currentLevel;
@@ -648,7 +790,7 @@ void ItemView::setLevel(int l, bool haveChildren)
 //                listView->setAlternatingRowColors(false);
                 listView->setWordWrap(true);
                 listView->setDragDropMode(QAbstractItemView::DragOnly);
-                ((ActionItemDelegate *)listView->itemDelegate())->setLargeIcons(iconGridSize.width()>(ActionItemDelegate::constLargeActionIconSize*6));
+                static_cast<ActionItemDelegate *>(listView->itemDelegate())->setLargeIcons(iconGridSize.width()>(ActionItemDelegate::constLargeActionIconSize*6));
             }
         } else if(QListView::ListMode!=listView->viewMode()) {
             listView->setGridSize(listGridSize);
@@ -657,7 +799,7 @@ void ItemView::setLevel(int l, bool haveChildren)
 //            listView->setAlternatingRowColors(true);
             listView->setWordWrap(false);
             listView->setDragDropMode(QAbstractItemView::DragOnly);
-            ((ActionItemDelegate *)listView->itemDelegate())->setLargeIcons(false);
+            static_cast<ActionItemDelegate *>(listView->itemDelegate())->setLargeIcons(false);
         }
     }
 
@@ -680,10 +822,12 @@ void ItemView::setLevel(int l, bool haveChildren)
 
 QAbstractItemView * ItemView::view() const
 {
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
+    if (usingTreeView()) {
         return treeView;
     } else if(Mode_GroupedTree==mode) {
         return groupedView;
+    } else if(Mode_Table==mode) {
+        return tableView;
     } else {
         return listView;
     }
@@ -705,6 +849,11 @@ QString ItemView::searchText() const
     return searchWidget->isVisible() ? searchWidget->text() : QString();
 }
 
+QString ItemView::searchCategory() const
+{
+    return searchWidget->category();
+}
+
 void ItemView::clearSearchText()
 {
     return searchWidget->setText(QString());
@@ -722,6 +871,9 @@ void ItemView::setAcceptDrops(bool v)
     if (groupedView) {
         groupedView->setAcceptDrops(v);
     }
+    if (tableView) {
+        tableView->setAcceptDrops(v);
+    }
 }
 
 void ItemView::setDragDropOverwriteMode(bool v)
@@ -731,6 +883,9 @@ void ItemView::setDragDropOverwriteMode(bool v)
     if (groupedView) {
         groupedView->setDragDropOverwriteMode(v);
     }
+    if (tableView) {
+        tableView->setDragDropOverwriteMode(v);
+    }
 }
 
 void ItemView::setDragDropMode(QAbstractItemView::DragDropMode v)
@@ -740,6 +895,9 @@ void ItemView::setDragDropMode(QAbstractItemView::DragDropMode v)
     if (groupedView) {
         groupedView->setDragDropMode(v);
     }
+    if (tableView) {
+        tableView->setDragDropMode(v);
+    }
 }
 
 void ItemView::setGridSize(const QSize &sz)
@@ -747,19 +905,13 @@ void ItemView::setGridSize(const QSize &sz)
     iconGridSize=sz;
     if (Mode_IconTop==mode && 0==currentLevel) {
         listView->setGridSize(listGridSize);
-        ((ActionItemDelegate *)listView->itemDelegate())->setLargeIcons(iconGridSize.width()>(ActionItemDelegate::constLargeActionIconSize*6));
+        static_cast<ActionItemDelegate *>(listView->itemDelegate())->setLargeIcons(iconGridSize.width()>(ActionItemDelegate::constLargeActionIconSize*6));
     }
 }
 
 void ItemView::update()
 {
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
-        treeView->update();
-    } else if (Mode_GroupedTree==mode) {
-        groupedView->update();
-    } else {
-        listView->update();
-    }
+    view()->update();
 }
 
 void ItemView::setDeleteAction(QAction *act)
@@ -769,27 +921,22 @@ void ItemView::setDeleteAction(QAction *act)
     if (groupedView) {
         groupedView->installEventFilter(new DeleteKeyEventHandler(groupedView, act));
     }
+    if (tableView) {
+        tableView->installEventFilter(new DeleteKeyEventHandler(tableView, act));
+    }
 }
 
 void ItemView::showIndex(const QModelIndex &idx, bool scrollTo)
 {
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
-        QModelIndex i=idx;
-        while (i.isValid()) {
-            treeView->setExpanded(i, true);
-            i=i.parent();
-        }
-        if (scrollTo) {
-            treeView->scrollTo(idx, QAbstractItemView::PositionAtTop);
-        }
-    } else if (Mode_GroupedTree==mode) {
+    if (usingTreeView() || Mode_GroupedTree==mode || Mode_Table==mode) {
+        TreeView *v=static_cast<TreeView *>(view());
         QModelIndex i=idx;
         while (i.isValid()) {
-            groupedView->setExpanded(i, true);
+            v->setExpanded(i, true);
             i=i.parent();
         }
         if (scrollTo) {
-            groupedView->scrollTo(idx, QAbstractItemView::PositionAtTop);
+            v->scrollTo(idx, QAbstractItemView::PositionAtTop);
         }
     } else {
         if (idx.parent().isValid()) {
@@ -822,6 +969,7 @@ void ItemView::showIndex(const QModelIndex &idx, bool scrollTo)
 
 void ItemView::focusSearch()
 {
+    performedSearch=false;
     searchWidget->activate();
 }
 
@@ -880,19 +1028,23 @@ void ItemView::updateRows(const QModelIndex &idx)
 
 void ItemView::expandAll(const QModelIndex &index)
 {
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
+    if (usingTreeView()) {
         treeView->expandAll(index);
     } else if (Mode_GroupedTree==mode && groupedView) {
         groupedView->expandAll(index);
+    } else if (Mode_Table==mode && tableView) {
+        tableView->expandAll(index);
     }
 }
 
 void ItemView::expand(const QModelIndex &index, bool singleOnly)
 {
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
+    if (usingTreeView()) {
         treeView->expand(index, singleOnly);
     } else if (Mode_GroupedTree==mode && groupedView) {
         groupedView->expand(index, singleOnly);
+    } else if (Mode_Table==mode && tableView) {
+        tableView->expand(index, singleOnly);
     }
 }
 
@@ -900,18 +1052,20 @@ void ItemView::showMessage(const QString &message, int timeout)
 {
     if (!msgOverlay) {
         msgOverlay=new MessageOverlay(this);
-        msgOverlay->setWidget(view()->viewport());
+        msgOverlay->setWidget(view());
     }
-    msgOverlay->setText(message, timeout, timeout<=0);
+    msgOverlay->setText(message, timeout, false);
 }
 
 void ItemView::setBackgroundImage(const QIcon &icon)
 {
     bgndIcon=icon;
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
+    if (usingTreeView()) {
         treeView->setBackgroundImage(bgndIcon);
     } else if (Mode_GroupedTree==mode && groupedView) {
         groupedView->setBackgroundImage(bgndIcon);
+    } else if (Mode_Table==mode && tableView) {
+        tableView->setBackgroundImage(bgndIcon);
     } else if (Mode_List==mode || Mode_IconTop==mode) {
         listView->setBackgroundImage(bgndIcon);
     }
@@ -919,22 +1073,79 @@ void ItemView::setBackgroundImage(const QIcon &icon)
 
 bool ItemView::isAnimated() const
 {
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
+    if (usingTreeView()) {
         return treeView->isAnimated();
     }
     if (Mode_GroupedTree==mode && groupedView) {
         return groupedView->isAnimated();
     }
+    if (Mode_Table==mode && tableView) {
+        return tableView->isAnimated();
+    }
     return false;
 }
 
 void ItemView::setAnimated(bool a)
 {
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
+    if (usingTreeView()) {
         treeView->setAnimated(a);
     } else if (Mode_GroupedTree==mode && groupedView) {
         groupedView->setAnimated(a);
+    } else if (Mode_Table==mode && tableView) {
+        tableView->setAnimated(a);
+    }
+}
+
+void ItemView::setPermanentSearch()
+{
+    searchWidget->setPermanent();
+}
+
+void ItemView::setSearchCategories(const QList<QPair<QString, QString> > &categories)
+{
+    searchWidget->setCategories(categories);
+}
+
+void ItemView::setSearchCategory(const QString &id)
+{
+    searchWidget->setCategory(id);
+}
+
+void ItemView::hideBackAction()
+{
+    backAction->setEnabled(false);
+    backAction->setVisible(false);
+}
+
+bool ItemView::eventFilter(QObject *o, QEvent *e)
+{
+    if (o==title) {
+        static const char * constPressesProperty="pressed";
+        switch (e->type()) {
+        case QEvent::MouseButtonPress:
+            if (Qt::NoModifier==static_cast<QMouseEvent *>(e)->modifiers() && Qt::LeftButton==static_cast<QMouseEvent *>(e)->button()) {
+                title->setProperty(constPressesProperty, true);
+            }
+            break;
+        case QEvent::MouseButtonRelease:
+            if (title->property(constPressesProperty).toBool()) {
+                backActivated();
+            }
+            title->setProperty(constPressesProperty, false);
+            break;
+        case QEvent::HoverEnter: {
+            QColor bgnd=palette().highlight().color();
+            title->setStyleSheet(QString("QLabel{background:rgb(%1,%2,%3,38);}")
+                                 .arg(bgnd.red()).arg(bgnd.green()).arg(bgnd.blue()));
+            break;
+        }
+        case QEvent::HoverLeave:
+            title->setStyleSheet(QString());
+        default:
+            break;
+        }
     }
+    return QWidget::eventFilter(o, e);
 }
 
 void ItemView::showSpinner(bool v)
@@ -943,7 +1154,7 @@ void ItemView::showSpinner(bool v)
         if (!spinner) {
             spinner=new Spinner(this);
         }
-        spinner->setWidget(view()->viewport());
+        spinner->setWidget(view());
         spinner->start();
     } else {
         hideSpinner();
@@ -966,7 +1177,7 @@ void ItemView::collectionRemoved(quint32 key)
 
 void ItemView::backActivated()
 {
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode || Mode_GroupedTree==mode || 0==currentLevel) {
+    if (!usingListView() || 0==currentLevel || !isVisible()) {
         return;
     }
     setLevel(currentLevel-1);
@@ -986,7 +1197,7 @@ void ItemView::backActivated()
 
 void ItemView::homeActivated()
 {
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode || Mode_GroupedTree==mode || 0==currentLevel) {
+    if (!usingListView() || 0==currentLevel || !isVisible()) {
         return;
     }
     setLevel(0);
@@ -997,7 +1208,7 @@ void ItemView::homeActivated()
 
 void ItemView::setExpanded(const QModelIndex &idx, bool exp)
 {
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
+    if (usingTreeView()) {
         treeView->setExpanded(idx, exp);
     }
 }
@@ -1035,12 +1246,16 @@ void ItemView::activateItem(const QModelIndex &index, bool emitRootSet)
         return;
     }
 
-    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
+    if (usingTreeView()) {
         treeView->setExpanded(index, !treeView->isExpanded(index));
     } else if (Mode_GroupedTree==mode) {
         if (!index.parent().isValid()) {
             groupedView->setExpanded(index, !groupedView->TreeView::isExpanded(index));
         }
+    } else if (Mode_Table==mode) {
+        if (!index.parent().isValid()) {
+            tableView->setExpanded(index, !tableView->TreeView::isExpanded(index));
+        }
     } else if (index.isValid() && index.child(0, 0).isValid() && index!=listView->rootIndex()) {
         prevTopIndex=listView->indexAt(QPoint(8, 8));
         if (qobject_cast<QSortFilterProxyModel *>(listView->model())) {
@@ -1051,7 +1266,9 @@ void ItemView::activateItem(const QModelIndex &index, bool emitRootSet)
         if (text.isEmpty()) {
             text=index.data(Qt::DisplayRole).toString();
         }
-        title->setText(text);
+        // Add padding so that text is not right on border of label widget.
+        // This spacing makes the mouse-over background change look nicer.
+        title->setText(QLatin1String("  ")+text);
         listView->setRootIndex(index);
         itemModel->setRootIndex(index);
         if (emitRootSet) {
@@ -1067,13 +1284,42 @@ void ItemView::delaySearchItems()
         if (searchTimer) {
             searchTimer->stop();
         }
+        if (performedSearch) {
+            collapseToLevel();
+            performedSearch=false;
+        }
         emit searchItems();
     } else {
         if (!searchTimer) {
             searchTimer=new QTimer(this);
             searchTimer->setSingleShot(true);
-            connect(searchTimer, SIGNAL(timeout()), SIGNAL(searchItems()));
+            connect(searchTimer, SIGNAL(timeout()), this, SLOT(doSearch()));
         }
         searchTimer->start(500);
     }
 }
+
+void ItemView::doSearch()
+{
+    performedSearch=true;
+    emit searchItems();
+}
+
+void ItemView::searchActive(bool a)
+{
+    emit searchIsActive(a);
+    if (!a && performedSearch) {
+        collapseToLevel();
+        performedSearch=false;
+    }
+    if (!a && view()->isVisible()) {
+        view()->setFocus();
+    }
+}
+
+void ItemView::collapseToLevel()
+{
+    if (usingTreeView() || Mode_GroupedTree==mode || Mode_Table==mode) {
+        static_cast<TreeView *>(view())->collapseToLevel(searchResetLevel, searchIndex);
+    }
+}
diff --git a/widgets/itemview.h b/widgets/itemview.h
index 16887a8..677f3fb 100644
--- a/widgets/itemview.h
+++ b/widgets/itemview.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -25,7 +25,10 @@
 #define ITEMVIEW_H
 
 #include "ui_itemview.h"
+#include "treeview.h"
 #include <QMap>
+#include <QList>
+#include <QPair>
 
 class ProxyModel;
 class Spinner;
@@ -34,18 +37,25 @@ class QTimer;
 class GroupedView;
 class ActionItemDelegate;
 class MessageOverlay;
+class Icon;
+class TableView;
 
 class ViewEventHandler : public QObject
 {
+    Q_OBJECT
 public:
     ViewEventHandler(ActionItemDelegate *d, QAbstractItemView *v);
 
+Q_SIGNALS:
+    void escPressed();
+
 protected:
     bool eventFilter(QObject *obj, QEvent *event);
 
 protected:
     ActionItemDelegate *delegate;
     QAbstractItemView *view;
+    bool interceptBackspace;
 };
 
 class ListViewEventHandler : public ViewEventHandler
@@ -68,17 +78,22 @@ public:
     enum Mode
     {
         Mode_SimpleTree,
+        Mode_BasicTree,
         Mode_DetailedTree,
+
+        Mode_GroupedTree,
+
+        Mode_Table,
+
         Mode_List,
         Mode_IconTop,
-        Mode_GroupedTree,
 
         Mode_Count
     };
 
     enum Role
     {
-        Role_ImageSize = Qt::UserRole+256,
+        Role_ImageSize = Qt::UserRole+100,
         Role_MainText,
         Role_SubText,
         Role_TitleText,
@@ -97,10 +112,10 @@ public:
     virtual ~ItemView();
 
     void allowGroupedView();
+    void allowTableView(TableView *v);
     void addAction(QAction *act);
     void setMode(Mode m);
     Mode viewMode() const { return mode; }
-    void setLevel(int level, bool haveChildren=true);
     QAbstractItemView * view() const;
     void setModel(ProxyModel *m);
     void clearSelection() { view()->selectionModel()->clearSelection(); }
@@ -108,6 +123,7 @@ public:
     void select(const QModelIndex &idx);
     QModelIndexList selectedIndexes(bool sorted=true) const;
     QString searchText() const;
+    QString searchCategory() const;
     void clearSearchText();
     void setUniformRowHeights(bool v);
     void setAcceptDrops(bool v);
@@ -130,6 +146,19 @@ public:
     void setBackgroundImage(const QIcon &icon);
     bool isAnimated() const;
     void setAnimated(bool a);
+    void setPermanentSearch();
+    void setSearchCategories(const QList<QPair<QString, QString> > &categories);
+    void setSearchCategory(const QString &id);
+    void setSearchResetLevel(int l) { searchResetLevel=l; }
+    void setSearchIndex(const QModelIndex &idx) { searchIndex=idx; }
+    void hideBackAction();
+    void goToTop();
+
+private:
+    void setLevel(int level, bool haveChildren=true);
+    bool usingTreeView() const { return mode<=Mode_DetailedTree; }
+    bool usingListView() const { return mode>=Mode_List; }
+    bool eventFilter(QObject *o, QEvent *e);
 
 public Q_SLOTS:
     void focusSearch();
@@ -155,9 +184,12 @@ private Q_SLOTS:
     void itemClicked(const QModelIndex &index);
     void itemActivated(const QModelIndex &index);
     void delaySearchItems();
+    void doSearch();
+    void searchActive(bool a);
     void activateItem(const QModelIndex &index, bool emitRootSet=true);
 
 private:
+    void collapseToLevel();
     QAction * getAction(const QModelIndex &index);
 
 private:
@@ -172,9 +204,13 @@ private:
     QSize iconGridSize;
     QSize listGridSize;
     GroupedView *groupedView;
+    TableView *tableView;
     Spinner *spinner;
     MessageOverlay *msgOverlay;
     QIcon bgndIcon;
+    bool performedSearch;
+    int searchResetLevel;
+    QModelIndex searchIndex;
 };
 
 #endif
diff --git a/widgets/itemview.ui b/widgets/itemview.ui
index 1036d55..8916f05 100644
--- a/widgets/itemview.ui
+++ b/widgets/itemview.ui
@@ -18,6 +18,9 @@
     <number>2</number>
    </property>
    <item>
+    <widget class="SearchWidget" name="searchWidget"/>
+   </item>
+   <item>
     <widget class="QStackedWidget" name="stackedWidget">
      <property name="currentIndex">
       <number>0</number>
@@ -56,9 +59,6 @@
      </widget>
     </widget>
    </item>
-   <item>
-    <widget class="SearchWidget" name="searchWidget"/>
-   </item>
   </layout>
  </widget>
  <customwidgets>
diff --git a/widgets/listview.cpp b/widgets/listview.cpp
index 63b9a5d..620321f 100644
--- a/widgets/listview.cpp
+++ b/widgets/listview.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -35,8 +35,8 @@
 #include <QPaintEvent>
 
 ListView::ListView(QWidget *parent)
-        : QListView(parent)
-        , menu(0)
+    : QListView(parent)
+    , menu(0)
 {
     setDragEnabled(true);
     setContextMenuPolicy(Qt::NoContextMenu);
@@ -45,6 +45,7 @@ ListView::ListView(QWidget *parent)
     setAlternatingRowColors(false);
     setUniformItemSizes(true);
     setAttribute(Qt::WA_MouseTracking);
+    setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
     connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), SLOT(showCustomContextMenu(const QPoint &)));
 }
 
@@ -73,37 +74,6 @@ bool ListView::haveUnSelectedItems() const
     return selectionModel() && selectionModel()->selectedIndexes().count()!=model()->rowCount();
 }
 
-void ListView::startDrag(Qt::DropActions supportedActions)
-{
-    QModelIndexList indexes = selectedIndexes();
-    if (indexes.count() > 0) {
-        QMimeData *data = model()->mimeData(indexes);
-        if (!data) {
-            return;
-        }
-        QDrag *drag = new QDrag(this);
-        drag->setMimeData(data);
-        QPixmap pix;
-
-        if (1==indexes.count()) {
-            QVariant var=model()->data(indexes.first(), ItemView::Role_Image);
-            QImage img=var.value<QImage>();
-            if (img.isNull()) {
-                pix=var.value<QPixmap>();
-            } else {
-                pix=QPixmap::fromImage(img);
-            }
-        }
-        int pixSize=Utils::isHighDpi() ? 64 : 32;
-        if (pix.isNull()) {
-            drag->setPixmap(Icons::self()->audioFileIcon.pixmap(pixSize, pixSize));
-        } else {
-            drag->setPixmap(pix.width()<pixSize ? pix : pix.scaled(QSize(pixSize, pixSize), Qt::KeepAspectRatio, Qt::SmoothTransformation));
-        }
-        drag->start(supportedActions);
-    }
-}
-
 void ListView::mouseReleaseEvent(QMouseEvent *event)
 {
     if (Qt::NoModifier==event->modifiers() && Qt::LeftButton==event->button()) {
diff --git a/widgets/listview.h b/widgets/listview.h
index 1ddfa63..8a1065d 100644
--- a/widgets/listview.h
+++ b/widgets/listview.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -26,6 +26,7 @@
 
 #include <QListView>
 #include <QPixmap>
+#include "treeview.h"
 
 class QIcon;
 
@@ -41,7 +42,7 @@ public:
     void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
     bool haveSelectedItems() const;
     bool haveUnSelectedItems() const;
-    void startDrag(Qt::DropActions supportedActions);
+    void startDrag(Qt::DropActions supportedActions) { TreeView::drag(supportedActions, this, selectedIndexes()); }
     void mouseReleaseEvent(QMouseEvent *event);
     QModelIndexList selectedIndexes() const { return selectedIndexes(false); }
     QModelIndexList selectedIndexes(bool sorted) const;
diff --git a/widgets/menubutton.cpp b/widgets/menubutton.cpp
index 1092865..6a7aadf 100644
--- a/widgets/menubutton.cpp
+++ b/widgets/menubutton.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/menubutton.h b/widgets/menubutton.h
index e2f0d27..a9f9ba1 100644
--- a/widgets/menubutton.h
+++ b/widgets/menubutton.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/messageoverlay.cpp b/widgets/messageoverlay.cpp
index 82ddc32..9140bf6 100644
--- a/widgets/messageoverlay.cpp
+++ b/widgets/messageoverlay.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -28,6 +28,7 @@
 #include <QPainter>
 #include <QPaintEvent>
 #include <QTimer>
+#include <QApplication>
 
 MessageOverlay::MessageOverlay(QObject *p)
     : QWidget(0)
@@ -109,7 +110,7 @@ void MessageOverlay::paintEvent(QPaintEvent *)
     int pad=r.height()/4;
     rf.adjust(pad, pad, cancelButton->isVisible() ? -((pad*2)+cancelButton->width()) : -pad, -pad);
 
-    QFont fnt(font());
+    QFont fnt(QApplication::font());
     fnt.setBold(true);
     QFontMetrics fm(fnt);
     col=palette().color(QPalette::WindowText);
diff --git a/widgets/messageoverlay.h b/widgets/messageoverlay.h
index c9a0f5c..146923a 100644
--- a/widgets/messageoverlay.h
+++ b/widgets/messageoverlay.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/playqueueview.cpp b/widgets/playqueueview.cpp
index 28491c6..2d5a550 100644
--- a/widgets/playqueueview.cpp
+++ b/widgets/playqueueview.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -31,35 +31,48 @@
 #include "localize.h"
 #include "spinner.h"
 #include "messageoverlay.h"
-#include <QHeaderView>
-#include <QMenu>
-#include <QAction>
+#include "basicitemdelegate.h"
 #include <QFile>
 #include <QPainter>
 #include <QApplication>
 #include <qglobal.h>
 
+// Exported by QtGui
+void qt_blurImage(QPainter *p, QImage &blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0);
+
+class PlayQueueTreeViewItemDelegate : public BasicItemDelegate
+{
+public:
+    PlayQueueTreeViewItemDelegate(QObject *p) : BasicItemDelegate(p) { }
+    virtual ~PlayQueueTreeViewItemDelegate() { }
+    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+    {
+        if (!index.isValid()) {
+            return;
+        }
+
+        QStyleOptionViewItemV4 v4((QStyleOptionViewItemV4 &)option);
+        if (QStyleOptionViewItemV4::Beginning==v4.viewItemPosition) {
+            v4.icon=index.data(PlayQueueView::Role_Decoration).value<QIcon>();
+            if (!v4.icon.isNull()) {
+                v4.features |= QStyleOptionViewItemV2::HasDecoration;
+                v4.decorationSize=v4.icon.actualSize(option.decorationSize, QIcon::Normal, QIcon::Off);
+            }
+        }
+
+        BasicItemDelegate::paint(painter, v4, index);
+    }
+};
+
 PlayQueueTreeView::PlayQueueTreeView(PlayQueueView *parent)
-    : TreeView(parent, true)
+    : TableView(QLatin1String("playQueue"), parent, true)
     , view(parent)
-    , menu(0)
 {
-    setContextMenuPolicy(Qt::CustomContextMenu);
-    setAcceptDrops(true);
-    setDragDropOverwriteMode(false);
-    setDragDropMode(QAbstractItemView::DragDrop);
-    setSelectionMode(QAbstractItemView::ExtendedSelection);
     setIndentation(0);
     setItemsExpandable(false);
     setExpandsOnDoubleClick(false);
-    setDropIndicatorShown(true);
     setRootIsDecorated(false);
-    setUniformRowHeights(true);
-    setUseSimpleDelegate();
-}
-
-PlayQueueTreeView::~PlayQueueTreeView()
-{
+    setItemDelegate(new PlayQueueTreeViewItemDelegate(this));
 }
 
 void PlayQueueTreeView::paintEvent(QPaintEvent *e)
@@ -84,130 +97,13 @@ void PlayQueueGroupedView::paintEvent(QPaintEvent *e)
     GroupedView::paintEvent(e);
 }
 
-static inline void setResizeMode(QHeaderView *hdr, int idx, QHeaderView::ResizeMode mode)
-{
-    #if QT_VERSION < 0x050000
-    hdr->setResizeMode(idx, mode);
-    #else
-    hdr->setSectionResizeMode(idx, mode);
-    #endif
-}
-
-static inline void setResizeMode(QHeaderView *hdr, QHeaderView::ResizeMode mode)
-{
-    #if QT_VERSION < 0x050000
-    hdr->setResizeMode(mode);
-    #else
-    hdr->setSectionResizeMode(mode);
-    #endif
-}
-
-void PlayQueueTreeView::initHeader()
-{
-    if (!model()) {
-        return;
-    }
-
-    QHeaderView *hdr=header();
-    if (!menu) {
-        QFont f(font());
-        f.setBold(true);
-        QFontMetrics fm(f);
-        setResizeMode(hdr, QHeaderView::Interactive);
-        hdr->setContextMenuPolicy(Qt::CustomContextMenu);
-        int statusSize=model()->data(QModelIndex(), Qt::SizeHintRole).toSize().width();
-        if (statusSize<20) {
-            statusSize=20;
-        }
-        hdr->resizeSection(PlayQueueModel::COL_STATUS, statusSize);
-        hdr->resizeSection(PlayQueueModel::COL_TRACK, fm.width("999"));
-        hdr->resizeSection(PlayQueueModel::COL_YEAR, fm.width("99999"));
-        setResizeMode(hdr, PlayQueueModel::COL_STATUS, QHeaderView::Fixed);
-        setResizeMode(hdr, PlayQueueModel::COL_TITLE, QHeaderView::Interactive);
-        setResizeMode(hdr, PlayQueueModel::COL_ARTIST, QHeaderView::Interactive);
-        setResizeMode(hdr, PlayQueueModel::COL_ALBUM, QHeaderView::Stretch);
-        setResizeMode(hdr, PlayQueueModel::COL_TRACK, QHeaderView::Fixed);
-        setResizeMode(hdr, PlayQueueModel::COL_LENGTH, QHeaderView::ResizeToContents);
-        setResizeMode(hdr, PlayQueueModel::COL_DISC, QHeaderView::ResizeToContents);
-        setResizeMode(hdr, PlayQueueModel::COL_PRIO, QHeaderView::ResizeToContents);
-        setResizeMode(hdr, PlayQueueModel::COL_YEAR, QHeaderView::Fixed);
-        hdr->setStretchLastSection(false);
-        connect(hdr, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showMenu()));
-    }
-
-    //Restore state
-    QByteArray state;
-
-    if (Settings::self()->version()>=CANTATA_MAKE_VERSION(0, 4, 0)) {
-        state=Settings::self()->playQueueHeaderState();
-    }
-
-    QList<int> hideAble;
-    hideAble << PlayQueueModel::COL_TRACK << PlayQueueModel::COL_ALBUM << PlayQueueModel::COL_LENGTH
-             << PlayQueueModel::COL_DISC << PlayQueueModel::COL_YEAR << PlayQueueModel::COL_GENRE << PlayQueueModel::COL_PRIO;
-
-    //Restore
-    if (state.isEmpty()) {
-        hdr->setSectionHidden(PlayQueueModel::COL_YEAR, true);
-        hdr->setSectionHidden(PlayQueueModel::COL_DISC, true);
-        hdr->setSectionHidden(PlayQueueModel::COL_GENRE, true);
-        hdr->setSectionHidden(PlayQueueModel::COL_PRIO, true);
-    } else {
-        hdr->restoreState(state);
-
-        foreach (int col, hideAble) {
-            if (hdr->isSectionHidden(col) || 0==hdr->sectionSize(col)) {
-                hdr->setSectionHidden(col, true);
-            }
-        }
-    }
-
-    if (!menu) {
-        menu = new QMenu(this);
-
-        foreach (int col, hideAble) {
-            QString text=PlayQueueModel::COL_TRACK==col
-                            ? i18n("Track")
-                            : PlayQueueModel::headerText(col);
-            QAction *act=new QAction(text, menu);
-            act->setCheckable(true);
-            act->setChecked(!hdr->isSectionHidden(col));
-            menu->addAction(act);
-            act->setData(col);
-            connect(act, SIGNAL(toggled(bool)), this, SLOT(toggleHeaderItem(bool)));
-        }
-    }
-}
-
-void PlayQueueTreeView::saveHeader()
-{
-    if (menu && model()) {
-        Settings::self()->savePlayQueueHeaderState(header()->saveState());
-    }
-}
-
-void PlayQueueTreeView::showMenu()
-{
-    menu->exec(QCursor::pos());
-}
-
-void PlayQueueTreeView::toggleHeaderItem(bool visible)
-{
-    QAction *act=qobject_cast<QAction *>(sender());
-
-    if (act) {
-        int index=act->data().toInt();
-        if (-1!=index) {
-            header()->setSectionHidden(index, !visible);
-        }
-    }
-}
-
 PlayQueueView::PlayQueueView(QWidget *parent)
     : QStackedWidget(parent)
     , spinner(0)
     , msgOverlay(0)
-    , useCoverAsBgnd(false)
+    , backgroundImageType(BI_None)
+    , backgroundOpacity(15)
+    , backgroundBlur(0)
 {
     groupedView=new PlayQueueGroupedView(this);
     groupedView->setIndentation(0);
@@ -231,7 +127,47 @@ PlayQueueView::~PlayQueueView()
 {
 }
 
-void PlayQueueView::saveHeader()
+bool PlayQueueView::readConfig()
+{
+    int origOpacity=backgroundOpacity;
+    int origBlur=backgroundBlur;
+    QString origCustomBackgroundFile=customBackgroundFile;
+    BackgroundImage origType=backgroundImageType;
+    setAutoExpand(Settings::self()->playQueueAutoExpand());
+    setStartClosed(Settings::self()->playQueueStartClosed());
+    backgroundImageType=(BackgroundImage)Settings::self()->playQueueBackground();
+    backgroundOpacity=Settings::self()->playQueueBackgroundOpacity();
+    backgroundBlur=Settings::self()->playQueueBackgroundBlur();
+    customBackgroundFile=Settings::self()->playQueueBackgroundFile();
+    setGrouped(Settings::self()->playQueueGrouped());
+    switch (backgroundImageType) {
+    case BI_None:
+        if (origType!=backgroundImageType) {
+            updatePalette();
+            previousBackground=QPixmap();
+            curentCover=QImage();
+            curentBackground=QPixmap();
+            view()->viewport()->update();
+        }
+        break;
+    case BI_Cover:
+        if (BI_None==origType) {
+            updatePalette();
+        }
+        return origType!=backgroundImageType || backgroundOpacity!=origOpacity || backgroundBlur!=origBlur;
+   case BI_Custom:
+        if (BI_None==origType) {
+            updatePalette();
+        }
+        if (origType!=backgroundImageType || backgroundOpacity!=origOpacity || backgroundBlur!=origBlur || origCustomBackgroundFile!=customBackgroundFile) {
+            setImage(QImage(customBackgroundFile));
+        }
+        break;
+    }
+    return false;
+}
+
+void PlayQueueView::saveConfig()
 {
     if (treeView==currentWidget()) {
         treeView->saveHeader();
@@ -255,13 +191,13 @@ void PlayQueueView::setGrouped(bool g)
         grouped=g;
         setCurrentWidget(grouped ? static_cast<QWidget *>(groupedView) : static_cast<QWidget *>(treeView));
         if (spinner) {
-            spinner->setWidget(view()->viewport());
+            spinner->setWidget(view());
             if (spinner->isActive()) {
                 spinner->start();
             }
         }
         if (msgOverlay) {
-            msgOverlay->setWidget(view()->viewport());
+            msgOverlay->setWidget(view());
         }
     }
 }
@@ -302,13 +238,12 @@ void PlayQueueView::updateRows(qint32 row, quint16 curAlbum, bool scroll)
 
 void PlayQueueView::scrollTo(const QModelIndex &index, QAbstractItemView::ScrollHint hint)
 {
-    if (isGrouped() && !groupedView->isFilterActive()) {
-        return;
-    }
-    if (MPDState_Playing==MPDStatus::self()->state()) {
-//         groupedView->scrollTo(index, hint);
-        treeView->scrollTo(index, hint);
-    }
+    view()->scrollTo(index, hint);
+}
+
+QModelIndex PlayQueueView::indexAt(const QPoint &point)
+{
+    return view()->indexAt(point);
 }
 
 void PlayQueueView::addAction(QAction *a)
@@ -353,11 +288,6 @@ void PlayQueueView::clearSelection()
     }
 }
 
-QHeaderView * PlayQueueView::header()
-{
-    return treeView->header();
-}
-
 QAbstractItemView * PlayQueueView::tree() const
 {
     return treeView;
@@ -403,7 +333,7 @@ void PlayQueueView::showSpinner()
     if (!spinner) {
         spinner=new Spinner(this);
     }
-    spinner->setWidget(view()->viewport());
+    spinner->setWidget(view());
     spinner->start();
 }
 
@@ -425,27 +355,11 @@ void PlayQueueView::setFade(float value)
     }
 }
 
-void PlayQueueView::setUseCoverAsBackgrond(bool u)
-{
-    if (u==useCoverAsBgnd) {
-        return;
-    }
-    useCoverAsBgnd=u;
-    updatePalette();
-
-    if (!u) {
-        previousBackground=QPixmap();
-        curentCover=QImage();
-        curentBackground=QPixmap();
-        view()->viewport()->update();
-    }
-}
-
 void PlayQueueView::updatePalette()
 {
     QPalette pal=palette();
 
-    if (useCoverAsBgnd) {
+    if (BI_None!=backgroundImageType) {
         pal.setColor(QPalette::Base, Qt::transparent);
     }
 
@@ -457,11 +371,29 @@ void PlayQueueView::updatePalette()
 
 void PlayQueueView::setImage(const QImage &img)
 {
-    if (!useCoverAsBgnd) {
+    if (BI_None==backgroundImageType || (sender() && BI_Custom==backgroundImageType)) {
         return;
     }
     previousBackground=curentBackground;
-    curentCover=img.isNull() ? QImage() : TreeView::setOpacity(img);
+    if (img.isNull() || QImage::Format_ARGB32==img.format()) {
+        curentCover = img;
+    } else {
+        curentCover = img.convertToFormat(QImage::Format_ARGB32);
+    }
+    if (!curentCover.isNull()) {
+        if (backgroundOpacity<100) {
+            curentCover=TreeView::setOpacity(curentCover, (backgroundOpacity*1.0)/100.0);
+        }
+        if (backgroundBlur>0) {
+            QImage blurred(curentCover.size(), QImage::Format_ARGB32_Premultiplied);
+            blurred.fill(Qt::transparent);
+            QPainter painter(&blurred);
+            qt_blurImage(&painter, curentCover, backgroundBlur, true, false);
+            painter.end();
+            curentCover = blurred;
+        }
+    }
+
     curentBackground=QPixmap();
     animator.stop();
     if (isVisible()) {
@@ -476,7 +408,7 @@ void PlayQueueView::streamFetchStatus(const QString &msg)
 {
     if (!msgOverlay) {
         msgOverlay=new MessageOverlay(this);
-        msgOverlay->setWidget(view()->viewport());
+        msgOverlay->setWidget(view());
         connect(msgOverlay, SIGNAL(cancel()), SIGNAL(cancelStreamFetch()));
         connect(msgOverlay, SIGNAL(cancel()), SLOT(hideSpinner()));
     }
@@ -485,7 +417,7 @@ void PlayQueueView::streamFetchStatus(const QString &msg)
 
 void PlayQueueView::drawBackdrop(QWidget *widget, const QSize &size)
 {
-    if (!useCoverAsBgnd) {
+    if (BI_None==backgroundImageType) {
         return;
     }
 
diff --git a/widgets/playqueueview.h b/widgets/playqueueview.h
index 6c04203..a77bf7c 100644
--- a/widgets/playqueueview.h
+++ b/widgets/playqueueview.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -30,39 +30,27 @@
 #include <QPixmap>
 #include <QImage>
 #include <QPropertyAnimation>
-#include "treeview.h"
+#include "tableview.h"
 #include "groupedview.h"
 #include "song.h"
 
 class QAbstractItemModel;
 class QAction;
 class QItemSelectionModel;
-class QHeaderView;
 class QModelIndex;
 class QMenu;
 class Spinner;
 class PlayQueueView;
 class MessageOverlay;
 
-class PlayQueueTreeView : public TreeView
+class PlayQueueTreeView : public TableView
 {
-    Q_OBJECT
-
 public:
     PlayQueueTreeView(PlayQueueView *p);
-    virtual ~PlayQueueTreeView();
-
-    void initHeader();
-    void saveHeader();
-
-private Q_SLOTS:
-    void showMenu();
-    void toggleHeaderItem(bool visible);
+    virtual ~PlayQueueTreeView() { }
     void paintEvent(QPaintEvent *e);
-
 private:
     PlayQueueView *view;
-    QMenu *menu;
 };
 
 class PlayQueueGroupedView : public GroupedView
@@ -81,9 +69,22 @@ class PlayQueueView : public QStackedWidget
     Q_PROPERTY(float fade READ fade WRITE setFade)
 
 public:
+    enum BackgroundImage {
+        BI_None,
+        BI_Cover,
+        BI_Custom
+    };
+
+    enum Role {
+        Role_Decoration = Qt::UserRole+300
+    };
+
     PlayQueueView(QWidget *parent=0);
     virtual ~PlayQueueView();
 
+    // Returns true if background cover needs to be updated...
+    bool readConfig();
+    void saveConfig();
     void initHeader() { treeView->initHeader(); }
     void saveHeader();
     void setGrouped(bool g);
@@ -95,6 +96,7 @@ public:
     void setFilterActive(bool f);
     void updateRows(qint32 row, quint16 curAlbum, bool scroll);
     void scrollTo(const QModelIndex &index, QAbstractItemView::ScrollHint hint);
+    QModelIndex indexAt(const QPoint &point);
     void setModel(QAbstractItemModel *m) { view()->setModel(m); }
     void addAction(QAction *a);
     void setFocus();
@@ -105,7 +107,6 @@ public:
     bool haveUnSelectedItems();
     void setCurrentIndex(const QModelIndex &idx) { view()->setCurrentIndex(idx); }
     void clearSelection();
-    QHeaderView * header();
     QAbstractItemView * tree() const;
     QAbstractItemView * list() const;
     QAbstractItemView * view() const;
@@ -114,8 +115,6 @@ public:
     QList<Song> selectedSongs() const;
     float fade() { return fadeValue; }
     void setFade(float value);
-    void setUseCoverAsBackgrond(bool u);
-    bool useCoverAsBackground() const { return useCoverAsBgnd; }
     void updatePalette();
 
 public Q_SLOTS:
@@ -138,13 +137,16 @@ private:
     Spinner *spinner;
     MessageOverlay *msgOverlay;
 
-    bool useCoverAsBgnd;
+    BackgroundImage backgroundImageType;
     QPropertyAnimation animator;
     QImage curentCover;
     QPixmap curentBackground;
     QPixmap previousBackground;
     QSize lastBgndSize;
     double fadeValue;
+    int backgroundOpacity;
+    int backgroundBlur;
+    QString customBackgroundFile;
     friend class PlayQueueGroupedView;
     friend class PlayQueueTreeView;
 };
diff --git a/widgets/searchwidget.cpp b/widgets/searchwidget.cpp
index 877bed4..f3d250a 100644
--- a/widgets/searchwidget.cpp
+++ b/widgets/searchwidget.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -52,19 +52,20 @@ private:
 
 SearchWidget::SearchWidget(QWidget *p)
      : QWidget(p)
+     , cat(0)
      , widgetIsActive(false)
 {
     QGridLayout *l=new QGridLayout(this);
     l->setMargin(0);
-    l->setSpacing(1);
+    l->setSpacing(0);
     label=new SqueezedTextLabel(this);
     edit=new LineEdit(this);
     edit->setPlaceholderText(i18n("Search..."));
-    l->addWidget(label, 0, 0, 1, 2);
-    l->addWidget(edit, 1, 0);
+    l->addWidget(label, 0, 0, 1, 3);
+    l->addWidget(edit, 1, 1);
     closeButton=new ToolButton(this);
     closeButton->setToolTip(i18n("Close Search Bar")+QLatin1String(" (")+QKeySequence(Qt::Key_Escape).toString()+QLatin1Char(')'));
-    l->addWidget(closeButton, 1, 1);
+    l->addWidget(closeButton, 1, 2);
     Icon icon=Icon("dialog-close");
     if (icon.isNull()) {
         icon=Icon("window-close");
@@ -80,6 +81,7 @@ SearchWidget::SearchWidget(QWidget *p)
     QFont f(font());
     f.setBold(true);
     label->setFont(f);
+    setTabOrder(edit, closeButton);
 }
 
 void SearchWidget::setLabel(const QString &s)
@@ -88,6 +90,64 @@ void SearchWidget::setLabel(const QString &s)
     label->setVisible(!s.isEmpty());
 }
 
+void SearchWidget::setPermanent()
+{
+    show();
+    setFocus();
+    closeButton->setVisible(false);
+    closeButton->deleteLater();
+    closeButton=0;
+}
+
+void SearchWidget::setCategories(const QList<QPair<QString, QString> > &categories)
+{
+    QString currentCat;
+    if (!cat) {
+        cat=new ComboBox(this);
+        ((QGridLayout *)layout())->addWidget(cat, 1, 0);
+        connect(cat, SIGNAL(currentIndexChanged(int)), SIGNAL(returnPressed()));
+        setTabOrder(cat, edit);
+    } else {
+        currentCat=category();
+        if (!currentCat.isEmpty()) {
+            cat->blockSignals(true);
+        }
+    }
+
+    cat->clear();
+
+    QList<QPair<QString, QString> >::ConstIterator it=categories.constBegin();
+    QList<QPair<QString, QString> >::ConstIterator end=categories.constEnd();
+    for (; it!=end; ++it) {
+        cat->addItem((*it).first, (*it).second);
+    }
+
+    if (!currentCat.isEmpty()) {
+        for (int i=0; i<cat->count(); ++i) {
+            if (cat->itemData(i).toString()==currentCat) {
+                cat->setCurrentIndex(i);
+                cat->blockSignals(false);
+                return;
+            }
+        }
+        cat->blockSignals(false);
+        cat->setCurrentIndex(0);
+    }
+}
+
+void SearchWidget::setCategory(const QString &id)
+{
+    if (!cat || id.isEmpty()) {
+        return;
+    }
+    for (int i=0; i<cat->count(); ++i) {
+        if (cat->itemData(i).toString()==id) {
+            cat->setCurrentIndex(i);
+            return;
+        }
+    }
+}
+
 void SearchWidget::toggle()
 {
     if (isVisible()) {
diff --git a/widgets/searchwidget.h b/widgets/searchwidget.h
index 3467141..f4d04ea 100644
--- a/widgets/searchwidget.h
+++ b/widgets/searchwidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -27,7 +27,12 @@
 #include "lineedit.h"
 #include "toolbutton.h"
 #include "squeezedtextlabel.h"
+#include "combobox.h"
 #include <QSet>
+#include <QList>
+#include <QPair>
+
+class Icon;
 
 class SearchWidget : public QWidget
 {
@@ -39,9 +44,13 @@ public:
     void setLabel(const QString &s);
     void setText(const QString &t) { edit->setText(t); }
     QString text() const { return edit->text(); }
+    QString category() const { return cat ? cat->itemData(cat->currentIndex()).toString() : QString(); }
     void setFocus() { edit->setFocus(); }
-    bool hasFocus() const { return edit->hasFocus() || closeButton->hasFocus(); }
+    bool hasFocus() const { return edit->hasFocus() || (closeButton && closeButton->hasFocus()); }
     bool isActive() const { return widgetIsActive; }
+    void setPermanent();
+    void setCategories(const QList<QPair<QString, QString> > &categories);
+    void setCategory(const QString &id);
 
 Q_SIGNALS:
     void textChanged(const QString &);
@@ -57,6 +66,7 @@ public Q_SLOTS:
 
 private:
     SqueezedTextLabel *label;
+    ComboBox *cat;
     LineEdit *edit;
     ToolButton *closeButton;
     bool widgetIsActive;
diff --git a/widgets/servicestatuslabel.cpp b/widgets/servicestatuslabel.cpp
index 57b6f48..d785a88 100644
--- a/widgets/servicestatuslabel.cpp
+++ b/widgets/servicestatuslabel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/servicestatuslabel.h b/widgets/servicestatuslabel.h
index dfb811b..d9bc9f2 100644
--- a/widgets/servicestatuslabel.h
+++ b/widgets/servicestatuslabel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/sizegrip.cpp b/widgets/sizegrip.cpp
index f0528e3..742a3af 100644
--- a/widgets/sizegrip.cpp
+++ b/widgets/sizegrip.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/sizegrip.h b/widgets/sizegrip.h
index 42473a9..ee04ee2 100644
--- a/widgets/sizegrip.h
+++ b/widgets/sizegrip.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/sizewidget.cpp b/widgets/sizewidget.cpp
index c22be9a..9eec3d7 100644
--- a/widgets/sizewidget.cpp
+++ b/widgets/sizewidget.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/sizewidget.h b/widgets/sizewidget.h
index f2861d9..6f830a3 100644
--- a/widgets/sizewidget.h
+++ b/widgets/sizewidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/songdialog.cpp b/widgets/songdialog.cpp
index 9374b32..3d3cdc2 100644
--- a/widgets/songdialog.cpp
+++ b/widgets/songdialog.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -41,9 +41,10 @@ bool SongDialog::songsOk(const QList<Song> &songs, const QString &base, bool isM
     QWidget *wid=isVisible() ? this : parentWidget();
     int checked=0;
     foreach (const Song &s, songs) {
-        DBUG << "Checking dir:" << base << " song:" << s.file << " file:" << QString(base+s.file);
-        if (!QFile::exists(base+s.file)) {
-            DBUG << QString(base+s.file) << "does not exist";
+        QString file=s.filePath();
+        DBUG << "Checking dir:" << base << " song:" << file << " file:" << QString(base+file);
+        if (!QFile::exists(base+file)) {
+            DBUG << QString(base+file) << "does not exist";
             if (isMpd) {
                 MessageBox::error(wid, i18n("<p>Cannot access song files!<br/><br/>"
                                             "Please check Cantata's \"Music folder\" setting, and MPD's \"music_directory\" setting.</p>"));
diff --git a/widgets/songdialog.h b/widgets/songdialog.h
index fad577a..45ee445 100644
--- a/widgets/songdialog.h
+++ b/widgets/songdialog.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/spacerwidget.cpp b/widgets/spacerwidget.cpp
index ae2b9c0..d6d50c5 100644
--- a/widgets/spacerwidget.cpp
+++ b/widgets/spacerwidget.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/spacerwidget.h b/widgets/spacerwidget.h
index 13f3692..2b003fb 100644
--- a/widgets/spacerwidget.h
+++ b/widgets/spacerwidget.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/statelabel.h b/widgets/statelabel.h
index e4bd2d2..003dff3 100644
--- a/widgets/statelabel.h
+++ b/widgets/statelabel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/statuslabel.cpp b/widgets/statuslabel.cpp
index e1a87df..87e6e84 100644
--- a/widgets/statuslabel.cpp
+++ b/widgets/statuslabel.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/statuslabel.h b/widgets/statuslabel.h
index 2b53390..8dbab5f 100644
--- a/widgets/statuslabel.h
+++ b/widgets/statuslabel.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/stretchheaderview.cpp b/widgets/stretchheaderview.cpp
new file mode 100644
index 0000000..a029af7
--- /dev/null
+++ b/widgets/stretchheaderview.cpp
@@ -0,0 +1,313 @@
+/* This file is part of Clementine.
+   Copyright 2010, David Sansome <me at davidsansome.com>
+
+   Clementine is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   Clementine is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Clementine.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "stretchheaderview.h"
+//#include "core/logging.h"
+
+#include <QDataStream>
+
+#include <algorithm>
+#include <cmath>
+#include <numeric>
+
+const int StretchHeaderView::kMinimumColumnWidth = 10;
+const int StretchHeaderView::kMagicNumber = 0x502c950f;
+
+StretchHeaderView::StretchHeaderView(Qt::Orientation orientation, QWidget* parent)
+  : QHeaderView(orientation, parent),
+    stretch_enabled_(false),
+    in_mouse_move_event_(false)
+{
+  connect(this, SIGNAL(sectionResized(int,int,int)), SLOT(SectionResized(int,int,int)));
+}
+
+void StretchHeaderView::setModel(QAbstractItemModel* model) {
+  QHeaderView::setModel(model);
+
+  if (stretch_enabled_) {
+    column_widths_.resize(count());
+    std::fill(column_widths_.begin(), column_widths_.end(), 1.0 / count());
+  }
+}
+
+void StretchHeaderView::NormaliseWidths(const QList<int>& sections) {
+  if (!stretch_enabled_)
+    return;
+
+  const ColumnWidthType total_sum =
+      std::accumulate(column_widths_.begin(), column_widths_.end(), 0.0);
+  ColumnWidthType selected_sum = total_sum;
+
+  if (!sections.isEmpty()) {
+    selected_sum = 0.0;
+    for (int i=0 ; i<count() ; ++i)
+      if (sections.contains(i))
+        selected_sum += column_widths_[i];
+  }
+
+  if (total_sum != 0.0 && !qFuzzyCompare(total_sum, 1.0)) {
+    const ColumnWidthType mult = (selected_sum + (1.0 - total_sum)) / selected_sum;
+    for (int i=0 ; i<column_widths_.count() ; ++i) {
+      if (sections.isEmpty() || sections.contains(i))
+        column_widths_[i] *= mult;
+    }
+  }
+}
+
+void StretchHeaderView::UpdateWidths(const QList<int>& sections) {
+  if (!stretch_enabled_)
+    return;
+
+  ColumnWidthType total_w = 0.0;
+
+  for (int i=0 ; i<column_widths_.count() ; ++i) {
+    const ColumnWidthType w = column_widths_[i];
+    int pixels = w * width();
+
+    if (pixels != 0 && total_w - int(total_w) > 0.5)
+      pixels ++;
+
+    total_w += w;
+
+    if (!sections.isEmpty() && !sections.contains(i))
+      continue;
+
+    if (pixels == 0 && !isSectionHidden(i))
+      hideSection(i);
+    else if (pixels != 0 && isSectionHidden(i)) {
+      showSection(i);
+      AssertMinimalColumnWidth(i);
+    }
+
+    if (pixels != 0)
+      resizeSection(i, pixels);
+  }
+}
+
+void StretchHeaderView::HideSection(int logical) {
+  // Would this hide the last section?
+  bool all_hidden = true;
+  for (int i=0 ; i<count() ; ++i) {
+    if (i != logical && !isSectionHidden(i) && sectionSize(i) > 0) {
+      all_hidden = false;
+      break;
+    }
+  }
+  if (all_hidden) {
+    return;
+  }
+
+  if (!stretch_enabled_) {
+    hideSection(logical);
+    return;
+  }
+
+  column_widths_[logical] = 0.0;
+  NormaliseWidths();
+  UpdateWidths();
+}
+
+void StretchHeaderView::ShowSection(int logical) {
+  if (!stretch_enabled_) {
+    showSection(logical);
+    return;
+  }
+
+  // How many sections are visible already?
+  int visible_count = 0;
+  for (int i=0 ; i<count() ; ++i) {
+    if (!isSectionHidden(i))
+      visible_count ++;
+  }
+
+  column_widths_[logical] =
+      visible_count == 0 ? 1.0 : 1.0 / visible_count;
+  NormaliseWidths();
+  UpdateWidths();
+}
+
+void StretchHeaderView::SetSectionHidden(int logical, bool hidden) {
+  if(hidden) {
+    HideSection(logical);
+  } else {
+    ShowSection(logical);
+    AssertMinimalColumnWidth(logical);
+  }
+}
+
+void StretchHeaderView::resizeEvent(QResizeEvent* event) {
+  QHeaderView::resizeEvent(event);
+
+  if (!stretch_enabled_)
+    return;
+
+  UpdateWidths();
+}
+
+void StretchHeaderView::mouseMoveEvent(QMouseEvent* e) {
+  in_mouse_move_event_ = true;
+  QHeaderView::mouseMoveEvent(e);
+  in_mouse_move_event_ = false;
+}
+
+void StretchHeaderView::SectionResized(int logical, int, int new_size) {
+  if (!stretch_enabled_)
+    return;
+
+  if (in_mouse_move_event_) {
+    // Update this section's proportional width
+    column_widths_[logical] = ColumnWidthType(new_size) / width();
+
+    // Find the visible sections to the right of the section that's being resized
+    int visual = visualIndex(logical);
+    QList<int> logical_sections_to_resize;
+    for (int i=0 ; i<count() ; ++i) {
+      if (!isSectionHidden(i) && visualIndex(i) > visual)
+        logical_sections_to_resize << i;
+    }
+
+    // Resize just those columns
+    if (!logical_sections_to_resize.isEmpty()) {
+      in_mouse_move_event_ = false;
+      UpdateWidths(logical_sections_to_resize);
+      NormaliseWidths(logical_sections_to_resize);
+      in_mouse_move_event_ = true;
+    }
+  }
+}
+
+void StretchHeaderView::ToggleStretchEnabled() {
+  SetStretchEnabled(!is_stretch_enabled());
+}
+
+void StretchHeaderView::SetStretchEnabled(bool enabled) {
+  stretch_enabled_ = enabled;
+
+  if (enabled) {
+    // Initialise the list of widths from the current state of the widget
+    column_widths_.resize(count());
+    for (int i=0 ; i<count() ; ++i) {
+      column_widths_[i] = ColumnWidthType(sectionSize(i)) / width();
+    }
+
+    // Stretch the columns to fill the widget
+    NormaliseWidths();
+    UpdateWidths();
+  }
+
+  emit StretchEnabledChanged(enabled);
+}
+
+void StretchHeaderView::SetColumnWidth(int logical, ColumnWidthType width) {
+  if (!stretch_enabled_)
+    return;
+
+  column_widths_[logical] = width;
+
+  QList<int> other_columns;
+  for (int i=0 ; i<count() ; ++i)
+    if (!isSectionHidden(i) && i != logical)
+      other_columns << i;
+  NormaliseWidths(other_columns);
+}
+
+// makes sure the column will apear no matter what
+void StretchHeaderView::AssertMinimalColumnWidth(int logical) {
+  if (sectionSize(logical) < kMinimumColumnWidth) {
+    resizeSection(logical, kMinimumColumnWidth);
+  }
+}
+
+bool StretchHeaderView::RestoreState(const QByteArray& data) {
+  QDataStream s(data);
+  s.setVersion(QDataStream::Qt_4_6);
+
+  int magic_number = 0;
+  s >> magic_number;
+
+  if (magic_number != kMagicNumber || s.atEnd()) {
+    return false;
+  }
+
+  QList<int> pixel_widths;
+  QList<int> visual_indices;
+  int sort_indicator_order = Qt::AscendingOrder;
+  int sort_indicator_section = 0;
+
+  s >> stretch_enabled_;
+  s >> pixel_widths;
+  s >> visual_indices;
+  s >> column_widths_;
+  s >> sort_indicator_order;
+  s >> sort_indicator_section;
+
+  setSortIndicator(sort_indicator_section, Qt::SortOrder(sort_indicator_order));
+
+  const int persisted_column_count =
+      qMin(qMin(visual_indices.count(), pixel_widths.count()), column_widths_.count());
+
+  // Set column visible state, visual indices and, if we're not in stretch mode,
+  // pixel widths.
+  for (int i=0 ; i<count() && i<persisted_column_count ; ++i) {
+    setSectionHidden(i, pixel_widths[i] <= kMinimumColumnWidth);
+    moveSection(visualIndex(visual_indices[i]), i);
+
+    if (!stretch_enabled_) {
+      resizeSection(i, pixel_widths[i]);
+    }
+  }
+  
+  // Have we added more columns since the last time?
+  while (column_widths_.count() < count()) {
+    column_widths_ << 0;
+  }
+
+  if (stretch_enabled_) {
+    // In stretch mode, we've already set the proportional column widths so apply
+    // them now.
+    UpdateWidths();
+  }
+
+  emit StretchEnabledChanged(stretch_enabled_);
+
+  return true;
+}
+
+QByteArray StretchHeaderView::SaveState() const {
+  QByteArray ret;
+  QDataStream s(&ret, QIODevice::WriteOnly);
+
+  QList<int> pixel_widths;
+  QList<int> visual_indices;
+
+  for (int i=0 ; i<count() ; ++i) {
+    pixel_widths << sectionSize(i);
+    visual_indices << logicalIndex(i);
+  }
+
+  s.setVersion(QDataStream::Qt_4_6);
+  s << kMagicNumber;
+
+  s << stretch_enabled_;
+  s << pixel_widths;
+  s << visual_indices;
+  s << column_widths_;
+  s << int(sortIndicatorOrder());
+  s << sortIndicatorSection();
+
+  return ret;
+}
diff --git a/widgets/stretchheaderview.h b/widgets/stretchheaderview.h
new file mode 100644
index 0000000..e4e3ab9
--- /dev/null
+++ b/widgets/stretchheaderview.h
@@ -0,0 +1,96 @@
+/* This file is part of Clementine.
+   Copyright 2010, David Sansome <me at davidsansome.com>
+
+   Clementine is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   Clementine is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Clementine.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef STRETCHHEADERVIEW_H
+#define STRETCHHEADERVIEW_H
+
+#include <QHeaderView>
+
+class StretchHeaderView : public QHeaderView {
+  Q_OBJECT
+
+public:
+  StretchHeaderView(Qt::Orientation orientation, QWidget* parent = 0);
+
+  typedef double ColumnWidthType;
+
+  static const int kMinimumColumnWidth;
+  static const int kMagicNumber;
+
+  void setModel(QAbstractItemModel* model);
+
+  // Serialises the proportional and actual column widths.  Use these instead
+  // of QHeaderView::restoreState and QHeaderView::saveState to persist the
+  // proportional values directly and avoid floating point errors over time.
+  bool RestoreState(const QByteArray& data);
+  QByteArray SaveState() const;
+
+  // Hides a section and resizes all other sections to fill the gap.  Does
+  // nothing if you try to hide the last section.
+  void HideSection(int logical);
+
+  // Shows a section and resizes all other sections to make room.
+  void ShowSection(int logical);
+
+  // Calls either HideSection or ShowSection.
+  void SetSectionHidden(int logical, bool hidden);
+
+  // Sets the width of the given column and resizes other columns appropriately.
+  // width is the proportion of the entire width from 0.0 to 1.0.
+  void SetColumnWidth(int logical, ColumnWidthType width);
+
+  bool is_stretch_enabled() const { return stretch_enabled_; }
+
+public slots:
+  // Changes the stretch mode.  Enabling stretch mode will initialise the
+  // proportional column widths from the current state of the header.
+  void ToggleStretchEnabled();
+  void SetStretchEnabled(bool enabled);
+
+signals:
+  // Emitted when the stretch mode is changed.
+  void StretchEnabledChanged(bool enabled);
+
+protected:
+  // QWidget
+  void mouseMoveEvent(QMouseEvent* e);
+  void resizeEvent(QResizeEvent* event);
+
+private:
+  // If the width of the given column is less than a sensible threshold, resize
+  // it to make it bigger.  Workaround for a QHeaderView oddity that means a
+  // column can be visible but with a width of 0.
+  void AssertMinimalColumnWidth(int logical);
+
+  // Scales column_widths_ values so the total is 1.0.
+  void NormaliseWidths(const QList<int>& sections = QList<int>());
+
+  // Resizes the actual columns to make them match the proportional values
+  // in column_widths_.
+  void UpdateWidths(const QList<int>& sections = QList<int>());
+
+private slots:
+  void SectionResized(int logical, int old_size, int new_size);
+
+private:
+  bool stretch_enabled_;
+  QVector<ColumnWidthType> column_widths_;
+
+  bool in_mouse_move_event_;
+};
+
+#endif // STRETCHHEADERVIEW_H
diff --git a/widgets/tableview.cpp b/widgets/tableview.cpp
new file mode 100644
index 0000000..17e25ff
--- /dev/null
+++ b/widgets/tableview.cpp
@@ -0,0 +1,131 @@
+/*
+ * Cantata
+ *
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
+ *
+ * ----
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "tableview.h"
+#include "stretchheaderview.h"
+#include "settings.h"
+#include "localize.h"
+#include <QMenu>
+#include <QAction>
+
+TableView::TableView(const QString &cfgName, QWidget *parent, bool menuAlwaysAllowed)
+    : TreeView(parent, menuAlwaysAllowed)
+    , menu(0)
+    , configName(cfgName)
+{
+    setContextMenuPolicy(Qt::CustomContextMenu);
+    setAcceptDrops(true);
+    setDragDropOverwriteMode(false);
+    setDragDropMode(QAbstractItemView::DragDrop);
+    setSelectionMode(QAbstractItemView::ExtendedSelection);
+    setDropIndicatorShown(true);
+    setUniformRowHeights(true);
+    setAttribute(Qt::WA_MouseTracking, true);
+    StretchHeaderView *hdr=new StretchHeaderView(Qt::Horizontal, this);
+    setHeader(hdr);
+    connect(hdr, SIGNAL(StretchEnabledChanged(bool)), SLOT(stretchToggled(bool)));
+}
+
+void TableView::initHeader()
+{
+    if (!model()) {
+        return;
+    }
+
+    StretchHeaderView *hdr=qobject_cast<StretchHeaderView *>(header());
+    QList<int> hideable;
+    if (!menu) {
+        hdr->SetStretchEnabled(true);
+        stretchToggled(true);
+        hdr->setContextMenuPolicy(Qt::CustomContextMenu);
+        for (int i=0; i<model()->columnCount(); ++i) {
+            hdr->SetColumnWidth(i, model()->headerData(i, Qt::Horizontal, Role_Width).toDouble());
+            if (model()->headerData(i, Qt::Horizontal, Role_Hideable).toBool()) {
+                hideable.append(i);
+            }
+        }
+        #if QT_VERSION >= 0x050000
+        hdr->setSectionsMovable(true);
+        #else
+        hdr->setMovable(true);
+        #endif
+        connect(hdr, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showMenu()));
+    }
+
+    //Restore state
+    QByteArray state=Settings::self()->headerState(configName);
+    if (state.isEmpty()) {
+        foreach (int i, hideable) {
+            hdr->HideSection(i);
+        }
+    } else {
+        hdr->RestoreState(state);
+    }
+
+    if (!menu) {
+        menu = new QMenu(this);
+        QAction *stretch=new QAction(i18n("Stretch Columns To Fit Window"), this);
+        stretch->setCheckable(true);
+        stretch->setChecked(hdr->is_stretch_enabled());
+        connect(stretch, SIGNAL(toggled(bool)), hdr, SLOT(SetStretchEnabled(bool)));
+        menu->addAction(stretch);
+        menu->addSeparator();
+        foreach (int col, hideable) {
+            QAction *act=new QAction(model()->headerData(col, Qt::Horizontal, Qt::DisplayRole).toString(), menu);
+            act->setCheckable(true);
+            act->setChecked(!hdr->isSectionHidden(col));
+            menu->addAction(act);
+            act->setData(col);
+            connect(act, SIGNAL(toggled(bool)), this, SLOT(toggleHeaderItem(bool)));
+        }
+    }
+}
+
+void TableView::saveHeader()
+{
+    if (menu && model()) {
+        Settings::self()->saveHeaderState(configName, qobject_cast<StretchHeaderView *>(header())->SaveState());
+    }
+}
+
+void TableView::showMenu()
+{
+    menu->exec(QCursor::pos());
+}
+
+void TableView::toggleHeaderItem(bool visible)
+{
+    QAction *act=qobject_cast<QAction *>(sender());
+
+    if (act) {
+        int index=act->data().toInt();
+        if (-1!=index) {
+            qobject_cast<StretchHeaderView *>(header())->SetSectionHidden(index, !visible);
+        }
+    }
+}
+
+void TableView::stretchToggled(bool e)
+{
+    setHorizontalScrollBarPolicy(e ? Qt::ScrollBarAlwaysOff : Qt::ScrollBarAsNeeded);
+}
diff --git a/widgets/actionlabel.h b/widgets/tableview.h
similarity index 61%
copy from widgets/actionlabel.h
copy to widgets/tableview.h
index af175f1..9c338c0 100644
--- a/widgets/actionlabel.h
+++ b/widgets/tableview.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -21,30 +21,34 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef __ACTION_LABEL_H__
-#define __ACTION_LABEL_H__
+#ifndef TABLEVIEW_H
+#define TABLEVIEW_H
 
-#include <QLabel>
+#include "treeview.h"
 
-class QTimer;
-class QLabel;
-
-class ActionLabel : public QLabel
+class TableView : public TreeView
 {
     Q_OBJECT
 
 public:
-    ActionLabel(QWidget *parent);
-    ~ActionLabel();
-    void startAnimation();
-    void stopAnimation();
+    enum Roles {
+        Role_Width = Qt::UserRole+400,
+        Role_Hideable
+    };
+
+    TableView(const QString &cfgName, QWidget *parent=0, bool menuAlwaysAllowed=false);
+    virtual ~TableView() { }
+    void initHeader();
+    void saveHeader();
 
 private Q_SLOTS:
-    void rotateIcon();
+    void showMenu();
+    void toggleHeaderItem(bool visible);
+    void stretchToggled(bool e);
 
 protected:
-    QTimer *timer;
-    int count;
+    QMenu *menu;
+    QString configName;
 };
 
 #endif
diff --git a/widgets/textbrowser.cpp b/widgets/textbrowser.cpp
index f61baff..a4514fc 100644
--- a/widgets/textbrowser.cpp
+++ b/widgets/textbrowser.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/textbrowser.h b/widgets/textbrowser.h
index 259bb97..f6ddd32 100644
--- a/widgets/textbrowser.h
+++ b/widgets/textbrowser.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/timeslider.cpp b/widgets/timeslider.cpp
index 9d91f9c..faeb13c 100644
--- a/widgets/timeslider.cpp
+++ b/widgets/timeslider.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -24,6 +24,7 @@
 #include "timeslider.h"
 #include "song.h"
 #include "settings.h"
+#include "mpdconnection.h"
 #include <QLabel>
 #include <QHBoxLayout>
 #include <QProxyStyle>
@@ -31,6 +32,7 @@
 #include <QApplication>
 #include <QMouseEvent>
 #include <QSlider>
+#include <QToolTip>
 
 class ProxyStyle : public QProxyStyle
 {
@@ -69,9 +71,8 @@ public:
         if (e!=visible) {
             visible=e;
             QLabel::setEnabled(e);
-            if (e) {
-                setStyleSheet(QString());
-            } else {
+            setStyleSheet(QString());
+            if (!e) {
                 QColor col=palette().text().color();
                 setStyleSheet(QString("QLabel { color : rgba(%1, %2, %3, %4); }").arg(col.red()).arg(col.green()).arg(col.blue()).arg(128));
             }
@@ -188,6 +189,7 @@ PosSlider::PosSlider(QWidget *p)
     setMinimumHeight(h);
     setMaximumHeight(h);
     updateStyleSheet();
+    setMouseTracking(true);
 }
 
 void PosSlider::showEvent(QShowEvent *e)
@@ -223,20 +225,18 @@ void PosSlider::updateStyleSheet()
     activeStyleSheet+=fillFormat.arg(lineWidth).arg(fillBorder.red()).arg(fillBorder.green()).arg(fillBorder.blue())
             .arg(fillTop.red()).arg(fillTop.green()).arg(fillTop.blue())
             .arg(fillBot.red()).arg(fillBot.green()).arg(fillBot.blue()).arg(lineWidth).arg(lineWidth*2);
-    setStyleSheet(inactiveStyleSheet);
+    setStyleSheet(isActive ? activeStyleSheet : inactiveStyleSheet);
 }
 
-bool PosSlider::event(QEvent *e)
+void PosSlider::mouseMoveEvent(QMouseEvent *e)
 {
-    if (QEvent::ToolTip==e->type() && maximum()!=minimum()) {
-        QHelpEvent *he = dynamic_cast<QHelpEvent *>(e);
-        if (he) {
-            qreal pc = (qreal)he->x()/(qreal)width();
-            setToolTip(Song::formattedTime(maximum()*pc));
-        }
+    if (maximum()!=minimum()) {
+        qreal pc = (qreal)e->pos().x()/(qreal)width();
+        QPoint pos(e->pos().x(), Utils::isHighDpi() ? -80 : -40);
+        QToolTip::showText(mapToGlobal(pos), Song::formattedTime(maximum()*pc), this, rect());
     }
 
-    return QSlider::event(e);
+    QSlider::mouseMoveEvent(e);
 }
 
 void PosSlider::wheelEvent(QWheelEvent *ev)
@@ -297,6 +297,8 @@ TimeSlider::TimeSlider(QWidget *p)
     : QWidget(p)
     , timer(0)
     , lastVal(0)
+    , pollCount(0)
+    , pollMpd(Settings::self()->mpdPoll())
 {
     slider=new PosSlider(this);
     timeTaken=new TimeTakenLabel(this, slider);
@@ -310,6 +312,9 @@ TimeSlider::TimeSlider(QWidget *p)
     connect(slider, SIGNAL(sliderReleased()), this, SLOT(released()));
     connect(slider, SIGNAL(positionSet()), this, SIGNAL(sliderReleased()));
     connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updateTimes()));
+    if (pollMpd>0) {
+        connect(this, SIGNAL(mpdPoll()), MPDConnection::self(), SLOT(getStatus()));
+    }
     setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
     clearTimes();
 }
@@ -324,6 +329,7 @@ void TimeSlider::startTimer()
     startTime.restart();
     lastVal=value();
     timer->start();
+    pollCount=0;
 }
 
 void TimeSlider::stopTimer()
@@ -331,6 +337,7 @@ void TimeSlider::stopTimer()
     if (timer) {
         timer->stop();
     }
+    pollCount=0;
 }
 
 void TimeSlider::setValue(int v)
@@ -387,6 +394,12 @@ void TimeSlider::updatePos()
 {
     int elapsed=(startTime.elapsed()/1000.0)+0.5;
     slider->setValue(lastVal+elapsed);
+    if (pollMpd>0) {
+        if (++pollCount>=pollMpd) {
+            pollCount=0;
+            emit mpdPoll();
+        }
+    }
 }
 
 void TimeSlider::pressed()
diff --git a/widgets/timeslider.h b/widgets/timeslider.h
index 37397d9..05505d0 100644
--- a/widgets/timeslider.h
+++ b/widgets/timeslider.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -41,7 +41,7 @@ public:
 
     void showEvent(QShowEvent *e);
     void updateStyleSheet();
-    bool event(QEvent *e);
+    void mouseMoveEvent(QMouseEvent *e);
     void wheelEvent(QWheelEvent *ev);
     void setRange(int min, int max);
 
@@ -69,10 +69,14 @@ public:
     void setOrientation(Qt::Orientation o);
     int value() const;
     void saveConfig();
+    void setEnabled(bool e) { slider->setEnabled(e); }
+    bool isEnabled() const { return slider->isEnabled(); }
 
 Q_SIGNALS:
     void sliderReleased();
 
+    void mpdPoll();
+
 private Q_SLOTS:
     void updateTimes();
     void updatePos();
@@ -86,6 +90,8 @@ private:
     QTimer *timer;
     QTime startTime;
     int lastVal;
+    int pollCount;
+    int pollMpd;
 };
 
 #endif
diff --git a/widgets/toolbar.h b/widgets/toolbar.h
deleted file mode 100644
index 393cd52..0000000
--- a/widgets/toolbar.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Cantata
- *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
- *
- * ----
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifndef TOOLBAR_H
-#define TOOLBAR_H
-
-#include <QWidget>
-
-class ToolBar : public QWidget
-{
-    Q_OBJECT
-public:
-    ToolBar(QWidget *parent = 0);
-    virtual ~ToolBar() { }
-
-    void paintEvent(QPaintEvent *);
-};
-
-#endif // TOOLBAR_H
diff --git a/widgets/toolbutton.cpp b/widgets/toolbutton.cpp
index 88e3ca9..a4230ee 100644
--- a/widgets/toolbutton.cpp
+++ b/widgets/toolbutton.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -24,6 +24,7 @@
 #include "toolbutton.h"
 #include "icon.h"
 #include "gtkstyle.h"
+#include "config.h"
 #include <QMenu>
 #include <QStylePainter>
 #include <QStyleOptionToolButton>
@@ -31,12 +32,18 @@
 
 ToolButton::ToolButton(QWidget *parent)
     : QToolButton(parent)
+    #ifdef USE_SYSTEM_MENU_ICON
+    , hideMenuIndicator(GtkStyle::isActive())
+    #else
+    , hideMenuIndicator(true)
+    #endif
 {
     Icon::init(this);
     setAutoRaise(true);
     #ifdef Q_OS_MAC
     setStyleSheet("QToolButton {border: 0}");
     #endif
+    setFocusPolicy(Qt::NoFocus);
 }
 
 void ToolButton::paintEvent(QPaintEvent *e)
@@ -46,13 +53,15 @@ void ToolButton::paintEvent(QPaintEvent *e)
     QStylePainter p(this);
     QStyleOptionToolButton opt;
     initStyleOption(&opt);
-    opt.features=QStyleOptionToolButton::None;
+    if (hideMenuIndicator) {
+        opt.features=QStyleOptionToolButton::None;
+    }
     if (opt.state&QStyle::State_MouseOver && this!=QApplication::widgetAt(QCursor::pos())) {
         opt.state&=~QStyle::State_MouseOver;
     }
     p.drawComplexControl(QStyle::CC_ToolButton, opt);
     #else
-    if (menu()) {
+    if (menu() && hideMenuIndicator) {
         QStylePainter p(this);
         QStyleOptionToolButton opt;
         initStyleOption(&opt);
@@ -66,6 +75,10 @@ void ToolButton::paintEvent(QPaintEvent *e)
 
 QSize ToolButton::sizeHint() const
 {
+    if (!hideMenuIndicator) {
+        return QToolButton::sizeHint();
+    }
+
     if (sh.isValid()) {
         return sh;
     }
diff --git a/widgets/toolbutton.h b/widgets/toolbutton.h
index cb24c07..a77e4ac 100644
--- a/widgets/toolbutton.h
+++ b/widgets/toolbutton.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -34,8 +34,10 @@ public:
     QSize sizeHint() const;
     void setMenu(QMenu *m);
     void paintEvent(QPaintEvent *e);
+    void setHideMenuIndicator(bool h) { hideMenuIndicator=h; }
 
 private:
+    bool hideMenuIndicator;
     mutable QSize sh;
 };
 
diff --git a/widgets/treeview.cpp b/widgets/treeview.cpp
index ecb58ab..7e0d2c4 100644
--- a/widgets/treeview.cpp
+++ b/widgets/treeview.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -89,8 +89,9 @@ bool TreeView::getForceSingleClick()
 }
 
 TreeView::TreeView(QWidget *parent, bool menuAlwaysAllowed)
-        : QTreeView(parent)
-        , alwaysAllowMenu(menuAlwaysAllowed)
+    : QTreeView(parent)
+    , forceSingleColumn(false)
+    , alwaysAllowMenu(menuAlwaysAllowed)
 {
     setDragEnabled(true);
     setContextMenuPolicy(Qt::NoContextMenu);
@@ -99,6 +100,7 @@ TreeView::TreeView(QWidget *parent, bool menuAlwaysAllowed)
     setAlternatingRowColors(false);
     setSelectionMode(QAbstractItemView::ExtendedSelection);
     setSelectionBehavior(QAbstractItemView::SelectRows);
+    setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
     // Treeview does not seem to need WA_MouseTracking set, even with QGtkStyle items still
     // highlight under mouse. And enabling WA_MouseTracking here seems to cause drag-n-drop
     // errors if an item is dragged onto playqueue whilst playqueue has a selected item!
@@ -121,6 +123,7 @@ void TreeView::setPageDefaults()
     setDragDropMode(QAbstractItemView::DragOnly);
     setSortingEnabled(true);
     setAnimated(true);
+    forceSingleColumn=true;
 }
 
 void TreeView::setExpandOnClick()
@@ -151,20 +154,19 @@ bool TreeView::haveUnSelectedItems() const
     return selectionModel() && selectionModel()->selectedIndexes().count()!=model()->rowCount();
 }
 
-void TreeView::startDrag(Qt::DropActions supportedActions)
+void TreeView::drag(Qt::DropActions supportedActions, QAbstractItemView *view, const QModelIndexList &items)
 {
-    QModelIndexList indexes = selectedIndexes();
-    if (indexes.count() > 0) {
-        QMimeData *data = model()->mimeData(indexes);
+    if (items.count() > 0) {
+        QMimeData *data = view->model()->mimeData(items);
         if (!data) {
             return;
         }
-        QDrag *drag = new QDrag(this);
+        QDrag *drag = new QDrag(view);
         drag->setMimeData(data);
         QPixmap pix;
 
-        if (1==indexes.count()) {
-            QVariant var=model()->data(indexes.first(), ItemView::Role_Image);
+        if (1==items.count()) {
+            QVariant var=view->model()->data(items.first(), ItemView::Role_Image);
             QImage img=var.value<QImage>();
             if (img.isNull()) {
                 pix=var.value<QPixmap>();
@@ -268,11 +270,25 @@ QModelIndexList TreeView::sortIndexes(const QModelIndexList &list)
     return sorted;
 }
 
-void TreeView::expandAll(const QModelIndex &idx)
+void TreeView::expandAll(const QModelIndex &idx, bool singleLevelOnly)
 {
     quint32 count=model()->rowCount(idx);
     for (quint32 i=0; i<count; ++i) {
-        expand(model()->index(i, 0, idx));
+        expand(model()->index(i, 0, idx), singleLevelOnly);
+    }
+}
+
+void TreeView::collapseToLevel(int level, const QModelIndex &idx)
+{
+    quint32 count=model()->rowCount(idx);
+    if (level) {
+        for (quint32 i=0; i<count; ++i) {
+            collapseToLevel(level-1, model()->index(i, 0, idx));
+        }
+    } else {
+        for (quint32 i=0; i<count; ++i) {
+            collapse(model()->index(i, 0, idx));
+        }
     }
 }
 
@@ -289,6 +305,19 @@ void TreeView::expand(const QModelIndex &idx, bool singleOnly)
     }
 }
 
+void TreeView::collapse(const QModelIndex &idx, bool singleOnly)
+{
+    if (idx.isValid()) {
+        setExpanded(idx, false);
+        if (!singleOnly) {
+            quint32 count=model()->rowCount(idx);
+            for (quint32 i=0; i<count; ++i) {
+                collapse(idx.child(i, 0));
+            }
+        }
+    }
+}
+
 bool TreeView::checkBoxClicked(const QModelIndex &idx) const
 {
     QRect rect = visualRect(idx);
@@ -330,6 +359,16 @@ void TreeView::setModel(QAbstractItemModel *m)
     QAbstractItemModel *old=model();
     QTreeView::setModel(m);
 
+    if (forceSingleColumn && m) {
+        int columnCount=m->columnCount();
+        if (columnCount>1) {
+            QHeaderView *hdr=header();
+            for (int i=1; i<columnCount; ++i) {
+                hdr->setSectionHidden(i, true);
+            }
+        }
+    }
+
     if (old) {
         disconnect(old, SIGNAL(layoutChanged()), this, SLOT(correctSelection()));
     }
@@ -351,12 +390,12 @@ void TreeView::correctSelection()
     selectionModel()->select(s, QItemSelectionModel::SelectCurrent);
 }
 
-void TreeView::itemWasActivated(const QModelIndex &index)
-{
-    if (!forceSingleClick) {
-        setExpanded(index, !isExpanded(index));
-    }
-}
+//void TreeView::itemWasActivated(const QModelIndex &index)
+//{
+//    if (!forceSingleClick) {
+//        setExpanded(index, !isExpanded(index));
+//    }
+//}
 
 void TreeView::itemWasClicked(const QModelIndex &index)
 {
diff --git a/widgets/treeview.h b/widgets/treeview.h
index dbb4cfc..4993657 100644
--- a/widgets/treeview.h
+++ b/widgets/treeview.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -40,6 +40,7 @@ public:
     static void setForceSingleClick(bool v);
     static bool getForceSingleClick();
     static QModelIndexList sortIndexes(const QModelIndexList &list);
+    static void drag(Qt::DropActions supportedActions, QAbstractItemView *view, const QModelIndexList &items);
 
     TreeView(QWidget *parent=0, bool menuAlwaysAllowed=false);
     virtual ~TreeView();
@@ -49,21 +50,24 @@ public:
     void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
     bool haveSelectedItems() const;
     bool haveUnSelectedItems() const;
-    void startDrag(Qt::DropActions supportedActions);
+    void startDrag(Qt::DropActions supportedActions) { drag(supportedActions, this, selectedIndexes()); }
     void mouseReleaseEvent(QMouseEvent *event);
     QModelIndexList selectedIndexes() const { return selectedIndexes(true); }
     QModelIndexList selectedIndexes(bool sorted) const;
-    void expandAll(const QModelIndex &idx=QModelIndex());
+    void expandAll(const QModelIndex &idx=QModelIndex(), bool singleLevelOnly=false);
+    void collapseToLevel(int level, const QModelIndex &idx=QModelIndex());
     virtual void expand(const QModelIndex &idx, bool singleOnly=false);
+    virtual void collapse(const QModelIndex &idx, bool singleOnly=false);
     virtual void setModel(QAbstractItemModel *m);
     bool checkBoxClicked(const QModelIndex &idx) const;
     void setUseSimpleDelegate();
     void setBackgroundImage(const QIcon &icon);
     void paintEvent(QPaintEvent *e);
+    void setForceSingleColumn(bool f) { forceSingleColumn=f; }
 
 private Q_SLOTS:
     void correctSelection();
-    void itemWasActivated(const QModelIndex &index);
+//    void itemWasActivated(const QModelIndex &index);
     void itemWasClicked(const QModelIndex &index);
 
 Q_SIGNALS:
@@ -71,6 +75,7 @@ Q_SIGNALS:
     void itemActivated(const QModelIndex &index); // Only emitted if view is set to single-click
 
 private:
+    bool forceSingleColumn;
     bool alwaysAllowMenu;
     QPixmap bgnd;
 };
diff --git a/widgets/volumeslider.cpp b/widgets/volumeslider.cpp
index b3c9641..f948f08 100644
--- a/widgets/volumeslider.cpp
+++ b/widgets/volumeslider.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
@@ -69,7 +69,7 @@ static const int constHeightStep=2;
 static QColor clampColor(const QColor &col)
 {
     static const int constMin=64;
-    static const int constMax=196;
+    static const int constMax=240;
 
     if (col.value()<constMin) {
         return QColor(constMin, constMin, constMin);
@@ -102,7 +102,7 @@ VolumeSlider::VolumeSlider(QWidget *p)
     setStyle(new ProxyStyle());
     setStyleSheet(QString("QSlider::groove:horizontal {border: 0px;} "
                           "QSlider::sub-page:horizontal {border: 0px;} "
-                          "QSlider::handle:horizontal {width: 1px; height:%1px; margin:0;}").arg(h));
+                          "QSlider::handle:horizontal {width: 0px; height:0px; margin:0;}"));
     textCol=clampColor(palette().color(QPalette::Active, QPalette::Text));
     generatePixmaps();
 }
@@ -271,8 +271,6 @@ void VolumeSlider::updateMpdStatus()
 
     blockSignals(true);
     if (volume<0) {
-        setEnabled(false);
-        setToolTip(i18n("Volume Disabled"));
         setValue(0);
     } else {
         int unmuteVolume=-1;
@@ -286,6 +284,8 @@ void VolumeSlider::updateMpdStatus()
         setToolTip(unmuteVolume>0 ? i18n("Volume %1% (Muted)", volume) : i18n("Volume %1%", volume));
         setValue(volume);
     }
+    setVisible(volume>=0);
+    setEnabled(volume>=0);
     update();
     muteAction->setEnabled(isEnabled());
     StdActions::self()->increaseVolumeAction->setEnabled(isEnabled());
diff --git a/widgets/volumeslider.h b/widgets/volumeslider.h
index 3271da2..5f2be81 100644
--- a/widgets/volumeslider.h
+++ b/widgets/volumeslider.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/wizardpage.cpp b/widgets/wizardpage.cpp
index c390d24..e2b8097 100644
--- a/widgets/wizardpage.cpp
+++ b/widgets/wizardpage.cpp
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *
diff --git a/widgets/wizardpage.h b/widgets/wizardpage.h
index 360211b..b394de0 100644
--- a/widgets/wizardpage.h
+++ b/widgets/wizardpage.h
@@ -1,7 +1,7 @@
 /*
  * Cantata
  *
- * Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond at gmail.com>
+ * Copyright (c) 2011-2014 Craig Drummond <craig.p.drummond at gmail.com>
  *
  * ----
  *

-- 
cantata packaging



More information about the pkg-multimedia-commits mailing list